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

附件下载

所在主题:
文件名:  MACD_TradingDemo.txt
资料下载链接地址: https://bbs.pinggu.org/a-1760842.html
附件大小:
10.72 KB   举报本内容
Macd交易回测Demo及其GUI制作、就当做量化版的清明节大礼了。人人为我、我为人人:在量化及其编程的学习中,欢迎大家分享,大家一起加油!!努力!!这就是量化投资板块的精神与精髓!!欢迎大家分享代码原创!奖励!精华!滚滚而来!

开始:基于R的Macd沪深300收盘价交易回测Demo(GUI制作)
  1. #基于R的Macd沪深300收盘价交易回测Demo(GUI制作)
  2. #by fantuanxiaot
  3. ###################################################################
  4. ###################################################################
复制代码
读取沪深300数据:
  1. #设置当前的工作目录
  2. setwd("D:/MyDriversRoad/R_files12")
  3. #读取数据
  4. library(RODBC)
  5. excel_conn<-odbcConnectExcel('MACD_HS300.xls')
  6. HS300.Data<-sqlFetch(excel_conn,'Sheet1')
  7. #关闭DB连接
  8. close(excel_conn)
  9. #查看数据
  10. head(HS300.Data,30)
  11. View(HS300.Data)
  12. #以上为基于ODBC连接R语言和Excel的数据I/O步骤,并将数据读取
复制代码
Macd函数、最大回测比率函数如下:
  1. macd<-function(Stock,short_period,
  2. long_period,dea_period) {
  3. #Stock是股票的价格
  4. #short_period是短期
  5. #long_period是长期
  6. #还有dea_period
  7. #short_period<-5
  8. #long_period<-25
  9. #dea_period<-9
  10. length_stock<-length(Stock)
  11. EMA_short<-rep(0,length_stock)
  12. EMA_long<-rep(0,length_stock)
  13. stock_diff<-rep(0,length_stock)
  14. stock_dea<-rep(0,length_stock)
  15. stock_macd<-rep(0,length_stock)
  16. #计算各类指标初始值
  17. EMA_short[1]<-Stock[1]
  18. EMA_long[1]<-Stock[1]
  19. stock_diff[1]<-0
  20. stock_dea[1]<-0
  21. stock_macd[1]<-0
  22. #计算各类指标
  23. for (t in 2:length_stock) {
  24. EMA_short[t]<-Stock[t]*2/(short_period+1)+
  25. EMA_short[t-1]*(short_period-1)/(short_period+1)
  26. EMA_long[t]<-Stock[t]*2/(long_period+1)+
  27. EMA_long[t-1]*(long_period-1)/(long_period+1)
  28. stock_diff[t]<-EMA_short[t]-EMA_long[t]
  29. stock_dea[t]<-stock_diff[t]*2/(dea_period+1)+
  30. stock_dea[t-1]*(dea_period-1)/(dea_period+1)
  31. stock_macd[t]<-2*(stock_diff[t]-stock_dea[t])
  32. }
  33. return(stock_macd)
  34. }
复制代码
  1. Retreat_Ratio<-function(stock_return1) {
  2. N<-length(stock_return1)
  3. RetraceRatio<-rep(0,N)
  4. for (i in 2:N) {
  5. C<-max(stock_return1[1:i])
  6. if (C==stock_return1[i]) {
  7. RetraceRatio[i]<-0
  8. } else {
  9. RetraceRatio[i]<-(stock_return1[i]-C)/C
  10. }
  11. }
  12. return(RetraceRatio)
  13. }
复制代码
获取回测数据
  1. #获取回测的指标:共500个序列
  2. BackTestSample<-HS300.Data[,"收"]
  3. BackTestSample<-BackTestSample[c((length(BackTestSample)-499):length(BackTestSample))]
复制代码

MACD回测函数:获取动态资金、静态资金、现金流序列,以short_period,long_period,dea_period为形参
  1. MACD_BackTest<-function(short_period,long_period,dea_period)
  2. {
  3. Stock_macd<-macd(BackTestSample,short_period,long_period,
  4. dea_period)
  5. Stock<-BackTestSample
  6. stock_return<-NULL
  7. #初始资金设为10000
  8. n<-length(BackTestSample)
  9. dynamic_money<-c(10000,rep(0,n-1))
  10. cash_money<-c(10000,rep(0,n-1))
  11. static_money<-c(10000,rep(0,n-1))
  12. margin_ratio<-0.08
  13. cost_ratio<-0.003
  14. in_price<-NULL
  15. out_price<-NULL
  16. one_return<-NULL
  17. market_pos<-0
  18. cost_in<-NULL
  19. cost_out<-NULL
  20. margin_call_money<-rep(0,n)
  21. margin_put_money<-rep(0,n)
  22. #####交易的开始####
  23. ##############注意dynamic_money#############
  24. ##############注意market_pos的编程情况#############
  25. for (i in 2:n) {
  26. #####先判断入仓的情况####
  27. #####先判断入仓的情况####
  28. if (market_pos==0) {
  29. if (Stock_macd[i-1]<0 && Stock_macd[i]>=0) {
  30. in_price<-Stock[i]
  31. cost_in<-in_price*cost_ratio
  32. market_pos<-1
  33. dynamic_money[i]<-dynamic_money[i-1]-cost_in
  34. static_money[i]<-static_money[i-1]
  35. cash_money[i]<-cash_money[i-1]-cost_in-
  36. in_price*margin_ratio-in_price
  37. margin_call_money[i]<-in_price*margin_ratio
  38. } else if (Stock_macd[i-1]>0 && Stock_macd[i]<=0) {
  39. in_price<-Stock[i]
  40. cost_in<-in_price*cost_ratio
  41. market_pos<--1
  42. dynamic_money[i]<-dynamic_money[i-1]-cost_in
  43. static_money[i]<-static_money[i-1]
  44. cash_money[i]<-cash_money[i-1]-cost_in-
  45. in_price*margin_ratio+in_price
  46. margin_put_money[i]<-in_price*margin_ratio
  47. } else {
  48. dynamic_money[i]<-dynamic_money[i-1]
  49. cash_money[i]<-cash_money[i-1]
  50. static_money[i]<-static_money[i-1]
  51. market_pos<-0
  52. }
  53. } else if (market_pos==1) {
  54. #####再判断平仓的情况####
  55. #####再判断平仓的情况####
  56. if (Stock_macd[i-1]>0 && Stock_macd[i]<=0) {
  57. out_price<-Stock[i]
  58. cost_out<-out_price*cost_ratio
  59. market_pos<-0
  60. dynamic_money[i]<-dynamic_money[i-1]+(out_price-Stock[i-1])-
  61. cost_out
  62. one_return<-out_price-in_price-cost_in-cost_out
  63. stock_return<-c(stock_return,one_return)
  64. static_money[i]<-static_money[i-1]+one_return
  65. cash_money[i]<-cash_money[i-1]-cost_out+margin_call_money[i-1]+
  66. out_price
  67. #####再空头入仓####
  68. if (i!=n) {
  69. market_pos<--1
  70. in_price<-Stock[i]
  71. cost_in<-in_price*cost_ratio
  72. dynamic_money[i]<-dynamic_money[i]-cost_in
  73. static_money[i]<-static_money[i]
  74. cash_money[i]<-cash_money[i]-cost_in+in_price-
  75. in_price*margin_ratio
  76. margin_put_money[i]<-in_price*margin_ratio
  77. }
  78. } else {
  79. market_pos<-1
  80. dynamic_money[i]<-dynamic_money[i-1]+Stock[i]-Stock[i-1]
  81. static_money[i]<-static_money[i-1]
  82. cash_money[i]<-cash_money[i-1]+
  83. margin_ratio*(Stock[i]-Stock[i-1])
  84. margin_call_money[i]<-margin_call_money[i-1]-
  85. margin_ratio*(Stock[i]-Stock[i-1])
  86. }
  87. } else if (market_pos==-1) {
  88. if (Stock_macd[i-1]<0 && Stock_macd[i]>=0) {
  89. out_price<-Stock[i]
  90. cost_out<-out_price*cost_ratio
  91. market_pos<-0
  92. dynamic_money[i]<-dynamic_money[i-1]-out_price+Stock[i-1]-
  93. cost_out
  94. one_return<-in_price-out_price-cost_out-cost_in
  95. stock_return<-c(stock_return,one_return)
  96. static_money[i]<-static_money[i-1]+one_return
  97. cash_money[i]<-cash_money[i-1]-cost_out+
  98. margin_put_money[i-1]-out_price
  99. #####再多头入仓####
  100. if (i!=n) {
  101. market_pos<-1
  102. in_price<-Stock[i]
  103. cost_in<-in_price*cost_ratio
  104. dynamic_money[i]<-dynamic_money[i]-cost_in
  105. static_money[i]<-static_money[i]
  106. cash_money[i]<-cash_money[i]-
  107. cost_in-in_price*margin_ratio-in_price
  108. margin_call_money[i]<-in_price*margin_ratio
  109. }
  110. } else {
  111. market_pos<--1
  112. dynamic_money[i]<-dynamic_money[i-1]-Stock[i]+Stock[i-1]
  113. static_money[i]<-static_money[i-1]
  114. cash_money[i]<-cash_money[i-1]+
  115. margin_ratio*(Stock[i-1]-Stock[i])
  116. margin_put_money[i]<-margin_put_money[i-1]-
  117. margin_ratio*(Stock[i-1]-Stock[i])
  118. }
  119. }
  120. if (i==n) {
  121. if (market_pos==1) {
  122. out_price<-Stock[i]
  123. market_pos<-0
  124. cost_out<-out_price*margin_ratio
  125. dynamic_money[i]<-dynamic_money[i-1]+out_price-Stock[i-1]-
  126. cost_out
  127. one_return<-out_price-in_price-cost_out-cost_in
  128. stock_return<-c(stock_return,one_return)
  129. static_money[i]<-static_money[i-1]+one_return
  130. cash_money[i]<-cash_money[i-1]-cost_out+out_price+
  131. margin_call_money[i-1]
  132. }
  133. if (market_pos==-1) {
  134. out_price<-Stock[i]
  135. market_pos<-0
  136. cost_out<-out_price*margin_ratio
  137. dynamic_money[i]<-dynamic_money[i-1]-out_price+Stock[i-1]-
  138. cost_out
  139. one_return<-in_price-out_price-cost_out-cost_in
  140. stock_return<-c(stock_return,one_return)
  141. static_money[i]<-static_money[i-1]+one_return
  142. cash_money[i]<-cash_money[i-1]-cost_out-out_price+
  143. margin_put_money[i-1]
  144. }
  145. }
  146. }
  147. #构建回测结果返回值
  148. Answer<-list()
  149. #动态资金曲线
  150. Answer$Dynamic<-dynamic_money
  151. #静态资金曲线
  152. Answer$Static<-static_money
  153. Answer$Cash<-cash_money
  154. return(Answer)
  155. }
复制代码
界面制作:需要package(library(gWidgetsRGtk2)),只需先设定几个参数值,再点击回测交易即可。
  1. #载入需要做GUI的Package
  2. library(gWidgetsRGtk2)
  3. #参数的设定
  4. short_period_value<-c(3,4,5,6,7,8)
  5. long_period_value<-c(20,21,22,23,24,25,26,27,28,29,30)
  6. dea_period_value<-c(9,10,11,12,13,14,15)
  7. #R环境下的GUI建立
  8. Window<-gwindow("基于HS300的MACD回测GUI")
  9. MACD.Window<-ggroup(cont=Window,horizontal=TRUE)
  10. MACD.ParameterSet.Window<-ggroup(cont=MACD.Window,horizontal=FALSE)
  11. MACD.Gframe.short<-gframe("short_period的选择",cont=MACD.ParameterSet.Window)
  12. MACD.Gframe.long<-gframe("long_period的选择",cont=MACD.ParameterSet.Window)
  13. MACD.Gframe.dea<-gframe("dea_period的选择",cont=MACD.ParameterSet.Window)
  14. MACD.Trading<-gframe("选择回测交易",cont=MACD.ParameterSet.Window)
  15. MACD.Trading.Exit<-gframe("退出回测",cont=MACD.ParameterSet.Window)
  16. #R环境下的GUI建立
  17. short.list<-gdroplist(short_period_value,cont=MACD.Gframe.short)
  18. long.list<-gdroplist(long_period_value,cont=MACD.Gframe.long)
  19. dea.list<-gdroplist(dea_period_value,cont=MACD.Gframe.dea)
  20. Trading.Exit.Button<-gbutton("退出交易",cont=MACD.Trading.Exit,handler=function(h,...) dispose(Window))
  21. #R环境下的GUI建立
  22. #TradingFun的构建
  23. TradingFun<-function(h,...)
  24. {
  25. #先得到设置的参数的选择
  26. short_period<-as.numeric(svalue(short.list))
  27. long_period<-as.numeric(svalue(long.list))
  28. dea_period<-as.numeric(svalue(dea.list))
  29. MACD.BackTest.Result<-MACD_BackTest(short_period,
  30. long_period,dea_period)
  31. #得到回撤比率
  32. BackTest.RetreatRatio<-
  33. Retreat_Ratio(MACD.BackTest.Result$Dynamic)
  34. #作图(第一幅图)
  35. Length<-length(BackTest.RetreatRatio)
  36. par(mfrow=c(1,2),family='serif')
  37. c1<-c(c(0:Length),c(Length:0))
  38. c2<-c(c(0,BackTest.RetreatRatio),rep(0,Length+1))
  39. plot(c1,c2,type='n',xlab='Time',
  40. ylab='Retreat Ratio')
  41. polygon(c1,c2,col='green',border='blue')
  42. title('最大回测比率')
  43. #作图(第二幅图)
  44. plot(MACD.BackTest.Result$Dynamic,col='red',
  45. type='s',lwd=2,ylim=c(0,12000))
  46. lines(MACD.BackTest.Result$Static,col='blue',type='s',lwd=2)
  47. lines(MACD.BackTest.Result$Cash,col='gold',type='s',lwd=2)
  48. lines(c(1:length(MACD.BackTest.Result$Cash)),
  49. rep(10000,length(MACD.BackTest.Result$Cash)),
  50. col='black',type='c',lwd=2)
  51. legend(100,8000,lty=c(1,1,1),
  52. legend=c("动态资金曲线","静态资金曲线","现金曲线"),
  53. col=c("red","blue","gold"),hori=FALSE,bty="o")

  54. }
  55. Trading.Button<-gbutton("确定交易",cont=MACD.Trading,handler=TradingFun)
  56. #在旁边画图
  57. MACD.Plot<-ggroup(cont=MACD.Window,expand=TRUE)
  58. add(MACD.Plot,ggraphics())
复制代码
所有源码:[hide][/hide]
回测结果:














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

扫码加我 拉你入群

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

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

GMT+8, 2026-1-28 12:15