请选择 进入手机版 | 继续访问电脑版
楼主: tianjixuetu
16804 129

[源码分享] [R语言代码]海龟交易系统[附件回复可见]   [推广有奖]

教授

52%

还不是VIP/贵宾

-

TA的文库  其他...

投资理财书籍

威望
0
论坛币
10240 个
通用积分
42.8729
学术水平
67 点
热心指数
67 点
信用等级
61 点
经验
1211 点
帖子
714
精华
3
在线时间
1560 小时
注册时间
2009-12-16
最后登录
2024-4-18

tianjixuetu 在职认证  发表于 2015-4-26 11:49:58 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
本代码来至于量化投资:以R语言为工具
我保证全部来至于书上,一个字没改,花了我一整天时间打上来,但是,中间显示了某些错误(测试不成功),求大神指点。

本帖隐藏的内容

  1. require(quantmod)
  2. require(TTR)
  3. require(blotter)
  4. rm(list=ls(all=TRUE))
  5. #设定初始值
  6. initDate="2008-01-01"
  7. initEq=100000
  8. print("Initializing portfolio and account structure")
  9. #构建一个带有三支股票的小型组合
  10. symbols=c("XLF","XLP","XLE")#,"XLY","XLV","XLI","XLB","XLK","XLU")
  11. currency("USD")
  12. for(symbol in symbols){
  13. stock(symbol,currency="USD",multiplier=1)
  14. }
  15. #创建函数保存过程值
  16. updateStrat=  function(Portfolio,Symbol,TxnDate,POsUintsQty,UnitSize,StopPrice,TxnPrice,TxnN)
  17. {#@作者 Peter Carl
  18. #描述
  19. #添加交易事务相关数据到STRATEGY时间序列
  20. #输入
  21. #TxnDate:以ISO 8106格式的交易日期,例如:‘2008-09-01”
  22. #PosUintsQty:总交易数量(股数)
  23. #StopPrice:交易完成价格
  24. #TxnPrice:最后交易价格
  25. #TxnN:为最后的结算N
  26. #输出
  27. #没有输出。在本地命名空间修改STRATEGY
  28. #函数
  29. #保存交易事务与计算,返回投资组合
  30. pname=Portfolio
  31. NewTxn=xts(t(c(PosUnitsQty,UnitSize,StopPrice,TxnPrice,
  32. TxnN)),order.by=as.POSIXct(TxnDate))
  33. colnames(NewTxn)=c('Pos.Units','Unit.Size','Stop.Price',
  34. 'Txn.Price','Txn.N')
  35. Portfolio=getPortfolio(Portfolio)
  36. Portfolio[[Symbol]]$strat=rbind(Portfolio[[Symbol]]$strat,NewTxn)
  37. assign(paste("portfolio",pname,sep='.'),Portfolio,envir=blotter)
  38. }
  39. getSymbols(symbols,index.class="POSIXct",from=initDate,source="yahoo")
  40. #getSymbols缺省为Date索引。在此我们将其改为用POSIXct.
  41. #getSymbols(symbols,index.calss=c("POSIXt","POSIXct"),from=initDate,source="yahoo")
  42. #创建一个投资组合对象和账户对象
  43. portfolio="turtles"
  44. initPortf(name=portofolio,symbols,initDate=initDate)
  45. account="turtles"
  46. initAcct(name=account,portfolios="turtles",initDate=initDate,initEq=initEq)
  47. #该表保存于策略相关的交易事务相关信息
  48. #将其存放到portfolio对象
  49. Portfolio=getPortfolio(portfolio)
  50. for(symbol in symbols){
  51. Portfolio[[symbol]]$strat=xts(as.matrix(t(c(0,0,0,0,0))),order.by=as.POSIXct(initDate))
  52. colnames(Portfolio[[symbol]]$strat=c('Pos.Units','Unit.Size','Stop.Price','Txn.Price','Txn.N')}
  53. #现在再将其放回所属处
  54. assign("portfolio.turtles",Portfolio,envir=.blotter)
  55. rm("Portfolio")
  56. #构建指标
  57. print("Setting up indicators")
  58. for(symbol in symbols){
  59. #系统1:以20日突破为基础的短期系统
  60. #所为突破是指价格超越了过去一定时期内的最高点和最低点。所以,20天突破就是指价格超越了过去20天的最高点和最低点
  61. #如果上次突破是一次营利性突破(也就是说可以带来一次赢利的交易,那么系统1的当前入市信号将被忽略)
  62. #这些值也用于系统2的离场
  63. x=get(symbol)
  64. #入市(&System 2 exits)
  65. x$Min20=runMin(x[,grep('Low',colnames(x))],20)
  66. x$Max20=runMax(x[,grep('High',colnames(x))],20)
  67. #离场
  68. x$Min10=runMin(x[,grep('Low',colnames(x))],10)
  69. x$Max10=runMax(x[,grep('High',colnames(x))],10)
  70. #系统2:以55日突破为基础的长期系统
  71. ##总是取55天突破
  72. #入市
  73. x$Min55=runMin(x[,grep('Low',colnames(x))],55)
  74. x$Max55=runMax(x[,grep('High',colnames(x))],55)
  75. #仓位规模参数c('High','Low','Close')
  76. x$N=ATR(x[,c(2,3,4)],n=20,maType=EMA,wilder=TRUE)[,'atr']
  77. assign(symbol,x)
  78. }
  79. #投资组合参数
  80. size=0.01
  81. maxUnits=4
  82. Units=0
  83. verbose=TRUE
  84. #创建交易
  85. for(i in 57:NROW(x)){#假设所有日期相同
  86. CurrentDate=time(x)
  87. #print(CurrentDate)
  88. equity=getEndEq(account,CurrentDate)
  89. for(symbol in symbols){
  90. x=get(symbol)
  91. ClosePrice=as.numeric(Cl(x))
  92. Posn=getPosQty(Portfolio=portfolio,Symbol=symbol,Date=CurrentDate)
  93. s=tail(getPortfolio(portfolio)[[symbol]]$strat,1)
  94. Units=as.numeric(s[,'Pos.Units'])
  95. TxnPrice=as.numeric(s[,'Txn.Price'])
  96. N=as.numeric(s[,'Txn.N'])
  97. Stop=as.numeric(s[,'Stop.Price'])
  98. UnitSize=as.numeric(trunc((size*equity)/(x[i-1,'N']*ClosePrice)))
  99. #入市(假设以收盘价填入,因此考虑了滑价)
  100. if(Posn==0){
  101. #初始化多头仓位
  102. if(as.numeric(Hi(x[i-1,]))>as.numeric(x[i-2,'Max55'])){
  103. addTxn(Portfolio=portfolio,Symbol=symbol,TxnDate=CurrentDate,TxnPrice=ClosePrice,TxnQty=UnitSize,TxnFees=0,verbose=verbose)
  104. N=as.numeric(x[i-1,'N'])
  105. updateStrat(Portfolio=portofolio,Symbol=symbol,TxnDate=CurrentDate,PosUnitsQty=1,UnitSize=UnitSize,StopPrice=(ClosePrice-2*N),TxnPrice=ClosePrice,TxnN=N)
  106. }else
  107. #初始化空头仓位
  108. if(as.numeric(Lo(x[i-1,]))<as.numeric(x[i-2,'Min55'])){
  109. addTxn(Portfolio=portfolio,Symbol=symbol,TxnDate=CurrentDate,TxnPrice=ClosePrice,TxnQty=-UnitSize,TxnFees=0,verbose=verbose)
  110. N=as.numeric(x[i-1,'N'])
  111. updateStrat(Portfolio=portofolio,Symbol=symbol,TxnDate=CurrentDate,PosUnitsQty=Units,UnitSize=UnitSize,StopPrice=(ClosePrice+2*N),TxnPrice=ClosePrice,TxnN=N)
  112. }
  113. }else
  114. #离场和止损
  115. if(Posn>0&&(as.numeric(Lo(x[i-1,]))<as.numeric(x[i-2,'Min20'])||Lo(x[i-1,]<Stop))||
  116. (Posn<0&&(as.numeric(Hi(x[i-1,]))>as.numeric(x[i-2,'Max20'])||Hi(x[i-1,]>Stop))){
  117. addTxn(Portfolio=portfolio,Symbol=symbol,TxnDate=CurrentDate,TxnPrice=closePrice,TxnQty=-Posn,TxnFees=0,verbose=verbose)
  118. N=as.numeric(x[i-1,'N'])
  119. updateStrat(Portfolio=portfolio,Symbol=symbol,TxnDate=CurrentDate,PosUnitsQty=0,UnitSize=UnitSize,StopPrice=NA,TxnPrice=ClosePrice,TxnN=N)
  120. }else
  121. #加到多头仓位
  122. if(Posn>0 && Units<maxUnits && Hi(x[i-1,])>(TxnPrice+N*0.5)){
  123. addTxn(Portfolio=portfolio,Symbol=symbol,TxnDate=CurrentDate,TxnPrice=ClosePrice,TxnQty=UnitSize,TxnFees=0,verbose=verbose)
  124. N=as.numeric(x[i-1,'N'])
  125. updateStrat(Portfolio=portfolio,Symbol=symbol,TxnDate=CurrentDate,PosUnitsQty=Units+1,UnitSize=UnitSize,StopPrice=(ClosePrice-2*N),TxnPrice=ClosePrice,TxnN=N)
  126. }else
  127. #加到空头仓位
  128. if(Posn<0 && Units<maxUnits && Lo(x[i-1,])<(TxnPrice-N*0.5)){
  129. addTxn(Portfolio=portfolio,Symbol=symbol,TxnDate=CurrentDate,TxnPrice=Cl(x[i,]),TxnQty=-UnitSize,TxnFees=0,verbose=verbose)
  130. N=as.numeric(x[i-1,'N'])
  131. updateStrat(Portfolio=portfolio,Symbol=symbol,TxnDate=CurrentDate,PosUnitsQty=Units+1,UnitSize=UnitSize,StopPrice=(ClosePrice+2*N),TxnPrice=ClosePrice,TxnN=N)
  132. }#else
  133. #维持仓位
  134. }#结束证券代码循环
  135. #既然已经更新所有交易,是时候将其在订单簿中做标记
  136. updatePortf(Portfolio=portfolio,Dates=CurrentDate)
  137. updateAcct(account,Dates=CurrentDate)
  138. updateEndEq(account,Dates=CurrentDate)
  139. }#结束日期循环
  140. #最终的数值
  141. cat('Return:',(getEndEq(Account=account,Date=CurrentDate)-initEq)/initEq,'\n')
  142. if(require(quantmod)){
  143. for(symbol in symbols){
  144.     dev.new()
  145.     chart.Posn(Portfolio="Turtles",Symbol=symbol)
  146.     }
  147.     }
  148. if(require(PerformanceAnalytics)){
  149. return=Delt(getAccount(account)$summary$End.Eq)
  150. dev.new()
  151. charts.PerformanceSummary(as.zoo(return),main="turtle demo performance")
  152. dev.new()
  153. charts.PerformanceSummary(PortfReturns('turtles'),
  154. main='Turtle Demo Instrument Return On Equity',geometric=FALSE)}
  155. getEndEq(account,Sys.time())
复制代码
海龟交易系统.rar (2.48 KB, 需要: 1 个论坛币) 本附件包括:
  • 海龟交易系统.R

另外有对量化投资感兴趣的,可以加群:226224941 相互讨论学习。





二维码

扫码加我 拉你入群

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

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

关键词:海龟交易 交易系统 回复可见 R语言 portofolio 交易系统

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
jerker + 48 + 48 + 1 + 1 + 1 精彩帖子
fantuanxiaot + 50 + 50 + 1 + 1 + 1 精彩帖子

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

本帖被以下文库推荐

今天,我持续不断地改进自己,在各方面,我会越来越好!
lasgpope 学生认证  发表于 2015-4-26 12:13:56 来自手机 |显示全部楼层 |坛友微信交流群
tianjixuetu 发表于 2015-4-26 11:49
本代码来至于量化投资:以R语言为工具
我保证全部来至于书上,一个字没改,花了我一整天时间打上来,但是, ...
支持一下。。。。。

使用道具

duyang76 发表于 2015-4-26 12:16:36 |显示全部楼层 |坛友微信交流群
谢谢分享,下来看看。顶!

使用道具

kerrydu 发表于 2015-4-26 12:22:14 来自手机 |显示全部楼层 |坛友微信交流群
tianjixuetu 发表于 2015-4-26 11:49
本代码来至于量化投资:以R语言为工具
我保证全部来至于书上,一个字没改,花了我一整天时间打上来,但是, ...
这么厉害

使用道具

uriyliu 发表于 2015-4-26 12:34:35 |显示全部楼层 |坛友微信交流群
谢谢分享!

使用道具

厉害。。。。

使用道具

fanyonghui 发表于 2015-4-26 13:30:01 |显示全部楼层 |坛友微信交流群
zx xc cv c vc vb v cb g gh  kjk

使用道具

up ,顺便看看。

使用道具

liying534 发表于 2015-4-26 14:27:44 |显示全部楼层 |坛友微信交流群

使用道具

herolaplace 发表于 2015-4-26 14:46:59 |显示全部楼层 |坛友微信交流群
回复看看看看

使用道具

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

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

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

GMT+8, 2024-4-18 20:29