# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
from gm.api import *
import numpy as np
def init(context):
# 選擇的兩個合約
context.symbol = ['DCE.j1901', 'DCE.jm1901']
# 訂閱歷史數據
subscribe(symbols=context.symbol,frequency='1d',count=11,wait_group=True)
def on_bar(context, bars):
# 數據提取
j_close = context.data(symbol=context.symbol[0],frequency='1d',fields='close',count=31).values
jm_close = context.data(symbol=context.symbol[1],frequency='1d',fields='close',count=31).values
# 提取最新價差
new_price = j_close[-1] - jm_close[-1]
# 計算歷史價差,上下限,止損點
spread_history = j_close[:-2] - jm_close[:-2]
context.spread_history_mean = np.mean(spread_history)
context.spread_history_std = np.std(spread_history)
context.up = context.spread_history_mean + 0.75 * context.spread_history_std
context.down = context.spread_history_mean - 0.75 * context.spread_history_std
context.up_stoppoint = context.spread_history_mean + 2 * context.spread_history_std
context.down_stoppoint = context.spread_history_mean - 2 * context.spread_history_std
# 查持倉
position_jm_long = context.account().position(symbol=context.symbol[0],side=1)
position_jm_short = context.account().position(symbol=context.symbol[0],side=2)
# 設計買賣信號
# 設計開倉信號
if not position_jm_short and not position_jm_long:
if new_price > context.up:
print('做空價差組合')
order_volume(symbol=context.symbol[0],side=OrderSide_Sell,volume=1,order_type=OrderType_Market,position_effect=1)
order_volume(symbol=context.symbol[1], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Open)
if new_price < context.down:
print('做多價差組合')
order_volume(symbol=context.symbol[0], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Open)
order_volume(symbol=context.symbol[1], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Open)
# 設計平倉信號
# 持jm多倉時
if position_jm_long:
if new_price >= context.spread_history_mean:
# 價差回歸到均值水平時,平倉
print('價差回歸到均衡水平,平倉')
order_volume(symbol=context.symbol[0], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
order_volume(symbol=context.symbol[1], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
if new_price < context.down_stoppoint:
# 價差達到止損位,平倉止損
print('價差超過止損點,平倉止損')
order_volume(symbol=context.symbol[0], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
order_volume(symbol=context.symbol[1], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
# 持jm空倉時
if position_jm_short:
if new_price <= context.spread_history_mean:
# 價差回歸到均值水平時,平倉
print('價差回歸到均衡水平,平倉')
order_volume(symbol=context.symbol[0], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
order_volume(symbol=context.symbol[1], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
if new_price > context.up_stoppoint:
# 價差達到止損位,平倉止損
print('價差超過止損點,平倉止損')
order_volume(symbol=context.symbol[0], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
order_volume(symbol=context.symbol[1], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
if __name__ == '__main__':
'''
strategy_id策略ID,由系統生成
filename文件名,請與本文件名保持一致
mode實時模式:MODE_LIVE回測模式:MODE_BACKTEST
token綁定計算機的ID,可在系統設置-密鑰管理中生成
backtest_start_time回測開始時間
backtest_end_time回測結束時間
backtest_adjust股票復權方式不復權:ADJUST_NONE前復權:ADJUST_PREV后復權:ADJUST_POST
backtest_initial_cash回測初始資金
backtest_commission_ratio回測傭金比例
backtest_slippage_ratio回測滑點比例
'''
run(strategy_id='strategy_id',
filename='main.py',
mode=MODE_BACKTEST,
token='token',
backtest_start_time='2018-02-01 08:00:00',
backtest_end_time='2018-12-31 16:00:00',
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=2000000,
backtest_commission_ratio=0.0001,
backtest_slippage_ratio=0.0001)