搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  MACD_strategy.rar
资料下载链接地址: https://bbs.pinggu.org/a-1488139.html
本附件包括:
  • MACD_strategy.m
附件大小:
这是一个简单交易策略(基于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]







    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

GMT+8, 2025-12-30 08:56