R语言blotter包回测实例
下面使用Faber策略,對(duì)招商銀行歷史數(shù)據(jù)進(jìn)行回測(cè)。 Faber策略是個(gè)非常簡(jiǎn)單的戰(zhàn)術(shù)資產(chǎn)配置方法: 如果月收盤(pán)價(jià)高于10月均線,買(mǎi)入; 如果月收盤(pán)價(jià)低于10月均線,賣(mài)出。 (忽略交易成本和滑點(diǎn))
http://static.squarespace.com/static/510654e4e4b0c3c708391d25/t/51dad95ee4b084dcc6296bad/1373296990025/mebanefaber_2013_full.pdf
初始化: 初始化一個(gè)現(xiàn)金和一個(gè)股票工具
currency("RMB")
stock("ZSYH", currency = "RMB", multiplier = 1)
ls(envir = FinancialInstrument:::.instrument) #設(shè)置 .instrument環(huán)境
get("RMB",envir = FinancialInstrument:::.instrument)
Sys.setenv(TZ = "UTC") #設(shè)立時(shí)區(qū)
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)")
| ? |
#初始化組合和賬戶(hù)
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,即1,000,000
ls()
ls(.blotter)
ls(envir = FinancialInstrument:::.instrument)
#Bar-by-bar 處理: 交易規(guī)則的實(shí)現(xiàn)。在這個(gè)過(guò)程中實(shí)現(xiàn)組合和賬戶(hù)的更新。
for( i in 1:nrow(ZSYH) )
{
#對(duì)日期更新
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))#全倉(cāng)
MA <- as.numeric(ZSYH[i,'SMA10m'])
#如有必要改變頭寸
if(!is.na(MA)) #如果移動(dòng)均線開(kāi)始
{
if( Posn == 0 ) {#沒(méi)有頭寸,測(cè)試是否買(mǎi)入
if( ClosePrice > MA ) {
#進(jìn)入多頭頭寸(買(mǎi)入)
addTxn(b.strategy, Symbol='ZSYH', TxnDate=CurrentDate,
TxnPrice=ClosePrice, TxnQty = UnitSize , TxnFees=0) }
} else {#有頭寸,檢測(cè)是否退出
if( ClosePrice < MA ) {
#退出頭寸
addTxn(b.strategy, Symbol='ZSYH', TxnDate=CurrentDate,
TxnPrice=ClosePrice, TxnQty = -Posn , TxnFees=0) }
}
}
#計(jì)算盈虧并更新
updatePortf(b.strategy, Dates = CurrentDate)
updateAcct(b.strategy, Dates = CurrentDate)
updateEndEq(b.strategy, Dates = CurrentDate)
}
結(jié)果如下:
注:這個(gè)例子是基于quantstrat包的demo:faber.R來(lái)寫(xiě)的。
#評(píng)價(jià)交易表現(xiàn) chart.Posn函數(shù)可以繪出交易、頭寸、累計(jì)盈虧和回撤。 getTxns函數(shù)是成交統(tǒng)計(jì),輸出值包括成交量(股),成交價(jià)格,成交額(元),平均成本,盈虧 tradeStats函數(shù)是一個(gè)交易過(guò)程的統(tǒng)計(jì)。
chart.Posn(b.strategy, Symbol = "ZSYH", Dates = "2008::", theme = myTheme)
?
| ? |
getTxns(Portfolio = b.strategy, Symbol = "ZSYH")
(tstats <- tradeStats(Portfolio = b.strategy, Symbol = "ZSYH"))
使用PerformanceAnalytics包來(lái)評(píng)價(jià)交易表現(xiàn)
library(PerformanceAnalytics)
rets <- PortfReturns(Account = b.strategy)
rownames(rets) <- NULL
charts.PerformanceSummary(rets, colorset = redfocus)
tab.perf <- table.Arbitrary(rets, metrics = c("Return.annualized", "SharpeRatio.annualized"),
????metricsNames = c("Annualized Return", "Annualized Sharpe Ratio"))
tab.perf #計(jì)算年化回報(bào)和年化的夏普比
總結(jié)
以上是生活随笔為你收集整理的R语言blotter包回测实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: R语言blotter包及相关工具
- 下一篇: R语言quantstrat包