跨期套利
與跨品種套利不同,跨期套利是對同一市場,同一品種,不同到期月份的合約之間進行套利,這其中涉及到非主力合約的問題。非主力合約成交量比較小,有的甚至低到幾十數百手,很容易被幾手交易量將價格拉至異常。這種異常實際較難捕捉,只會放大回測結果。我們以滬鎳為例,其主力合約主要在1,5,9月交割,其余月份成交量很低。而1月交割合約活躍期為7月至12月,5月交割合約活躍期11月到來年4月,所以在構建1月交割合約和5月交割合約的套利組合時,我們選擇11、12月作為套利策略實施的時間進行測試,12月底若有持倉強行平倉。這個時間內,1月交割合約為主力合約,5月交割合約為次主力合約。
在套利時,我們需要計算均衡價差,一般來說有兩種算法:
模擬交割法:通過模擬交割過程各項費用,來計算套利過程中的各項成本,從而得出均衡價差。優點:容易計算,價差變化下;缺點:實際中價差很少恢復到這一水平
歷史滯后均值法:通過歷史的價差,選擇時間窗口長度,得到均衡價差。優點:容易計算,價差動態;缺點:不能保證樣本外價差恢復到這一水平
我們以選定套利組合的開盤價差為對象,使用歷史滯后均值法,取N日價差均值為中線,中線加上N日價差M倍均值為上軌,中線減去N日價差M倍均值為下軌來構造布林帶通道,當價差突破上軌,做空價差。我們選擇1,5,9這三個月份交割合約,滾動的進行測試,其中1-5合約測試的時間為11月和12月,5-9合約測試的時間為3月和4月,9-1合約測試的時間為7月和8月,所以全年有半年時間不進行操作。
成交價設置為當日開盤價。這里,考慮到次主力合約成交量可能較少,我們設置為3個滑點。
開倉信號為價差超過上軌或者突破下軌,信號觸發當天即按所設定的成交價進行成交。平倉信號達到中線附近或者,所設定的套利期現結束強行平倉。
手續費設為6元一手
回測時間為2015年5月至2017年4月
暫不考慮止損。
universe = ‘NIM0’ # 策略期貨合約
start = ‘2015-05-18’ # 回測開始時間
end = ‘2017-04-31’ # 回測結束時間
capital_base = 1000000 # 初試可用資金
refresh_rate = 1 # 調倉周期
freq = ‘d’ # 調倉頻率:m-> 分鐘;d-> 日
margin_rate = 0.09
commission = {‘NI’: (6, ‘perShare’)}
slippage = Slippage(3, ‘perShare’)
months = [‘07’, ‘08’, ‘11’, ‘12’, ‘03’, ‘04’]
mid, up, low = [], [], []
def initialize(futures_account): # 初始化虛擬期貨賬戶,一般用于設置計數器,回測輔助變量等。
futures_account.mean = deque([], maxlen=10)
futures_account.std = deque([], maxlen=10)
def handle_data(futures_account): # 回測調倉邏輯,每個調倉周期運行一次,可在此函數內實現信號生產,生成調倉指令。
if futures_account.current_date[5:7] in [‘11’, ‘12’]:
M0 = universe[:2] + str(int(futures_account.current_date[2:4])+1) + ‘01’
M1 = universe[:2] + str(int(M0[2:4])+(int(M0[4:])+4)/12)+’0’+str((int(M0[4:])+4)%12)
elif futures_account.current_date[5:7] in [‘07’, ‘08’]:
M0 = universe[:2] + str(int(futures_account.current_date[2:4])) + ‘09’
M1 = universe[:2] + str(int(M0[2:4])+(int(M0[4:])+4)/12)+’0’+str((int(M0[4:])+4)%12)
elif futures_account.current_date[5:7] in [‘03’, ‘04’]:
M0 = universe[:2] + str(int(futures_account.current_date[2:4])) + ‘05’
M1 = universe[:2] + str(int(M0[2:4])+(int(M0[4:])+4)/12)+’0’+str((int(M0[4:])+4)%12)
總結
- 上一篇: 人工神经网络连接方式,全连接神经网络作用
- 下一篇: 计算机图形学:B样条画枫叶