楼主: fantuanxiaot
15678 210

[源码分享] [R原创]Macd交易回测Demo及其GUI制作[by fantuanxiaot]   [推广有奖]

版主

Ψ▄┳一大卫卍卐席尔瓦

大师

9%

还不是VIP/贵宾

-

威望
7
论坛币
-37227 个
通用积分
10.0053
学术水平
3775 点
热心指数
3811 点
信用等级
3447 点
经验
150468 点
帖子
7695
精华
32
在线时间
1322 小时
注册时间
2013-2-3
最后登录
2019-7-5

初级学术勋章 初级热心勋章 中级热心勋章 中级学术勋章 初级信用勋章 中级信用勋章 高级热心勋章 高级学术勋章 特级学术勋章 特级热心勋章 高级信用勋章 特级信用勋章

fantuanxiaot 发表于 2015-4-1 07:38:06 |显示全部楼层
本帖最后由 fantuanxiaot 于 2015-4-1 07:52 编辑

Macd交易回测Demo及其GUI制作、就当做量化版的清明节大礼了。人人为我、我为人人:在量化及其编程的学习中,欢迎大家分享,大家一起加油!!努力!!这就是量化投资板块的精神与精髓!!欢迎大家分享代码原创!奖励!精华!滚滚而来!

开始:基于R的Macd沪深300收盘价交易回测Demo(GUI制作)
  1. #  基于R的Macd沪深300收盘价交易回测Demo(GUI制作)
  2. #  by fantuanxiaot
  3. #  ##################################################################
  4. #  ##################################################################
复制代码
读取沪深300数据: MACD_HS300.xls (240.5 KB)
  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. }
  56. Trading.Button<-gbutton("确定交易",cont=MACD.Trading,handler=TradingFun)
  57. #  在旁边画图
  58. MACD.Plot<-ggroup(cont=MACD.Window,expand=TRUE)
  59. add(MACD.Plot,ggraphics())
复制代码
所有源码:

本帖隐藏的内容

MACD_TradingDemo.txt (10.72 KB)


回测结果:
MACD_Trading_0.jpg

MACD_Trading_4.jpg

MACD_Trading_3.jpg

MACD_Trading_2.jpg

MACD_Trading_1.jpg








关键词:fantuanxiaot DEMO MACD dem Mac

已有 6 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
zbin7451f + 100 + 5 + 5 + 5 精彩帖子
421073390 + 4 + 4 + 4 精彩帖子
chenyi112982 + 5 + 5 我很赞同
oink-oink + 5 + 5 + 5 精彩帖子
离歌レ笑 + 100 + 5 + 5 + 5 精彩帖子
日新少年 + 5 + 5 + 5 精彩帖子

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

本帖被以下文库推荐

stata SPSS
auirzxp 学生认证  发表于 2015-4-1 07:42:30 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

fantuanxiaot 发表于 2015-4-1 07:42:32 |显示全部楼层
这就是我版的魅力
回复

使用道具 举报

fjrong 在职认证  发表于 2015-4-1 07:42:38 |显示全部楼层

回帖奖励 +3

d
回复

使用道具 举报

cxzbb 发表于 2015-4-1 07:47:56 |显示全部楼层

回帖奖励 +3

kankan
回复

使用道具 举报

榄外人L 发表于 2015-4-1 07:56:35 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

Ryan1215 发表于 2015-4-1 07:59:17 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

fengyg 企业认证  发表于 2015-4-1 08:06:22 |显示全部楼层

回帖奖励 +3

kankan
回复

使用道具 举报

fengyg 企业认证  发表于 2015-4-1 08:10:38 |显示全部楼层
kankan
回复

使用道具 举报

tttrrrtr 发表于 2015-4-1 08:16:53 |显示全部楼层

回帖奖励 +3

已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
成祥 + 1 + 1 + 1 + 1 精彩帖子

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

回复

使用道具 举报

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

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

GMT+8, 2019-7-16 14:50