海龟交易系统R代码_第1页
海龟交易系统R代码_第2页
海龟交易系统R代码_第3页
海龟交易系统R代码_第4页
海龟交易系统R代码_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、河北稳升软件科技有限公司 量化云网站海龟交易系统R代码著名的商品投机家理查德·丹尼斯想弄清楚伟大的交易员是天生造就的还是后天培养的。为此,在1983年他招募了13个人,教授给他们期货交易的基本概念,以及他自己的交易方法和原则。 “学员们被称为海龟(丹尼斯先生说这项计划开始时他刚刚从亚洲回来,他解释了自己向别人说过的话,我们正在成长为交易员,就象在新加坡他们正在成长为海龟一样)。”海龟成为交易史上最著名的实验,因为在随后的四年中海龟们取得了年均复利80%的收益。 丹尼斯证明用一套简单的系统和法则,可以使仅有很少或根本没有交易经验的人成为优秀的交易员。 当时,海龟们认为应对理查德

2、3;丹尼斯负责,商定甚至在他们议定的10年保密协定于1993年终止后也不泄露这些法则。但是,有个别海龟在网站上出售海龟交易法则而谋取钱财。两个原版海龟科蒂斯·费思和阿瑟·马多克,为了阻止个别海龟对知识产权的偷窃和出售海龟交易法则而赚钱的行为,决定在网站上将海龟交易法则免费公之于众。我们现在能看到的海龟交易法则,既是由此所得。海龟交易系统是一个完整的交易系统,它包括:市场买卖什么头寸规模买卖多少入市何时买卖止损何时退出亏损的头寸离市何时退出赢利的头寸策略如何买卖R代码(来自Blotter包)如下:# - 海龟系统  #1 # 载入所需的库require(q

3、uantmod)require(TTR)require(blotter) # 清理R环境,如果该demo程序之前运行过try(rm("account.turtles","portfolio.turtles",pos=.blotter),silent=TRUE)try(rm("portfolio","account","N",             

4、0;  "symbol","symbols","ClosePrice","CurrentDate",                "equity","Units","maxUnits","size","Stop","equity",

5、60;               "TxnPrice","initDate","initEq","Posn","verbose"),silent=TRUE)  # 设定初始值initDate="2008-01-01"initEq=100000print("Initializing portfolio and

6、 account structure")# 构建一个带三只股票的小型组合symbols = c("XLF", "XLP", "XLE")#, "XLY", "XLV", "XLI", "XLB", "XLK", "XLU")currency("USD")for(symbol in symbols)    stock(symbol, currency=&quo

7、t;USD",multiplier=1) #创建函数保存过程值updateStrat <- function(Portfolio, Symbol, TxnDate,        PosUnitsQty, UnitSize, StopPrice, TxnPrice, TxnN) # 作者 Peter Carl             # 描述:   &

8、#160;   # 添加交易事务相关数据到STRATEGY时间序列             # 输入:       # TxnDate: 以ISO 8106格式的交易日期,例如:'2008-09-01'       # PosUnitsQty: 总交易数量(股数)     

9、  # StopPrice: 交易完成价格       # TxnPrice: 最后交易价格       # TxnN: 为最后交易结算N             # 输出:       # 没有输出。在本地命名空间修改STRATEGY    

10、60;        # 函数:       # 保存交易事务与计算,返回投资组合       pname=Portfolio       NewTxn = xts(t(c(PosUnitsQty, UnitSize, StopPrice, TxnPrice, TxnN), order.by=as.POSIXct(TxnDate) 

11、60;     colnames(NewTxn) = c('Pos.Units', 'Unit.Size', 'Stop.Price', 'Txn.Price', 'Txn.N')       Portfolio<-getPortfolio(Portfolio)       PortfolioSymbol$strat <- rbind(Portf

12、olioSymbol$strat, NewTxn)       assign( paste("portfolio",pname,sep='.'), Portfolio, envir=.blotter ) getSymbols(symbols, index.class="POSIXct", from=initDate, source="yahoo")# getSymbols缺省为Date索引。在此我们将其改为用POSIXct。# getSymbols(

13、symbols, index.class=c("POSIXt","POSIXct"), from=initDate, source="yahoo") # 创建一个投资组合对象和一个账户对象portfolio = "turtles"initPortf(name=portfolio,symbols, initDate=initDate)account = "turtles"initAcct(name=account,portfolios="turtles", initD

14、ate=initDate, initEq=initEq) # 该表保存与策略有关的交易事务相关信息# 将其存放到portfolio对象Portfolio<-getPortfolio(portfolio)for(symbol in symbols)  Portfoliosymbol$strat <- xts( as.matrix(t(c(0,0,0,0,0), order.by=as.POSIXct(initDate) )  colnames(Portfoliosymbol$strat) <- c('Pos.Units', '

15、;Unit.Size', 'Stop.Price', 'Txn.Price', 'Txn.N')# 现在再将其放回所属处assign( "portfolio.turtles", Portfolio , envir=.blotter )rm("Portfolio") # 构建指标print("Setting up indicators")for(symbol in symbols)    # 系统 1    #&

16、#160;   # 如果最后的突破导致一个获利交易,就忽略那么20-天突破    #    # 这些值也用于系统2的离场    x=get(symbol)    # 入市 (& System 2 exits)    x$Min20 <- runMin(x,grep('Low',colnames(x), 20)    x$Max20 <- runMax(x,gre

17、p('High',colnames(x),20)     # 离场    x$Min10 <- runMin(x,grep('Low',colnames(x), 10)    x$Max10 <- runMax(x,grep('High',colnames(x),10)     # 系统 2    #    # 总是取55-天突破

18、0;    # 入市    x$Min55 <- runMin(x,grep('Low',colnames(x), 55)    x$Max55 <- runMax(x,grep('High',colnames(x),55)     # 仓位规模参数c('High','Low','Close')    x$N <- ATR(x,c(2,3,

19、4), n=20, maType=EMA, wilder=TRUE),'atr'    assign(symbol,x)# 投资组合参数size = 0.01maxUnits = 4Units=0verbose=TRUE  # 创建交易for( i in 57:NROW(x) ) # 假设所有日期相同  CurrentDate=time(x)i  #print(CurrentDate)  equity = getEndEq(account, CurrentDate)   for(

20、symbol in symbols)    x=get(symbol)    ClosePrice = as.numeric(Cl(xi,)     Posn = getPosQty(Portfolio=portfolio, Symbol=symbol, Date=CurrentDate)    s = tail(getPortfolio(portfolio)symbol$strat,1)      

21、60; Units = as.numeric(s,'Pos.Units')    TxnPrice = as.numeric(s,'Txn.Price')    N = as.numeric(s,'Txn.N')    Stop = as.numeric(s,'Stop.Price')       UnitSize = as.numeric(trunc(size * equity)/

22、(xi-1,'N'*ClosePrice)     # 入市(假设以收盘价填入,因此考虑了滑价)    if( Posn = 0 )       # 初始化多头仓位      if( as.numeric(Hi(xi-1,) > as.numeric(xi-2,'Max55') )         addTxn(Port

23、folio=portfolio, Symbol=symbol,                TxnDate=CurrentDate, TxnPrice=ClosePrice,                TxnQty = UnitSize , TxnFees=0, verbose=verbose

24、)        N = as.numeric(xi-1,'N')        updateStrat(Portfolio=portfolio, Symbol=symbol,                TxnDate = CurrentDate, PosUnitsQty = 1,

25、0;               UnitSize = UnitSize, StopPrice = (ClosePrice-2*N),                TxnPrice = ClosePrice, TxnN = N)      else 

26、;     # 初始化空头仓位      if( as.numeric(Lo(xi-1,)  < as.numeric(xi-2,'Min55') )         addTxn(Portfolio=portfolio, Symbol=symbol,             

27、   TxnDate=CurrentDate, TxnPrice=ClosePrice,                TxnQty = -UnitSize , TxnFees=0, verbose=verbose)        N = as.numeric(xi-1,'N')     &#

28、160;  updateStrat(Portfolio=portfolio, Symbol = symbol,                TxnDate = CurrentDate, PosUnitsQty = Units, UnitSize = UnitSize,              &

29、#160; StopPrice = (ClosePrice +2*N), TxnPrice = ClosePrice, TxnN = N)          else    # 离场和止损    if( ( Posn > 0 && ( as.numeric(Lo(xi-1,)  <  as.numeric(xi-2,'Min20') | Lo(xi-1,)  < Stop )

30、) |        ( Posn < 0 && ( as.numeric(Hi(xi-1,) > as.numeric(xi-2,'Max20') | Hi(xi-1,) > Stop ) ) )         addTxn(Portfolio=portfolio, Symbol=symbol, TxnDate=CurrentDate,     

31、0;          TxnPrice=ClosePrice, TxnQty = -Posn , TxnFees=0, verbose=verbose)        N = as.numeric(xi-1,'N')        updateStrat(Portfolio = portfolio, Symbol = symbol, 

32、60;              TxnDate = CurrentDate, PosUnitsQty = 0, UnitSize = UnitSize,                StopPrice = NA, TxnPrice = ClosePrice, TxnN = N)   

33、else    # 加到多头仓位       if( Posn > 0  && Units < maxUnits && Hi(xi-1,) > ( TxnPrice + N * 0.5 ) )          addTxn(Portfolio=portfolio, Symbol=symbol, TxnDate=CurrentDate,  

34、0;           TxnPrice=ClosePrice, TxnQty = UnitSize , TxnFees=0, verbose=verbose)         N = as.numeric(xi-1,'N')         updateStrat(Portfolio = portfolio, Symb

35、ol = symbol, TxnDate = CurrentDate,              PosUnitsQty = Units+1, UnitSize = UnitSize,              StopPrice = (ClosePrice-2*N), TxnPrice = ClosePrice, TxnN = N)&#

36、160;   else    # 加到空头仓位       if( Posn < 0 && Units < maxUnits && Lo(xi-1,)  < ( TxnPrice - N * 0.5 ) )          addTxn(Portfolio=portfolio, Symbol=symbol, TxnDate=CurrentDate

37、,              TxnPrice=Cl(xi,), TxnQty = -UnitSize , TxnFees=0, verbose=verbose)         N = as.numeric(xi-1,'N')         updateStrat(Portfolio=po

38、rtfolio, Symbol=symbol, TxnDate = CurrentDate,              PosUnitsQty = Units+1, UnitSize = UnitSize, StopPrice = (ClosePrice+2*N),              TxnPrice = ClosePrice, TxnN = N)    #else

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论