等距離股票配對量化交易策略-R語言

爲了分散交易中的風險,咱們能夠在量化交易中選擇市場中性策略。segmentfault

咱們選擇具備基本面相關性的股票對,價格趨勢具備趨同和趨離,買多強勢的股票,賣空弱勢的股票,同時交易,控制股市風險。函數

案例是石油公司埃克森美孚(NYSE:XOM)和石油公司雪佛龍(NYSE:CVX)性能

公司簡介:埃克森美孚公司於1882年在美國新澤西州成立,公司的分部及附屬公司在美國和世界上大多數其餘國家經營或買賣產品。公司主要業務爲能源,涉及勘探、生產、原油和自然氣;生產石油產品;運輸和銷售原油、自然氣和石油產品。公司是石油化工商品的製造商和銷售商,包括烯烴、芳烴、聚乙烯和聚丙烯塑料和各類特點產品。此外,公司還擁有發電設施的利益。公司也是全球主要的石化產品生產商和營銷商,並參與發電。

file

公司簡介: 雪佛龍股份有限公司於1926年在美國特拉華州註冊成立。公司經營範圍包括石油和化學工業的各個方面。上游業務主要包括勘探、開發及生產原油及自然氣;加工、液化、運輸和液化自然氣再氣化;主要的國際石油出口管道輸送原油;運輸、儲存和銷售自然氣;一個自然氣合成油項目。下游業務主要包括將原油提煉爲石油產品;營銷原油及其成品;經過管道、海洋船舶、電機設備和軌道車運送原油和成品油;製造和銷售在工業用途、燃料和潤滑油添加劑上應用的石化產品、塑料。

file

回測

# 載入量化和績效分析庫
library(quantmod)
library(PerformanceAnalytics)

# 下載股價和提取收盤價函數
get_symbol_cl <- function(symbol) {
  getSymbols(symbol,
             src = "yahoo",
             from = "2010-01-01",
             to = "2016-01-01")
  temp <- Ad(get(symbol))
  return(temp)
}

# 計算收益率函數
ret_normalize <- function(ret) {
  ret[1] <- 0
  norm_ret <- cumprod(1 + ret)
  return(norm_ret)
}

# 下載埃克森美孚(NYSE:XOM)和雪佛龍(NYSE:CVX)股票的收盤價
# 選擇的股票對應該有明顯的趨同和驅離,同向不行,例如道瓊斯指數和標普500指數
xom <- get_symbol_cl("XOM")
cvx <- get_symbol_cl("CVX")

# 計算收益率
ret_xom <- Delt(xom)
colnames(ret_xom) <- "ret_xom"
ret_cvx <- Delt(cvx)
colnames(ret_cvx) <- "ret_cvx"

# 轉化爲標準化收益率
norm_xom <- ret_normalize(ret_xom)
norm_cvx <- ret_normalize(ret_cvx)

# 標準化價格差,均值和標準差
diff <- norm_xom - norm_cvx
me <- mean(diff)
std <- sd(diff)

# 標準差的上下邊界,這是最重要的數據
n <- 1
ub <- me + n * std
lb <- me - n * std

# 回測信號,用向量化的ifelse,性能更好
# 1買XOM賣CVX,-1賣XOM買CVX,0空倉
signal <- NULL
signal <- ifelse(diff > ub, -1,
                 ifelse(diff < lb, 1, 0))

# 標準化價格差、價差和交易信號
par(mfrow = c(3, 1))
plot(
  cbind(norm_xom, norm_cvx),
  main = "埃克森美孚 & 雪佛龍 標準價格",
  col = c("black", "red"),
  ylim = c(0.5, 2),
  ylab = "標準價格"
)
plot(diff,main="價格差")
plot(signal,main="交易信號")

file

# 回測交易
# 不考慮全部費用和滑點
spread_return <- ret_xom - ret_cvx
cost <- 0
trade_return <- spread_return*lag(signal)-cost
names(trade_return) <- "TradStrat_PT#1"

# 交易效果和績效指標
summary(as.vector(trade_return))
cumm_ret <- Return.cumulative(trade_return)
annual_ret <- Return.annualized(trade_return)
par(mfrow=c(1,1))
charts.PerformanceSummary(trade_return,main="交易報告")

maxDrawdown(trade_return)
StdDev(trade_return)
StdDev.annualized(trade_return)
VaR(trade_return)
SharpeRatio(trade_return,Rf=0,FUN="StdDev")
SharpeRatio.annualized(trade_return,Rf=0)

file

交易效果和績效指標

> # 交易效果和績效指標
> summary(as.vector(trade_return))
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max.       NA's 
-0.0373405  0.0000000  0.0000000  0.0002067  0.0000000  0.0329959          1 

> tail(cumm_ret)
                  TradStrat_PT#1
Cumulative Return      0.3460039

> maxDrawdown(trade_return)
[1] 0.1077101

> StdDev(trade_return)
              [,1]
StdDev 0.004425325

> StdDev.annualized(trade_return)
                              TradStrat_PT#1
Annualized Standard Deviation     0.07024986

> VaR(trade_return)
    TradStrat_PT#1
VaR   -0.005450908

> SharpeRatio(trade_return,Rf=0,FUN="StdDev")
                              TradStrat_PT#1
StdDev Sharpe (Rf=0%, p=95%):     0.04671048

> SharpeRatio.annualized(trade_return,Rf=0)
                                TradStrat_PT#1
Annualized Sharpe Ratio (Rf=0%)      0.7241807
>

下一步優化方向

這個策略的優化關鍵是:優選股票對,尋找上下邊界n的值優化

感謝閱讀,歡迎關注和留言> 感謝閱讀,歡迎關注和留言 量化投資與期貨外匯散仙,基金保險水平也拿的出手
相關文章
相關標籤/搜索