合成自定义K线数据(分钟)


声明:回测结果不代表实盘运行效果,展示的策略示例只适合学习,不可直接用于实盘交易

目前项目中回测使用的数据,使用的是已经保存到数据库中,固定周期的K线数据;如 1分钟、5分钟、30分钟、日线 等;

有时自己想测试下另类周期的数据,比如 3分钟、7分钟、15分钟、20分钟 等周期数据,但是数据库中并没有保存该周期数据;

现在提供一个 KlinesGenerator K线生成的类,来提供特定周期(分钟)K线数据进行策略回测。


设想:在期货中的一个品种,在 6分钟 K线上的走势看起来更规整,其低级别也正好对应 1分钟 走势,用多级别分析来判断 6分钟 笔是否结束,来进行交易策略

策略文件:src/strategy/strategy_custom_level_mla.py

策略说明

通过低级别 K线,合成高级别K线,并用多级别分析,来判断高级别笔是否完成

市场:期货

周期:单周期(内部合成多周期)

开仓策略:高级别笔出现买卖点,并多级别分析中,低级别出现盘整或趋势背驰,进行开仓

平仓策略:开仓的反向笔,低级别分析出现盘整或趋势背驰

代码说明

首先在策略初始化方法中,定义k线生成类

    self.kg = KlinesGenerator(high_minutes, None, dt_align_type='bob')
    # 第一个参数指定要生成的分钟周期
    # 第二个参数指定新生成K线计算缠论数据使用的配置
    # 第三个参数指定时间前后对其方式,具体参考方法中的定义

    # 这里的缠论配置,使用策略配置中定义的配置项,但是在初始化中无法获取,等在 open 方法中,在合成K先前赋值一次就好

open 开仓监控方法中,设置缠论配置项,并获取 K线原数据,传递给 K线生成类,并返回缠论配置,之后可以根据新生成的缠论数据,来判断是否开仓

    self.kg.cl_config = market_data.cl_config  # 使用回测配置中缠论配置项
    low_klines = market_data.klines(code, market_data.frequencys[0]) # 获取原始K线数据
    high_data = self.kg.update_klines(low_klines) # 进行K线生成,并返回缠论数据对象

开仓检测,如果出现买卖点或者盘整、趋势背驰,调用多级别分析,检查该笔在低级别的趋势信息,如果出现 盘整背驰或趋势背驰,则判断该笔可能结束,进行开仓

    # 多级别分析,低级别是否有盘整或趋势背驰

    # 获取低级别缠论数据
    low_data = market_data.get_cl_data(code, market_data.frequencys[0])
    # 多级别分析类
    mla = MultiLevelAnalyse(high_data, low_data) 
    # 根据高级别笔,获取其内部的低级别信息
    low_info = mla.low_level_qs(high_bi, 'bi')
    # 如果低级别中,没有盘整背驰和趋势背驰,判断该笔可能没有结束,不进行操作
    if low_info.pz_bc is False and low_info.qs_bc is False:
        return opts

后续平仓检查中,只要反向的笔中,出现 低级别的 盘整背驰或趋势背驰,就退出

回测配置

回测配置项

    bt_config = {
        # 策略结果保存的文件
        'save_file': './data/bk/futures_strategy_custom_level_mla_6_signal.pkl',
        # 设置策略对象
        'strategy': StrategyCustomLevelMLA(6),
        # 回测模式:signal 信号模式,固定金额开仓; trade 交易模式,按照实际金额开仓
        'mode': 'signal',
        # 市场配置,currency 数字货币  a 沪深  hk  港股  futures  期货
        'market': 'futures',
        # 基准代码,用于获取回测的时间列表
        'base_code': 'KQ.m@SHFE.rb',
        # 回测的标的代码
        'codes': ['KQ.m@SHFE.rb'],
        # 回测的周期,这里设置里,在策略中才能取到对应周期的数据
        'frequencys': ['1m'],
        # 回测开始的时间
        'start_datetime': '2022-01-01 00:00:00',
        # 回测的结束时间
        'end_datetime': '2022-04-25 00:00:00',
        # 是否是股票,True 当日开仓不可平仓,False 当日开当日可平
        'is_stock': False,
        # 是否是期货,True 可做空,False 不可做空
        'is_futures': True,
        # mode 为 trade 生效,初始账户资金
        'init_balance': 1000000,
        # mode 为 trade 生效,交易手续费率
        'fee_rate': 0.0006,
        # mode 为 trade 生效,最大持仓数量(分仓)
        'max_pos': 2,
        # 缠论计算的配置,详见缠论配置说明
        'cl_config': {
            'fx_bh': 'fx_bh_no', 'fx_qj': 'fx_qj_k', 
            'bi_type': 'bi_type_new', 'bi_bzh': 'bi_bzh_yes', 'bi_qj': 'bi_qj_dd', 'bi_fx_cgd': 'bi_fx_cgd_no', 
            'xd_bzh': 'xd_bzh_yes', 'zsd_bzh': 'zsd_bzh_yes', 'xd_qj': 'xd_qj_dd', 'zsd_qj': 'zsd_qj_dd',
            'zs_bi_type': 'zs_type_bz', 'zs_xd_type': 'zs_type_bz', 
            'zs_wzgx': 'zs_wzgx_zggdd', 'zs_qj': 'zs_qj_ck'
        },
    }

分别来看下不同分钟级别下的回测结果

1分钟 对应 4分钟 回测结果:

1-4

1分钟 对应 5分钟 回测结果:

1-5

1分钟 对应 6分钟 回测结果:

1-6

1分钟 对应 7分钟 回测结果:

1-6

从结果看,1分钟对应5分钟的结果是最好的。

Tips

如果需要看生成周期的K线数据,进行策略复盘,只需要在 show_charts 方法传递 to_minutesto_dt_align_type 两个参数即可,如下:

    # 第二个参数 frequency 周期,依然传递原K线周期,方法内部会将其生成新的K线数据并进行展示
    BT.show_charts(code, BT.frequencys[0], to_minutes=6, to_dt_align_type='bob')