楼主: weitingkoala
41688 65

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

学科带头人

13%

还不是VIP/贵宾

-

TA的文库  其他...

应用量化研究

威望
2
论坛币
7921 个
通用积分
51.4514
学术水平
321 点
热心指数
290 点
信用等级
298 点
经验
8986 点
帖子
424
精华
7
在线时间
1323 小时
注册时间
2010-5-7
最后登录
2024-3-4

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

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

1.png


2.png


4.png


3.png



本帖隐藏的内容

  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');
复制代码



本帖隐藏的内容

MACD_strategy.rar (1.64 KB) 本附件包括:
  • MACD_strategy.m






二维码

扫码加我 拉你入群

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

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

关键词:matlab代码 MATLAB atlab matla 交易策略 matlab 收盘价 程序 命名

回帖推荐

zhangibt 发表于33楼  查看完整内容

简单的策略也是同样能盈利的, 做好回测,多几人验证

zxn2011 发表于29楼  查看完整内容

这种东西你要从“matlab code” 的角度去enjoy而不是“交易策略”角度

christy_sym 发表于26楼  查看完整内容

任何交易模型 不管算法多复杂,本质上胜率不会差别太大。 无非是 胜率 盈亏比 最大回撤幅度 次数等数据 了解这些后,核心是 制定 适合这个交易模型自身特点的 资金管理模式 否则一切都是镜中月,空中楼台。
已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子
fantuanxiaot + 6 + 6 + 1 + 1 + 1 精彩帖子
zhangibt + 20 mark一下

总评分: 经验 + 126  论坛币 + 6  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

本帖被以下文库推荐

沙发
weitingkoala 发表于 2014-2-12 15:32:34 |只看作者 |坛友微信交流群
先模仿 后创新
已有 1 人评分经验 论坛币 收起 理由
fantuanxiaot + 6 + 6 精彩帖子

总评分: 经验 + 6  论坛币 + 6   查看全部评分

使用道具

藤椅
上官若馨 发表于 2014-2-12 19:08:48 |只看作者 |坛友微信交流群
顶一下
坚持就是胜利

使用道具

板凳
richard555 发表于 2014-3-26 00:56:20 |只看作者 |坛友微信交流群
太牛了,没完全理解啊

使用道具

报纸
scy232119 发表于 2014-4-11 23:28:26 |只看作者 |坛友微信交流群
感谢楼主分享,我也说一些自己的观点:从你的损益图发现这个模型是无效的,受系统风险影响很大。楼主的模拟交易中的收益完全是06,07年牛市时创造的,并不是这个交易策略所带来的。提出特殊样本之后看模型10年之后的表现可以发现这个模型的收益率是负的,鲁棒性非常不好。欢迎多多交流

使用道具

地板
scy232119 发表于 2014-4-11 23:31:37 |只看作者 |坛友微信交流群
scy232119 发表于 2014-4-11 23:28
感谢楼主分享,我也说一些自己的观点:从你的损益图发现这个模型是无效的,受系统风险影响很大。楼主的模拟 ...
写了个错别字。。。是“剔除”,不是“提出”。然后我现在在做一个给予SVM的算法交易模型,目前有一些灵感并且模型也有一个雏形,对machine learning特别是对SVM感兴趣的可以一起交流交流~邮箱是scy232119@sina.com

使用道具

7
peterguanguan 在职认证  发表于 2014-4-12 08:48:32 |只看作者 |坛友微信交流群
支持起来
Now or Never

使用道具

8
sheva0728 在职认证  发表于 2014-6-6 22:19:32 |只看作者 |坛友微信交流群
如此好帖居然没人顶?

请问楼主有试过模仿通达信上的MACD做一下红柱绿柱吗?
知乎专栏:http://zhuanlan.zhihu.com/sanleima
缠论学习笔记 / 交易随笔

使用道具

9
realyw 发表于 2014-6-23 15:46:45 |只看作者 |坛友微信交流群
thanks for sharing

使用道具

10
fantuanxiaot 发表于 2014-9-13 12:13:01 |只看作者 |坛友微信交流群
weitingkoala 发表于 2014-2-12 15:32
先模仿 后创新
版主乐于分享!这就是难能可贵的地方!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 09:45