matlab计算macd_[原创]基于MATLAB的一个简单的交易策略(基于MACD)的Matlab代码-经管之家官网!...
%%此程序用来计算MACD指标并对其有效性进行回测检验
%%原始数据命名为stk_clpr,且第一列为收盘价,第二列为交易日期
%% 计算相关指标(这里也可编一个函数),第一天初始化:DIFF=DEA=MACD=0,EMAshort=EMAlong=第一天的收盘价
%虽然matlab有自带的函数macd(),它貌似只能计算默认长度的平滑移动平均,还是自己算理解更深刻
clpr=stk_clpr(:,1);%提取收盘价
date=stk_clpr(:,2);%提取日期
%定义计算长度
shortPeriod=12;%定义收盘价短期(快速)平滑移动平均计算长度
longPeriod=26;%定义收盘价长期(慢速)平滑移动平均计算长度
DEAPeriod=9;%定义diff线平滑移动平均计算长度
%建立占位矩阵,提高程序运行效率
EMAshort=zeros(length(clpr),1);
EMAlong=zeros(length(clpr),1);
DIFF=zeros(length(clpr),1);
DEA=zeros(length(clpr),1);
MACD=zeros(length(clpr),1);
%用循环语句计算各个指标(这里用向量不管用)
EMAshort(1)=clpr(1);%初始化EMAshort第一值
EMAlong(1)=clpr(1);%初始化EMAlong第一个值
DEA(1)=0;%初始化第一值
DIFF(1)=0;
MACD(1)=0;
for t=2:length(clpr);
%计算短期和长期EMA
EMAshort(t)=clpr(t)*(2/(shortPeriod+1))+EMAshort(t-1)*((shortPeriod-1)/(shortPeriod+1));
EMAlong(t)=clpr(t)*(2/(longPeriod+1))+EMAlong(t-1)*((longPeriod-1)/(longPeriod+1));
%计算DIFF
DIFF(t)=EMAshort(t)-EMAlong(t);
%计算DEA
DEA(t)=DIFF(t)*(2/(DEAPeriod+1))+DEA(t-1)*((DEAPeriod-1)/(DEAPeriod+1));
%计算MACD
MACD(t)=2*(DIFF(t)-DEA(t));
end
%画出行情序列图和各指标变化图
figure(1);
subplot(3,1,1);
plot(date,clpr,'r');
datetick('x','yyyymmdd');
xlabel('Date');
ylabel('Close Price');
title('Time Series of Stock');
grid on;
subplot(3,1,2);
plot(date,DIFF,'g',date,DEA,'b');
datetick('x','yyyymmdd');
legend('DIFF','DEA');
xlabel('Date');
ylabel('DIFF and DEA');
title('The DIFF and DEA of Stock');
grid on;
subplot(3,1,3);
plot(date,MACD,'r');
datetick('x','yyyymmdd');
xlabel('Date');
ylabel('MACD');
title('The MACD of Stock');
grid on;
%% 策略回测仿真
%%一个最简单的策略:1)DIFF向上突破MACD且连续三天处于MACD之上,则为买入信号;2)DIFF向下穿过MACD且连续三天处于MACD之下,则为卖出信号
%初始资金10000元
initial=10000;
%定义仓位:1表示多头,0表示空仓
pos=zeros(length(clpr),1);
%定义收益序列
Return=zeros(length(clpr),1);
figure(2);
plot(date,clpr,'r');
datetick('x','yyyymmdd');
xlabel('Date');
ylabel('Close Price');
title('Time Series of Stock');
grid on;
hold on;
%策略计算
for t=5:length(clpr)
%定义买卖信号
signalBuy=(DIFF(t)>MACD(t) && DIFF(t-1)>MACD(t-1) && DIFF(t-2)>MACD(t-2) && DIFF(t-3)
signalSell=(DIFF(t)MACD(t-3) && DIFF(t-4)>MACD(t-4));
%如果是买入信号且为空仓,则买入
if (signalBuy==1 && pos(t-1)==0)
pos(t)=1;
text(date(t),clpr(t),'\leftarrow买');
plot(date(t),clpr(t),'go');
%如果是卖出信号且为多仓,则卖出
elseif (signalSell==1 && pos(t-1)==1)
pos(t)=0;
text(date(t),clpr(t),'\leftarrow卖');
plot(date(t),clpr(t),'bo');
%其它情况一律不进行任何操作
else pos(t)=pos(t-1);
end
end
%计算资金变化情况,交易成本假设为单边千分之三
Return(1)=initial;
for t=2:length(clpr)
%空仓且没有买入信号
if pos(t)==0 && pos(t-1)==0
Return(t)=Return(t-1);
continue;
end
%买入
if pos(t)==1 && pos(t-1)==0
Return(t)=Return(t-1)*(1-0.003);
continue;
end
%持仓并且无卖出信号
if pos(t)==1 && pos(t-1)==1
Return(t)=Return(t-1)*(clpr(t)/clpr(t-1));
continue;
end
%卖出
if pos(t)==0 && pos(t-1)==1
Return(t)=Return(t-1)*(clpr(t)/clpr(t-1))*(1-0.003);
continue;
end
end
%% 模型评价:收益率,夏普比率,绝对收益率,最大回撤等一些列指标,这里只画资金变化曲线
%画出资金变化曲线
hold off;
figure(3);
plot(date,Return,'r');
datetick('x','yyyymmdd');
xlabel('Date');
ylabel('Your Money');
title('The Return of Stock');
%画出持仓情况
figure(4);
plot(date,pos,'b');
datetick('x','yyyymmdd');
xlabel('Date');
ylabel('The state of your account');
matlab计算macd_[原创]基于MATLAB的一个简单的交易策略(基于MACD)的Matlab代码-经管之家官网!...相关推荐
- matlab计算macd_[原创]基于MATLAB的一个简单的交易策略(基于MACD)的Matlab代码
%%此程序用来计算MACD指标并对其有效性进行回测检验 %%原始数据命名为stk_clpr,且第一列为收盘价,第二列为交易日期 %% 计算相关指标(这里也可编一个函数),第一天初始化:DIFF=DEA ...
- 用MATLAB绘制国债NSS模型,[matlab]用lsqcurvefit或lsqnonlin实现NSS利率期限模型-经管之家官网!...
opt = optimset('lsqcurvefit'); opt.Display = 'final'; opt.MaxFunEvals=20000; opt.MaxIter=20000; opt. ...
- matlab 如何查内置函数,关于Matlab的内置函数 ordqz的用法-经管之家官网!
[AAS,BBS,QS,ZS] = ordqz(AA,BB,Q,Z,select) [...] = ordqz(AA,BB,Q,Z,keyword) [...] = ordqz(AA,BB,Q,Z,c ...
- 基于PHP实现一个简单的在线聊天功能(轮询ajax )
基于PHP实现一个简单的在线聊天功能(轮询ajax ) 一.总结 1.用的轮询ajax 二.基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻 ...
- 我的Serverless实战—基于Serverless搭建一个简单的WordPress个人博客图文详解-JJZ
文正在参与 "100%有奖 | 我的Serverless 实战"征稿活动 活动链接:https://marketing.csdn.net/p/15940c87f66c68188cf ...
- 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署
基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目 ...
- 基于 Roslyn 实现一个简单的条件解析引擎
基于 Roslyn 实现一个简单的条件解析引擎 Intro 最近在做一个勋章的服务,我们想定义一些勋章的获取条件,满足条件之后就给用户颁发一个勋章,定义条件的时候会定义需要哪些参数,参数的类型,获取勋 ...
- 基于ForkJoin构建一个简单易用的并发组件
2019独角兽企业重金招聘Python工程师标准>>> 基于ForkJoin构建一个简单易用的并发组件 在实际的业务开发中,需要用到并发编程的知识,实际使用线程池来异步执行任务的场景 ...
- 基于websocket实现一个简单的IM即时聊天
基于websocket实现一个简单的IM即时聊天 websocket闲聊 如何实现一个简单的聊天程序 实践 代码 效果 登陆 聊天 websocket闲聊 简而言之,就是一种服务器和客户端可以双向通信 ...
最新文章
- mysql5.7多实例安装_MySQL数据库5.7多实例安装
- 二进制包安装MySQL数据库
- python去重复元素_python 去除单个list中的重复元素
- C#打开文件对话框和文件夹对话框
- Python排序算法之快速排序
- mysql rand() 子查询_MySQL ------ 子查询(十三)
- pycharm入门的简易使用教程
- ES6_对象简洁语法_note
- 英国四大运营商联合发文:驳斥“新冠病毒与5G有关”谣言
- 【干货】普华永道:新形势下,企业如何进行数字化转型.pdf(附下载链接)
- axis wsdl2java_AXIS1.4 客户端 wsdl2java 使用方法
- win10u盘被写保护怎么解除_win10系统U盘提示磁盘被写保护的解决办法
- 电脑用户计算机名文件夹,电脑用户名文件夹名称更改
- 行业解读 | 什么是人工智能语音技术?一篇文章让你读懂它
- ESP32文件系统esp_littlefs实例
- c语言中要求五个数一行,c 语言中如何一行输出五个数
- Jenkins项目配置-maven项目-全面
- AP AUTOSAR ——Diagnostic Management
- 基于Python3的格雷厄姆 股票估值模型
- 计算机专业英语教学工作总结,2020大学英语教师上学期教学工作总结