克隆策略
In [4]:
STRATEGY_NAME = "T0日内回转策略"
def initialize(context):
    """策略初始化函数,只触发一次。可以在该函数中初始化一些变量,如读取配置和全局使用数据"""
    context.ins = context.get_conf_param("instruments")[0]  
    context.subscribe(context.ins) # 注册合约 
    context.closetime = "14:55"
    context.cnt = 0
    context.PRINT = 0
    context.set_commission(PerOrder(buy_cost=0.0001, sell_cost=0.0011, min_cost=5))

def before_trading(context, data):
    """盘前处理,策略盘前交易函数,每日盘前触发一次。可以在该函数中一些启动前的准备,如订阅行情等"""
    
    bar1d_df = data.history(context.ins, ["high","low",'close'], 1, "1d")
    context.flag = 1 # 用于获取今开
    context.pre_high = bar1d_df.iloc[0]['high'] # 昨高
    context.pre_low = bar1d_df.iloc[0]['low']  # 昨低
    context.pre_close = bar1d_df.iloc[0]['close']  # 昨低

def handle_data(context, data):
    
    # 获取当天开盘价
    if context.flag == 1:
        open_price = data.history(context.symbol(context.ins), ["open"], 1, "1m")
        context.flag = context.flag + 1
        context.today_open = open_price.iloc[-1]['open'] 
        
    cur_date =  data.current_dt
    cur_hm = cur_date.strftime('%H:%M')
   
    # 获取持仓
    position = context.get_position(context.ins)
    # 获取当前价格
    price = data.current(context.ins, "close")
    # 为了获取账户资金
    trading_account = context.get_trading_account()

    # 先建好底仓(全仓购买) 
    context.cnt += 1
    if context.cnt  == 1:
        rv = context.order_value(context.ins, trading_account.available, price, order_type=OrderType.MARKET)
        msg = "{} 建仓买入{}  下单函数返回{}".format(cur_date,context.ins,context.get_error_msg(rv))
        context.write_log(msg, stdout=context.PRINT) 
        
    # 尾盘补仓
    if cur_hm >= context.closetime:
        if (position.current_qty == 0):
            rv = context.order_value(context.ins, trading_account.available, price, order_type=OrderType.MARKET)
            msg = "{} 尾盘补仓{}  下单函数返回{}".format(cur_date,context.ins,context.get_error_msg(rv))
            context.write_log(msg, stdout=context.PRINT)
        # 有仓位就直接返回
        return 

    # 盘中平多
    PCT = 0.015
    if position.current_qty > 0 and context.today_open<context.pre_close*(1-PCT): 
        rv = context.order_target(context.ins, 0, order_type=OrderType.MARKET)
        msg = "{} 盘中平多{}  下单函数返回{}".format(cur_date,context.ins,context.get_error_msg(rv))
        context.write_log(msg, stdout=context.PRINT)
        
        
def handle_order(context, order):
    """委托回报通知函数,每个订单状态有变化时会触发"""
    #输出关键日志
    pass
    
def handle_trade(context, trade):
    """成交回报推送"""
    pass
    

relative_ret = []

# 创业板股票测试
df = DataSource('bar1d_CN_STOCK_A').read(start_date='2020-12-31',end_date='2020-12-31')
df = df[df.instrument.str.startswith('3')]
df = df.sort_values('volume', ascending=False).head(200)
stock_list = [i for i in df.instrument.unique().tolist()]

#对每只标的循环进行回测
for i in stock_list[-10:]:
    instruments = [i]
    strategy_setting = [{
            "instruments": instruments,
        }]
    start_date = "2021-01-01"
    end_date = "2021-10-25"
    try:
        md = M.hfbacktest.v1(start_date=start_date, #回测开始时间
                         end_date=end_date, #回测结束时间
                         instruments=instruments, #股票列表
                         capital_base=100000, #初始资金
                         product_type=Product.EQUITY, #交易标的为股票
                         frequency=Frequency.MINUTE,  #回测频率
                         initialize=initialize,
                         before_trading_start=before_trading,
                         handle_data=handle_data,
                         handle_order=handle_order,
                         handle_trade=handle_trade,
                         plot_charts=True, #画出回测结果分析图
                         strategy_setting=strategy_setting, #配置参数
                         benchmark=instruments[0],  # 设置基准为该股票走势,便于对比
                         price_type='post',
                         stock_t1=0 ,#0表示回测支持当天买和卖。1表示不支持t0
                         volume_limit=0,
                         m_deps=np.random.rand() # 模块依赖,值相同的话会命中缓存
                         )
    except Exception as e:
        print(instruments, i, e)

    #收益率比较
    rets = md.raw_perf.read()['algorithm_period_return'] - md.raw_perf.read()['benchmark_period_return']  
    ret_value = rets.values[-1]
    relative_ret.append({i:ret_value})
display(relative_ret)
2021-10-29 14:43:42.795306 run trading v1.7.8_sp1 
2021-10-29 14:43:42.796857 init history datas... 
2021-10-29 14:43:42.830150 init trading env... 
  • 收益率12.53%
  • 年化收益率15.86%
  • 基准收益率11.65%
  • 阿尔法-0.02
  • 贝塔0.89
  • 夏普比率0.5
  • 胜率0.19
  • 盈亏比0.91
  • 收益波动率59.44%
  • 信息比率-0.02
  • 最大回撤35.23%
bigcharts-data-start/{"__type":"tabs","__id":"bigchart-f98d2b657e8346f7ad19fd6b4490228a"}/bigcharts-data-end
2021-10-29 14:44:14.529728 run trading v1.7.8_sp1 
2021-10-29 14:44:14.530164 init history datas... 
2021-10-29 14:44:14.557766 init trading env... 
  • 收益率25.75%
  • 年化收益率33.08%
  • 基准收益率16.67%
  • 阿尔法0.15
  • 贝塔0.94
  • 夏普比率0.74
  • 胜率0.13
  • 盈亏比0.6
  • 收益波动率58.48%
  • 信息比率0.09
  • 最大回撤28.58%
bigcharts-data-start/{"__type":"tabs","__id":"bigchart-9e7f9938c1c34e45b4a20976d9e84372"}/bigcharts-data-end
2021-10-29 14:44:47.065344 run trading v1.7.8_sp1 
2021-10-29 14:44:47.065515 init history datas... 
2021-10-29 14:44:47.104744 init trading env... 
  • 收益率-23.27%
  • 年化收益率-28.13%
  • 基准收益率-34.44%
  • 阿尔法-0.05
  • 贝塔0.83
  • 夏普比率-0.71
  • 胜率0.07
  • 盈亏比0.1
  • 收益波动率41.04%
  • 信息比率-0.0
  • 最大回撤39.86%
bigcharts-data-start/{"__type":"tabs","__id":"bigchart-21580b1af288482a8f8ce32a0554ff02"}/bigcharts-data-end
2021-10-29 14:45:19.718270 run trading v1.7.8_sp1 
2021-10-29 14:45:19.718385 init history datas... 
2021-10-29 14:45:19.746049 init trading env... 
  • 收益率-8.79%
  • 年化收益率-10.84%
  • 基准收益率-19.32%
  • 阿尔法0.09
  • 贝塔0.83
  • 夏普比率-0.18
  • 胜率0.28
  • 盈亏比0.93
  • 收益波动率40.2%
  • 信息比率0.04
  • 最大回撤25.3%
bigcharts-data-start/{"__type":"tabs","__id":"bigchart-73311a95619d4139aea152e8397e4351"}/bigcharts-data-end
2021-10-29 14:45:55.452895 run trading v1.7.8_sp1 
2021-10-29 14:45:55.453025 init history datas... 
2021-10-29 14:45:55.495293 init trading env... 
  • 收益率4.26%
  • 年化收益率5.34%
  • 基准收益率1.01%
  • 阿尔法-0.01
  • 贝塔0.94
  • 夏普比率0.33
  • 胜率0.43
  • 盈亏比125.77
  • 收益波动率60.27%
  • 信息比率-0.01
  • 最大回撤41.43%
bigcharts-data-start/{"__type":"tabs","__id":"bigchart-bea8ec53fb0a4f338ef5860188d42730"}/bigcharts-data-end
2021-10-29 14:46:28.210400 run trading v1.7.8_sp1 
2021-10-29 14:46:28.210523 init history datas... 
2021-10-29 14:46:28.238739 init trading env... 
  • 收益率73.57%
  • 年化收益率98.94%
  • 基准收益率171.66%
  • 阿尔法-0.36
  • 贝塔0.86
  • 夏普比率1.25
  • 胜率0.47
  • 盈亏比324.16
  • 收益波动率81.32%
  • 信息比率-0.14
  • 最大回撤56.76%
bigcharts-data-start/{"__type":"tabs","__id":"bigchart-393c7d0ab9614243a6585969b5fb5862"}/bigcharts-data-end
2021-10-29 14:47:02.262316 run trading v1.7.8_sp1 
2021-10-29 14:47:02.262477 init history datas... 
2021-10-29 14:47:02.306322 init trading env... 
  • 收益率-7.04%
  • 年化收益率-8.7%
  • 基准收益率13.51%
  • 阿尔法-0.23
  • 贝塔0.84
  • 夏普比率0.04
  • 胜率0.38
  • 盈亏比49.82
  • 收益波动率54.68%
  • 信息比率-0.11
  • 最大回撤27.28%
bigcharts-data-start/{"__type":"tabs","__id":"bigchart-221202ea37194a4783a94a7449160028"}/bigcharts-data-end
2021-10-29 14:47:35.616326 run trading v1.7.8_sp1 
2021-10-29 14:47:35.616475 init history datas... 
2021-10-29 14:47:35.644005 init trading env... 
  • 收益率-7.03%
  • 年化收益率-8.69%
  • 基准收益率4.25%
  • 阿尔法-0.14
  • 贝塔0.97
  • 夏普比率-0.02
  • 胜率0.06
  • 盈亏比0.12
  • 收益波动率48.22%
  • 信息比率-0.13
  • 最大回撤23.92%
bigcharts-data-start/{"__type":"tabs","__id":"bigchart-959ba973e2d04f98b99ecd02947ff1d2"}/bigcharts-data-end
2021-10-29 14:48:09.523984 run trading v1.7.8_sp1 
2021-10-29 14:48:09.524148 init history datas... 
2021-10-29 14:48:09.552566 init trading env... 
  • 收益率-7.05%
  • 年化收益率-8.72%
  • 基准收益率-11.09%
  • 阿尔法0.02
  • 贝塔0.9
  • 夏普比率-0.33
  • 胜率0.0
  • 盈亏比0.0
  • 收益波动率27.0%
  • 信息比率0.04
  • 最大回撤18.86%
bigcharts-data-start/{"__type":"tabs","__id":"bigchart-88a478bde47b46efbee4d5a2187a104d"}/bigcharts-data-end
2021-10-29 14:48:43.939749 run trading v1.7.8_sp1 
2021-10-29 14:48:43.940168 init history datas... 
2021-10-29 14:48:43.976185 init trading env... 
  • 收益率2.82%
  • 年化收益率3.53%
  • 基准收益率8.88%
  • 阿尔法-0.06
  • 贝塔0.92
  • 夏普比率0.29
  • 胜率0.35
  • 盈亏比5.69
  • 收益波动率59.34%
  • 信息比率-0.04
  • 最大回撤36.56%
bigcharts-data-start/{"__type":"tabs","__id":"bigchart-232a59ced4674f1e988d60e808ffeb5e"}/bigcharts-data-end
[{'300222.SZA': 0.008734038291931201},
 {'300031.SZA': 0.09076165573120104},
 {'300115.SZA': 0.11177291945877091},
 {'300420.SZA': 0.10532387540435782},
 {'300740.SZA': 0.032486132133483774},
 {'300712.SZA': -0.9809156158081049},
 {'300369.SZA': -0.20551742184905974},
 {'300047.SZA': -0.11280601334533698},
 {'300401.SZA': 0.04036652744369508},
 {'300201.SZA': -0.06063171528472899}]