R语言blotter包回测实例
下面使用Faber策略,對招商銀行歷史數(shù)據(jù)進(jìn)行回測。 Faber策略是個非常簡單的戰(zhàn)術(shù)資產(chǎn)配置方法: 如果月收盤價高于10月均線,買入; 如果月收盤價低于10月均線,賣出。 (忽略交易成本和滑點(diǎn))
http://static.squarespace.com/static/510654e4e4b0c3c708391d25/t/51dad95ee4b084dcc6296bad/1373296990025/mebanefaber_2013_full.pdf
初始化: 初始化一個現(xiàn)金和一個股票工具
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è)立時區(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)")
| ? |
#初始化組合和賬戶
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ī)則的實現(xiàn)。在這個過程中實現(xiàn)組合和賬戶的更新。
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 ) {
#進(jìn)入多頭頭寸(買入)
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)
}
結(jié)果如下:
注:這個例子是基于quantstrat包的demo:faber.R來寫的。
#評價交易表現(xiàn) chart.Posn函數(shù)可以繪出交易、頭寸、累計盈虧和回撤。 getTxns函數(shù)是成交統(tǒng)計,輸出值包括成交量(股),成交價格,成交額(元),平均成本,盈虧 tradeStats函數(shù)是一個交易過程的統(tǒng)計。
chart.Posn(b.strategy, Symbol = "ZSYH", Dates = "2008::", theme = myTheme)
?
| ? |
getTxns(Portfolio = b.strategy, Symbol = "ZSYH")
(tstats <- tradeStats(Portfolio = b.strategy, Symbol = "ZSYH"))
使用PerformanceAnalytics包來評價交易表現(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 #計算年化回報和年化的夏普比
總結(jié)
以上是生活随笔為你收集整理的R语言blotter包回测实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言blotter包及相关工具
- 下一篇: 从Prism中学习设计模式之MVVM 模