期货连续主力合约问题

策略分享
标签: #<Tag:0x00007f25a1c984e8>

(Hugo999) #1

老师好,这是从社区克隆来的简单的海龟策略,我现在想尝试在更大时间周期上去看一下这个策略。比如我想在橡胶连续主力合约上回测从09年2月到19年2月,这个海龟策略的收益,该怎么处理?谢谢

克隆策略
In [9]:
import talib
import numpy as np
def initialize(context):
    # 设置是否是结算模式
    context.set_need_settle(False)
    # 设置最大杠杆
    context.set_max_leverage(1,'fill_amap')
    # 设置参数
    context.window = 20
def handle_data(context, data):
    
    if context.trading_day_index < context.window : # 在形成均线后才开始交易
        return
    
    today = data.current_dt.strftime('%Y-%m-%d') # 当前交易日期

    instrument = context.future_symbol(context.instruments[0]) # 交易标的
    curr_po = context.portfolio.positions[instrument] # 组合持仓
    curr_position = curr_po.amount # 持仓数量
    price = data.current(instrument, 'price') # 当前价格
    
    # 计算20天内最高价、最低价
    high_price = data.history(instrument, 'price', context.window, '1d').max()
    low_price = data.history(instrument, 'price', context.window, '1d').min()
    # 交易逻辑
    if price >= high_price and data.can_trade(instrument):
        context.order_target(instrument, 20) # 买入开仓
        print(today, curr_position, '买入开仓')
    elif price <= low_price and data.can_trade(instrument):
        context.order_target(instrument, -20) # 卖出开仓
        print(today, curr_position, '卖出开仓')
#启动回测
#策略回测接口: https://bigquant.com/docs/module_trade.html
m = M.trade.v3(
    instruments= ['RU1809.SHF'],
    start_date='2017-11-01',
    end_date='2018-06-01',
    initialize=initialize,
    handle_data=handle_data,
    # 买入订单以开盘价成交
    order_price_field_buy='open',
    # 卖出订单以开盘价成交
    order_price_field_sell='open',
    capital_base=1000000,
    benchmark='RU1809.SHF',
    m_deps=np.random.rand()
)
2017-12-04 0 买入开仓
2018-01-19 20 卖出开仓
2018-01-23 -20 卖出开仓
2018-01-24 -20 卖出开仓
2018-01-30 -20 卖出开仓
2018-01-31 -20 卖出开仓
2018-02-01 -20 卖出开仓
2018-02-06 -20 卖出开仓
2018-02-08 -20 卖出开仓
2018-03-19 -20 卖出开仓
2018-03-20 -20 卖出开仓
2018-03-21 -20 卖出开仓
2018-03-22 -20 卖出开仓
2018-03-23 -20 卖出开仓
2018-03-26 -20 卖出开仓
2018-04-04 -20 卖出开仓
2018-04-16 -20 卖出开仓
2018-04-17 -20 卖出开仓
  • 收益率34.26%
  • 年化收益率68.06%
  • 基准收益率-16.99%
  • 阿尔法0.39
  • 贝塔-0.63
  • 夏普比率1.29
  • 胜率0.5
  • 盈亏比2.86
  • 收益波动率45.94%
  • 信息比率0.1
  • 最大回撤18.91%

(polll) #2

在主力上进行测试,我测试了一年的,你可以根据自己情况修改开始结束日期,可以参考:

克隆策略

ATR突破择时策略

ATR是Average True Range平均真实范围的简称,利用这个指标,可以构建一个基于价格波动的通道。

当价格往上突破通道上轨时,买入股票

当价格往下突破通道下轨时,卖出股票

1. 策略参数

In [1]:
# 1. 策略基本参数
def prepare(context):
    # 策略比较参考标准,以沪深300为例
    benchmark = '000300.INDX'

2. 策略主体函数

In [2]:
# 初始化虚拟账户状态,只在第一个交易日运行
def initialize(context):
    # 设置是否是结算模式
    context.set_need_settle(False)
    # 设置手续费,PerContract 说明是每手手续费多少,分别是开仓、平昨、平今
    context.set_commission(equities_commission=None, futures_commission=None) # 手续费按系统默认手续费设置
    # 设置最大杠杆
    context.set_max_leverage(0.6, 'fill_amap') # 这里能够设置最大杠杆
    context.observation = 30
    context.width = 2
    context.ma_length = 25
    
def handle_data(context, data):
    
    if context.trading_day_index < context.observation: # 在30个交易日以后才开始真正运行
        return
    today = data.current_dt.strftime('%Y-%m-%d') # 当前交易日期
    instrument = context.future_symbol(context.instruments[0]) # 交易标的
    curr_po=context.portfolio.positions[instrument] # 持仓
    curr_position = curr_po.amount  # 持仓数量
     
    price = data.current(instrument, 'price')  # 当前价格
    high_price= np.array(data.history(instrument, 'high', context.observation, '1d')) # high
    low_price= np.array(data.history(instrument, 'low', context.observation, '1d')) # low
    close_price= np.array(data.history(instrument, 'close', context.observation, '1d')) # close_price

    # 判断获取的数据中多少天是缺失数据,如果全是缺失数据,是不能计算ATR指标的
    nan_num = [k for k in [np.isnan(i) for i in close_price] if k == True]
    if len(nan_num) == context.observation:
        return

    # 创建ATR买卖信号,包括最高价,最低价,收盘价和参数timeperiod
    # 注意:ATR函数使用的price必须是narray
    import talib
    atr = talib.ATR(high_price,low_price,close_price, timeperiod=context.ma_length)[-1]
    ma = data.history(instrument, 'high', context.ma_length, '1d').mean()
    high_line = ma + context.width * atr # 上轨
    low_line = ma - context.width * atr # 下轨
 
    # 交易逻辑
    if price >= high_line and curr_position <=0 and data.can_trade(instrument): # 开多
        order_target(instrument,  5) # order_target的含义是本次下单使得最终的仓位为目标仓位,如果是正数,那么就是多头仓位
        print(today, '买入开仓')

    elif price <= low_line and curr_position >= 0 and data.can_trade(instrument): # 开空
        order_target(instrument,  -5) # 下单后使得仓位为5手空单
        print(today, '卖出开仓')

3. 回测接口

In [3]:
# 3. 启动回测
# 策略回测接口: https://v2.bigquant.com/docs/module_trade.html
m = M.trade.v4(
    instruments= ['RU8888.SHF'],
    start_date='2017-11-03',
    end_date='2018-11-01',
    prepare=prepare,
    initialize=initialize,
    handle_data=handle_data,
    # 买入订单以开盘价成交
    order_price_field_buy='open',
    # 卖出订单以开盘价成交
    order_price_field_sell='open',
    capital_base=1000000,
    benchmark='000300.SHA',
    product_type = 'future',
    m_deps=np.random.rand()
)
2018-01-30 卖出开仓
2018-08-07 买入开仓
2018-10-25 卖出开仓
  • 收益率15.43%
  • 年化收益率16.05%
  • 基准收益率-20.52%
  • 阿尔法0.1
  • 贝塔-0.1
  • 夏普比率1.06
  • 胜率0.5
  • 盈亏比3.49
  • 收益波动率11.93%
  • 信息比率0.09
  • 最大回撤5.77%

(Hugo999) #3

谢谢老师指导,感谢