%%此程序用来计算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代码-经管之家官网!...相关推荐

  1. matlab计算macd_[原创]基于MATLAB的一个简单的交易策略(基于MACD)的Matlab代码

    %%此程序用来计算MACD指标并对其有效性进行回测检验 %%原始数据命名为stk_clpr,且第一列为收盘价,第二列为交易日期 %% 计算相关指标(这里也可编一个函数),第一天初始化:DIFF=DEA ...

  2. 用MATLAB绘制国债NSS模型,[matlab]用lsqcurvefit或lsqnonlin实现NSS利率期限模型-经管之家官网!...

    opt = optimset('lsqcurvefit'); opt.Display = 'final'; opt.MaxFunEvals=20000; opt.MaxIter=20000; opt. ...

  3. 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 ...

  4. 基于PHP实现一个简单的在线聊天功能(轮询ajax )

    基于PHP实现一个简单的在线聊天功能(轮询ajax ) 一.总结 1.用的轮询ajax 二.基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻 ...

  5. 我的Serverless实战—基于Serverless搭建一个简单的WordPress个人博客图文详解-JJZ

    文正在参与 "100%有奖 | 我的Serverless 实战"征稿活动 活动链接:https://marketing.csdn.net/p/15940c87f66c68188cf ...

  6. 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目 ...

  7. 基于 Roslyn 实现一个简单的条件解析引擎

    基于 Roslyn 实现一个简单的条件解析引擎 Intro 最近在做一个勋章的服务,我们想定义一些勋章的获取条件,满足条件之后就给用户颁发一个勋章,定义条件的时候会定义需要哪些参数,参数的类型,获取勋 ...

  8. 基于ForkJoin构建一个简单易用的并发组件

    2019独角兽企业重金招聘Python工程师标准>>> 基于ForkJoin构建一个简单易用的并发组件 在实际的业务开发中,需要用到并发编程的知识,实际使用线程池来异步执行任务的场景 ...

  9. 基于websocket实现一个简单的IM即时聊天

    基于websocket实现一个简单的IM即时聊天 websocket闲聊 如何实现一个简单的聊天程序 实践 代码 效果 登陆 聊天 websocket闲聊 简而言之,就是一种服务器和客户端可以双向通信 ...

最新文章

  1. mysql5.7多实例安装_MySQL数据库5.7多实例安装
  2. 二进制包安装MySQL数据库
  3. python去重复元素_python 去除单个list中的重复元素
  4. C#打开文件对话框和文件夹对话框
  5. Python排序算法之快速排序
  6. mysql rand() 子查询_MySQL ------ 子查询(十三)
  7. pycharm入门的简易使用教程
  8. ES6_对象简洁语法_note
  9. 英国四大运营商联合发文:驳斥“新冠病毒与5G有关”谣言
  10. 【干货】普华永道:新形势下,企业如何进行数字化转型.pdf(附下载链接)
  11. axis wsdl2java_AXIS1.4 客户端 wsdl2java 使用方法
  12. win10u盘被写保护怎么解除_win10系统U盘提示磁盘被写保护的解决办法
  13. 电脑用户计算机名文件夹,电脑用户名文件夹名称更改
  14. 行业解读 | 什么是人工智能语音技术?一篇文章让你读懂它
  15. ESP32文件系统esp_littlefs实例
  16. c语言中要求五个数一行,c 语言中如何一行输出五个数
  17. Jenkins项目配置-maven项目-全面
  18. AP AUTOSAR ——Diagnostic Management
  19. 基于Python3的格雷厄姆 股票估值模型
  20. 计算机专业英语教学工作总结,2020大学英语教师上学期教学工作总结

热门文章

  1. 如何使用powertoys全盘搜索文件
  2. .idea文件在项目中的显示与隐藏
  3. Tensorflow 的NCE-Loss的实现和word2vec
  4. Android强行进阶,自定义控件—LayoutManager,android开发视频
  5. PAD智龙迷城(puzzle and dragon)辅助转珠算法思路和python实现
  6. f5 gtm 工作原理_F5基本模块架构
  7. Android教程之名词扫盲汇总
  8. 深圳服务器托管,影响价格的因素
  9. 120个极品网站 收集历时2年 - 计算机应用 - 迅雷论坛
  10. 打开桌面计算机投屏到扩展屏,电脑投屏到电视显示不完全解决办法