R语言quantstrat包
在引入blotter包之后,一個完整的交易系統就已經可以建立起來了。但是作為盈利的基礎,基于quantmod和TTR雖然具有了必要的建模工具,我們依然希望能夠有更加靈活易用的交易建模方法。這就是quantstrat包的目標。
(1) quantstrat包簡介
quantstrat包以xts,quantmod,TTR,blotter等為基礎,提供了基于交易信號的金融交易建模和回測的基礎架構。利用quantstrat包可以相當大程度上簡化建立或檢驗交易策略的過程。quantstrat包的名字就是量化策略。
quantstrat包和blotter包都是R-forge上TradeAnalytics項目的組成部分。也是一個依然在開發中的包。
http://r-forge.r-project.org/projects/blotter/
它的主要特征是:
支持應用于多資產多幣種的投資組合;支持包括指標(indicators),信號(signals)和交易規則(rules)的完整的交易策略;支持包括market, limit, stoplimit, 和stoptrailing等在內的多種委托(訂單,指令order)方式;支持委托規模(order sizing)和參數優化。
quantstrat包進行策略建模的基本思路是:
(i)初始化金融產品導入數據
(ii)依次引入指標、信號和規則以形成策略,按照策略下達指令。
指標是指源自交易數據的一個數量值:如均線、MACD等;
信號是指指標在某些交易時點和交易數據相互作用的結果,比如交叉、閾值、底頂等;
規則是指結合交易數據、信號以及當前的組合和賬戶情況進而做出委托(下達指令)的準則。
(iii)指令和市場數據的交互生成一個交易(transaction),按照交易情況更新組合和賬戶。
主要函數:
(i)初始化:
initOrders 初始化指令容器(order container)
strategy strategy 對象的構造器
(ii)定義策略
add.indicator 為策略加入一個指標
add.signal 為策略加入一個信號
add.rule 為策略加入一個規則
add.distribution 為策略的參數集合加入一個分布
add.constraint 為一個參數集上的兩個分布加入約束
(iii)運用策略
applyStrategy 把策略運用到數據上
addPosLimit 在時間戳上加上頭寸和等級限制(level limits)
apply.paramset 把參數集合運用到策略上
applyStrategy.rebalancing 把策略運用到周期性調整的數據上
(2)基于quantstrat包的回測:單資產情況
現在可以結合quantstrat包和blotter包給出一個更好的量化策略回測。 首先做初始化,這里包括blotter包里邊對金融工具和賬戶和組合的初始化,也包括quantstrat包對策略和指令的初始化。
下面以之前做過的faber策略為例。
#金融產品初始化
library(quantstrat)
currency("RMB")
stock("ZSYH", currency = "RMB", multiplier = 1)
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)
#初始化組合和賬戶
q.strategy <- "qFaber"
initPortf(q.strategy, "ZSYH", initDate = "2007-12-31")
initAcct(q.strategy, portfolios = q.strategy, initDate = "2007-12-31", initEq = 1e+06) #初始的資金是1e6,即1,000,000
# 初始化指定和策略
initOrders(portfolio = q.strategy, initDate = "2007-12-31")
strategy(q.strategy, store = TRUE)
ls(all = T) #quantstrat創建了.strategy環境
# 策略是什么呢?看一下
strategy <- getStrategy(q.strategy)
summary(strategy)
?
下面是quantstrat包的關鍵:加入指標、信號和規則。
# 加入一個指標,10月均線
add.indicator(strategy = q.strategy, name = "SMA", arguments = list(x = quote(Cl(mktdata)),n = 10), label = "SMA10")
# 加入信號,向上交叉10月線,向下交叉10月線
add.signal(q.strategy, name = "sigCrossover", arguments = list(columns = c("Close","SMA10"), relationship = "gt"), label = "Cl.gt.SMA")
add.signal(q.strategy, name = "sigCrossover", arguments = list(columns = c("Close","SMA10"), relationship = "lt"), label = "Cl.lt.SMA")
# 加入規則,買入規則和賣出規則
add.rule(q.strategy, name = "ruleSignal", arguments = list(sigcol = "Cl.gt.SMA",
??? sigval = TRUE, orderqty = 900, ordertype = "market", orderside = "long",
??? pricemethod = "market"), type = "enter", path.dep = TRUE) # 買入數量為900股
add.rule(q.strategy, name = "ruleSignal", arguments = list(sigcol = "Cl.lt.SMA",
??? sigval = TRUE, orderqty = "all", ordertype = "market", orderside = "long",
??? pricemethod = "market"), type = "exit", path.dep = TRUE)
# 此時的策略對象
summary(getStrategy(q.strategy))## Length Class Mode
現在的策略strategy中有1個指標,2種信號和相應的兩個規則(買入、賣出)。
下面開始使用這個策略:
out <- applyStrategy(strategy = q.strategy, portfolios = q.strategy)
summary(out)
mktdata["2013"]
mktdata是在執行策略過程中創建的一個特殊的變量,包含了原交易數據的時間序列以及指標和信號。在我們上面的ZSYH里,在2013年6月出現一次賣出的信號。
接下來對相關對象(組合、賬戶和權益價值)進行更新
updatePortf(q.strategy)
updateAcct(q.strategy)
updateEndEq(q.strategy)
最后按照現在的組合和賬戶情況給出策略表現
myTheme <- chart_theme()
myTheme$col$dn.col <- "lightgreen"
myTheme$col$up.col <- "lightblue"
myTheme$col$dn.border <- "grey"
myTheme$col$up.border <- "grey"
# 策略表現可視化
chart.Posn(q.strategy, Symbol = "ZSYH", Dates = "2008::", theme = myTheme)
# 交易統計
(tstats <- tradeStats(Portfolio = q.strategy, Symbol = "ZSYH"))
# 指令簿(order book)
ob <- getOrderBook(q.strategy)
head(ob$qFaber$ZSYH)
#quantstrat包給出了MAE(maximum adverse excursion)和MFE(maximum favorable excursion)的圖形
chart.ME(Portfolio = q.strategy, Symbol = "ZSYH", type = "MAE", scale = "percent")
chart.ME(Portfolio = q.strategy, Symbol = "ZSYH", type = "MFE", scale = "percent")
原文:http://site.douban.com/182577/widget/notes/10568316/note/313993652/
總結
以上是生活随笔為你收集整理的R语言quantstrat包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从Prism中学习设计模式之MVVM 模
- 下一篇: 分类算法——K近邻算法及其R实现