[原创]基于MATLAB的一个简单的交易策略(基于MACD)的Matlab代码-经管之家官网!

人大经济论坛-经管之家 收藏本站
您当前的位置> 软件培训>>

Matlab软件培训

>>

[原创]基于MATLAB的一个简单的交易策略(基于MACD)的Matlab代码

[原创]基于MATLAB的一个简单的交易策略(基于MACD)的Matlab代码

发布:weitingkoala | 分类:Matlab软件培训

关于本站

人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!

经管之家新媒体交易平台

提供"微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯"等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

提供微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

这是一个简单交易策略(基于MACD)的Matlab代码,说明:1.这是之前练习时写的,对于其中的算法,我不能保证正确,请各位批判性思考2.本代码用于交流学习,大牛轻拍[hide]%%此程序用来计算MACD指标并对其有效性进行回 ...
免费学术公开课,扫码加入


这是一个简单交易策略(基于MACD)的Matlab代码,说明:1.这是之前练习时写的,对于其中的算法,我不能保证正确,请各位批判性思考2.本代码用于交流学习,大牛轻拍





[hide]
  1. %%此程序用来计算MACD指标并对其有效性进行回测检验
  2. %%原始数据命名为stk_clpr,且第一列为收盘价,第二列为交易日期
  3. %% 计算相关指标(这里也可编一个函数),第一天初始化:DIFF=DEA=MACD=0,EMAshort=EMAlong=第一天的收盘价
  4. %虽然matlab有自带的函数macd(),它貌似只能计算默认长度的平滑移动平均,还是自己算理解更深刻
  5. clpr=stk_clpr(:,1);%提取收盘价
  6. date=stk_clpr(:,2);%提取日期
  7. %定义计算长度
  8. shortPeriod=12;%定义收盘价短期(快速)平滑移动平均计算长度
  9. longPeriod=26;%定义收盘价长期(慢速)平滑移动平均计算长度
  10. DEAPeriod=9;%定义diff线平滑移动平均计算长度
  11. %建立占位矩阵,提高程序运行效率
  12. EMAshort=zeros(length(clpr),1);
  13. EMAlong=zeros(length(clpr),1);
  14. DIFF=zeros(length(clpr),1);
  15. DEA=zeros(length(clpr),1);
  16. MACD=zeros(length(clpr),1);
  17. %用循环语句计算各个指标(这里用向量不管用)
  18. EMAshort(1)=clpr(1);%初始化EMAshort第一值
  19. EMAlong(1)=clpr(1);%初始化EMAlong第一个值
  20. DEA(1)=0;%初始化第一值
  21. DIFF(1)=0;
  22. MACD(1)=0;
  23. for t=2:length(clpr);
  24. %计算短期和长期EMA
  25. EMAshort(t)=clpr(t)*(2/(shortPeriod+1))+EMAshort(t-1)*((shortPeriod-1)/(shortPeriod+1));
  26. EMAlong(t)=clpr(t)*(2/(longPeriod+1))+EMAlong(t-1)*((longPeriod-1)/(longPeriod+1));
  27. %计算DIFF
  28. DIFF(t)=EMAshort(t)-EMAlong(t);
  29. %计算DEA
  30. DEA(t)=DIFF(t)*(2/(DEAPeriod+1))+DEA(t-1)*((DEAPeriod-1)/(DEAPeriod+1));
  31. %计算MACD
  32. MACD(t)=2*(DIFF(t)-DEA(t));
  33. end
  34. %画出行情序列图和各指标变化图
  35. figure(1);
  36. subplot(3,1,1);
  37. plot(date,clpr,'r');
  38. datetick('x','yyyymmdd');
  39. xlabel('Date');
  40. ylabel('Close Price');
  41. title('Time Series of Stock');
  42. grid on;
  43. subplot(3,1,2);
  44. plot(date,DIFF,'g',date,DEA,'b');
  45. datetick('x','yyyymmdd');
  46. legend('DIFF','DEA');
  47. xlabel('Date');
  48. ylabel('DIFF and DEA');
  49. title('The DIFF and DEA of Stock');
  50. grid on;
  51. subplot(3,1,3);
  52. plot(date,MACD,'r');
  53. datetick('x','yyyymmdd');
  54. xlabel('Date');
  55. ylabel('MACD');
  56. title('The MACD of Stock');
  57. grid on;
  58. %% 策略回测仿真
  59. %%一个最简单的策略:1)DIFF向上突破MACD且连续三天处于MACD之上,则为买入信号;2)DIFF向下穿过MACD且连续三天处于MACD之下,则为卖出信号
  60. %初始资金10000元
  61. initial=10000;
  62. %定义仓位:1表示多头,0表示空仓
  63. pos=zeros(length(clpr),1);
  64. %定义收益序列
  65. Return=zeros(length(clpr),1);
  66. figure(2);
  67. plot(date,clpr,'r');
  68. datetick('x','yyyymmdd');
  69. xlabel('Date');
  70. ylabel('Close Price');
  71. title('Time Series of Stock');
  72. grid on;
  73. hold on;
  74. %策略计算
  75. for t=5:length(clpr)
  76. %定义买卖信号
  77. signalBuy=(DIFF(t)>MACD(t) && DIFF(t-1)>MACD(t-1) && DIFF(t-2)>MACD(t-2) && DIFF(t-3)<MACD(t-3) && DIFF(t-4)<MACD(t-4));
  78. signalSell=(DIFF(t)<MACD(t) && DIFF(t-1)<MACD(t-1) && DIFF(t-2)<MACD(t-2) && DIFF(t-3)>MACD(t-3) && DIFF(t-4)>MACD(t-4));
  79. %如果是买入信号且为空仓,则买入
  80. if (signalBuy==1 && pos(t-1)==0)
  81. pos(t)=1;
  82. text(date(t),clpr(t),'\leftarrow买');
  83. plot(date(t),clpr(t),'go');

  84. %如果是卖出信号且为多仓,则卖出
  85. elseif (signalSell==1 && pos(t-1)==1)
  86. pos(t)=0;
  87. text(date(t),clpr(t),'\leftarrow卖');
  88. plot(date(t),clpr(t),'bo');

  89. %其它情况一律不进行任何操作
  90. else pos(t)=pos(t-1);
  91. end
  92. end
  93. %计算资金变化情况,交易成本假设为单边千分之三
  94. Return(1)=initial;
  95. for t=2:length(clpr)
  96. %空仓且没有买入信号
  97. if pos(t)==0 && pos(t-1)==0
  98. Return(t)=Return(t-1);
  99. continue;
  100. end
  101. %买入
  102. if pos(t)==1 && pos(t-1)==0
  103. Return(t)=Return(t-1)*(1-0.003);
  104. continue;
  105. end
  106. %持仓并且无卖出信号
  107. if pos(t)==1 && pos(t-1)==1
  108. Return(t)=Return(t-1)*(clpr(t)/clpr(t-1));
  109. continue;
  110. end
  111. %卖出
  112. if pos(t)==0 && pos(t-1)==1
  113. Return(t)=Return(t-1)*(clpr(t)/clpr(t-1))*(1-0.003);
  114. continue;
  115. end
  116. end
  117. %% 模型评价:收益率,夏普比率,绝对收益率,最大回撤等一些列指标,这里只画资金变化曲线
  118. %画出资金变化曲线
  119. hold off;
  120. figure(3);
  121. plot(date,Return,'r');
  122. datetick('x','yyyymmdd');
  123. xlabel('Date');
  124. ylabel('Your Money');
  125. title('The Return of Stock');
  126. %画出持仓情况
  127. figure(4);
  128. plot(date,pos,'b');
  129. datetick('x','yyyymmdd');
  130. xlabel('Date');
  131. ylabel('The state of your account');
复制代码
[/hide]
[hide]
[/hide]
「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
本文关键词:

本文论坛网址:https://bbs.pinggu.org/thread-2897483-1-1.html

人气文章

1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
经管之家 人大经济论坛 大学 专业 手机版