我們将利用每日資料制定簡單的交易政策 我們将涵蓋以下内容。
- 一個簡單的介紹性交易。
- 它每天隻根據前一天的價格行為做出交易決定 - 我們用這個例子來介紹前瞻性的偏見
- 布林線是一個使用移動平均線(和移動标準差)的标準技術分析名額的例子
- 一個使用布林線的簡單的均線回複型交易政策 名額作為政策的構件(但與之不同)。 路徑依賴性。止損、盈利目标和持有期是引入路徑依賴的交易政策建構的例子。
- 滑點--我們回顧一下什麼是滑點,我們探讨在交易政策中考慮滑點的問題 - 使用價差的政策,它是兩個價格時間序列的線性組合
簡單的政策:模仿
政策
- 如果收盤價高于開盤價,則在第二天買入
- 否則,在第二天賣出
我們希望這個政策在什麼時候能發揮作用?
- 如果有連續多日價格向同一方向移動的情況
- 每一天的方向與之前的變化不同,對該政策來說都是虧損的一天,是以這樣的日子不應該有大的價格波動。
測試該政策
從現在開始,我們将重複使用實用工具腳本 "utilities.R "中的函數。在這種情況下,我們将使用。
- getLogReturns(prices),從調整後的價格中計算出對數回報。
- getEquityLog(log_ret,pos),從對數收益和倉位向量中計算出股權曲線。
實用功能
getLogReturns <- function(prices) {
# 傳回調整後價格的對數收益
# 假設輸入中存在調整後的價格列
log_ret <- ROC(Ad(prices),type='continuous')
log_ret[1] <- 0
return(log_ret)
}
getEquityCurve <- function(returns,pos,type='log') {
# 股票曲線的簡單回報
if (type=='log')
return(exp(cumsum(returns*pos)) - 1)
else
cat ('Type not supported','\n')
}
複制代碼
股票曲線
我們使用滞後函數将時間序列移動一個位置,是以我們使用前一天的價格來做決定
pos <- ifelse(Cl(prices)-Op(prices)>0,1,-1)
pos <- Lag(pos)
pos[1] <- 0
複制代碼
正确的股票曲線
交換位置
注意到這個政策在所有四個股票上都表現不佳,但在其中三個股票上表現特别差。這表明對政策進行了明顯的改變:做完全相反的事情,即交換多頭和空頭交易,如下所示
pos <- ifelse(Cl(prices)-Op(prices)>0,1,-1)
複制代碼
切換式股票曲線
移動标準差和布林帶
類似于移動平均線,我們現在引入移動(滾動)标準差
我們使用移動平均線和移動标準差來定義布林帶,然後将在我們的下一個交易政策示例中使用
圖表系列
> library(quantmod)
> getSymbols('AAPL')
複制代碼
這使用包中的BBands函數TTR quantmod在chartSeries中結合了xts和TTR功能
政策代碼
我們将使用與相同的循環、收益和權益曲線計算
-
改變的是位置向量的計算
pos <- long + short pos <- lag(pos)
參數
這個政策的參數是什麼?
bbands <- BBands(prices,n=50,sd=2)
複制代碼
兩個明顯的數字參數是。
- n是回溯期,和
- sd是标準偏差的乘數
例子
plot(equity,main='Equity curve')
複制代碼
該政策需要一個參數,即持有期。 當且僅當持有期過後,我們退出交易
通過在計數小于持有期時留在交易中來實作。
run <- function(prices,n,sd,hold) {
bbands <- lag(BBands(prices,n=n,sd=sd))
pos <- rep(0,length=nrow(prices)) # all zeroes
複制代碼
下一個例子 - 止損
- 止損限制了某項交易的損失
- 我們将衡量一筆交易的簡單回報
- 如果它太負,我們将退出交易
getTradeReturn <- function(prices,entry,exit,short=FALSE) {
prices <- as.numeric(prices)
複制代碼
> prices
Adjusted
1970-01-02 100
1970-01-03 110
1970-01-04 100
1970-01-05 150
1970-01-06 200
1970-01-07 100
> getTradeReturn(prices,entry=1,exit=2)
[1] 0.1
> getTradeReturn(prices,entry=1,exit=2,short=T)
[1] -0.09090909
> getTradeReturn(prices,entry=1,exit=4)
[1] 0.5
titStr <- paste("stoploss=", stoploss,":",sum(stopOuts),"stop outs")
plotEquity(prices,pos,stopOuts,titStr); return(pos)
}
複制代碼
利差
- 兩個系列的權重組合(通常是差異)。
政策可以嘗試利用價差中的均值反轉;對于一對股票,這被稱為成對交易
- 與協整理論有關
價差例子
我們将看一下标準普爾500指數和道瓊斯工業指數
pdf('different_screens.pdf')
plot.zoo(prices,col=cols,xlab=xlab,ylab=paste(tickers,ylab),main="")
dev.off()
複制代碼
現在,驚人的相似性是顯而易見的
例子:尋找權重
lookback <- 50
spread <- close1 - positionRatio*close2
複制代碼
- 點差 = x - positionRatio * y
- 當我們賣出y的倉位比例機關時,買入一個機關的x
點差例子
plot.zoo(cbind(spread,0,0.5,-0.5),screen=c(2,2,2,2),main="Spread")
複制代碼
一個價差政策
建立價差的目的是建立一個平穩的時間序列,也就是一個具有恒定平均值和标準差的時間序列。
如果我們成功了,我們就可以在價差遠遠低于其平均值時買入價差(做多廉價産品,做空昂貴産品),在價差高于其平均值時賣出價差。
連續積分理論正是處理平穩的時間序列的線性組合,但我們不會去研究數學。
接下來我們将看到一個簡單的基于布林線的價差交易政策想法。
例子:RSI政策
- RSI是一個标準的名額,在TTR軟體包中實作。
- 它的數值在0到100之間,較高(較低)的數值表示市場最近在上升(下降)。
# RSI 政策
pos <- long + short
pos <- Lag(pos); pos[is.na(pos)] <- 0
return(pos)
}
複制代碼
樣本内和樣本外回測
resultsIn <- backtest(prices[startIn:endIn,],params) # in-sample
resultsOut <- backtest(prices[startOut:endOut,],params) # out-of-sample
複制代碼
繪制圖
#dev.new(width=10, height=5) # prevent elongation of plots
grid.arrange(plot1,plot2,ncol=2)
dev.off()
複制代碼
- 從樣本内結果中挑選參數并不總是容易的
- 資料集的漂移可能導緻良好的參數組合在樣本内和樣本外期間有所不同