R语言blotter包回测实例

来源:互联网 发布:医疗行业数据分析 编辑:程序博客网 时间:2024/05/25 20:00

下面使用Faber策略,对招商银行历史数据进行回测。Faber策略是个非常简单的战术资产配置方法:如果月收盘价高于10月均线,买入;如果月收盘价低于10月均线,卖出。(忽略交易成本和滑点)
http://static.squarespace.com/static/510654e4e4b0c3c708391d25/t/51dad95ee4b084dcc6296bad/1373296990025/mebanefaber_2013_full.pdf

初始化:初始化一个现金和一个股票工具
currency("RMB")

stock("ZSYH", currency = "RMB", multiplier = 1)

ls(envir = FinancialInstrument:::.instrument) #设置.instrument环境

get("RMB",envir = FinancialInstrument:::.instrument)

Sys.setenv(TZ = "UTC") #设立时区

ZSYH <- getSymbols("600036.ss", from = "2008-01-01", to =Sys.Date(), src = "yahoo",

   auto.assign = FALSE)

ZSYH <- to.monthly(ZSYH, indexAt = "endof")

ZSYH$SMA10m <- SMA(Cl(ZSYH), 10)

 

#绘制月k线及10月均线

myTheme <- chart_theme()

myTheme$col$dn.col <- "lightgreen"

myTheme$col$up.col <- "lightblue"

myTheme$col$dn.border <- "grey"

myTheme$col$up.border <- "grey"

chart_Series(x = ZSYH, theme = myTheme, name = "ZSYH", TA ="add_SMA(n=10,col=4)")

R语言blotter包回测实例

 

#初始化组合和账户

b.strategy <- "bFaber"

initPortf(b.strategy, "ZSYH", initDate = "2007-12-31")

initAcct(b.strategy, portfolios = b.strategy, initDate ="2007-12-31", initEq = 1e+06) #初始的资金是1e6,即1000000

ls()

ls(.blotter)

ls(envir = FinancialInstrument:::.instrument)

#Bar-by-bar 处理: 交易规则的实现。在这个过程中实现组合和账户的更新。

for( i in 1:nrow(ZSYH) )

{

#对日期更新

CurrentDate <- time(ZSYH)[i]

equity<-getEndEq(b.strategy, CurrentDate)

ClosePrice <- as.numeric(Cl(ZSYH[i,]))

Posn <- getPosQty(b.strategy, Symbol='ZSYH',Date=CurrentDate)

UnitSize<-as.numeric(trunc(equity/ClosePrice))#全仓

MA <- as.numeric(ZSYH[i,'SMA10m'])

#如有必要改变头寸

if(!is.na(MA)) #如果移动均线开始

{

if( Posn == 0 ) {#没有头寸,测试是否买入

if( ClosePrice > MA ) {

#进入多头头寸(买入)

addTxn(b.strategy, Symbol='ZSYH', TxnDate=CurrentDate,

TxnPrice=ClosePrice, TxnQty = UnitSize , TxnFees=0) }

} else {#有头寸,检测是否退出

if( ClosePrice < MA ) {

#退出头寸

addTxn(b.strategy, Symbol='ZSYH', TxnDate=CurrentDate,

TxnPrice=ClosePrice, TxnQty = -Posn , TxnFees=0) }

}

}

#计算盈亏并更新

updatePortf(b.strategy, Dates = CurrentDate)

updateAcct(b.strategy, Dates = CurrentDate)

updateEndEq(b.strategy, Dates = CurrentDate)

}

结果如下:

R语言blotter包回测实例


注:这个例子是基于quantstrat包的demofaber.R来写的。

#评价交易表现chart.Posn函数可以绘出交易、头寸、累计盈亏和回撤。getTxns函数是成交统计,输出值包括成交量(股),成交价格,成交额(元),平均成本,盈亏tradeStats函数是一个交易过程的统计。

chart.Posn(b.strategy, Symbol = "ZSYH", Dates = "2008::", theme =myTheme)

 R语言blotter包回测实例

 


getTxns(Portfolio = b.strategy, Symbol = "ZSYH")
R语言blotter包回测实例

(tstats <- tradeStats(Portfolio = b.strategy, Symbol ="ZSYH"))
R语言blotter包回测实例

使用PerformanceAnalytics包来评价交易表现

library(PerformanceAnalytics)
rets <- PortfReturns(Account = b.strategy)
rownames(rets) <- NULL
charts.PerformanceSummary(rets, colorset = redfocus)

R语言blotter包回测实例
tab.perf <- table.Arbitrary(rets, metrics =c("Return.annualized", "SharpeRatio.annualized"),
    metricsNames= c("Annualized Return", "Annualized Sharpe Ratio"))
tab.perf #
计算年化回报和年化的夏普比

R语言blotter包回测实例

0 0