## 多中枢类型相同买卖点策略

---

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

关于中枢的划分，每个人的画法都会有一些差异，程序也只是按照特定的规则进行划分，一些图表，人眼可以很直观的画出合理的中枢，程序则比较固定化，不一定画在最合理的地方；

目前程序中提供了三种中枢划分的标准，分别是 标准中枢、段内中枢、方向中枢；

> 标准中枢：按照中枢延申的规则，直到出现三类买卖点终结原中枢，才会生成新的中枢；
>
> 段内中枢：按照高一级别的线段，以线段的起始笔开始画中枢，直到新的线段产生；
>
> 方向中枢：所生成的中枢是有严格方向的（向上、向下）

**设想：如果当前笔在以上三种中枢类型都出现相同的买卖点，那买卖点的成功率是不是会比较大呢？**

接下来就用程序来进行验证。

策略文件：`src/chanlun/strategy/strategy_multiple_zs_mmds.py`

最新版本的缠论数据计算，支持同时计算多个中枢，并生成其中的买卖点；

只需要在缠论配置项指定 `zs_bi_type` 为所需要的中枢类型列表即可，如

        'zs_bi_type': ['zs_type_bz', 'zs_type_fx', 'zs_type_dn']

### 策略介绍

策略数据使用单周期；

开仓策略：所计算的中枢同时出现买卖点，并且买卖点对应的中枢，有会拉零轴的过程，并且当笔停顿则进行买进；

平仓策略：所计算的中枢，只有有其中一个中枢出现相反的买卖点或背驰就平仓退出；

需要注意的是在缠论计算配置中，将 `zs_bi_type` 设置为自己需要的中枢类型列表，在策略中，通过如下代码，获取所有中枢产生的买卖点合集：

        mmds = high_bi.line_mmds('&')
        # 如果不传递参数，返回的是第一个中枢类型的买卖点列表，也可以传递指定的中枢类型，如 zs_type_dn 获取段内中枢产生的买卖点
        # 也可以传递特殊的参数，如 &、|
        # & ：表示当前计算所有中枢类型产生的买卖点交集
        # | ：表示当前计算所有中枢类型产生的买卖点合集

策略增加一个简单过滤，需要产生买卖点的中枢有回拉零轴的过程，代码如下：

        # 增加条件，买卖点对应的中枢，需要回拉零轴
        for zs_type, mmds in high_bi.zs_type_mmds.items():
            for mmd in mmds:
                if self.judge_macd_back_zero(high_data, mmd.zs, high_bi) is False:
                    return opts

如果有产生买卖点，并且只要有一个买卖点对应的中枢没有回拉零轴的过程，就不产生交易。

平仓操作，判断只要有一个中枢类型产生了相反的买卖点，或者背驰，就在笔停顿的时候平仓。

判断所有中枢类型中是否有产生指定的买卖点和背驰，代码如下：

        high_bi.mmd_exists(['1sell', '2sell', '3sell', 'l3sell'], '|')
        high_bi.bc_exists(['bi', 'pz', 'qs'], '|')
        # 通过传递第二个参数为 |，获取所有计算的中枢类型产生的买卖点中，是否有给定的买卖点中的一个

### 策略回测结果

数据采用沪深A股，市值前 100 的股票，日线周期数据，时间从 2017-01-01 到 2022-06-01，5年半的时间。

回测配置如下：

        bt_config = {
            # 策略结果保存的文件
            'save_file': './data/bk/a_strategy_multiple_zs_mmds_trade_fx.pkl',
            # 设置策略对象
            'strategy': StrategyMultipleZsMMDS(),
            # 回测模式：signal 信号模式，固定金额开仓； trade 交易模式，按照实际金额开仓
            'mode': 'signal',
            # 市场配置，currency 数字货币  a 沪深  hk  港股  futures  期货
            'market': 'a',
            # 基准代码，用于获取回测的时间列表
            'base_code': 'SH.000001',
            # 回测的标的代码
            'codes': ["SH.600519", "SH.601398", "SH.601939", "SH.601288", "SH.601857", "SH.600036", "SH.601988", "SH.601318", "SZ.002594", "SH.601628", "SZ.000858", "SH.601088", "SH.600028", "SH.600900", "SH.601658", "SH.601166", "SZ.000333", "SZ.300760", "SH.601012", "SH.601328", "SH.603288", "SZ.002415", "SH.601888", "SH.600809", "SH.688981", "SZ.000568", "SZ.000001", "SZ.300059", "SH.603259", "SH.600030", "SH.601899", "SZ.002714", "SH.601668", "SH.600309", "SH.600690", "SH.600887", "SZ.002352", "SZ.002304", "SH.601919", "SZ.002142", "SH.600000", "SH.601998", "SH.601633", "SZ.000002", "SH.601816", "SH.600585", "SZ.002475", "SH.600048", "SH.601319", "SZ.000651", "SH.601601", "SZ.300015", "SH.600104", "SH.601138", "SH.600276", "SH.600436", "SH.600438", "SZ.002812", "SH.601995", "SH.601390", "SH.600406", "SH.601800", "SH.600188", "SH.601818", "SH.601066", "SH.600905", "SH.601225", "SH.600016", "SZ.000792", "SZ.300122", "SH.600346", "SZ.002460", "SH.600018", "SH.603392", "SZ.000725", "SH.601766", "SZ.003816", "SZ.002493", "SH.600031", "SH.600019", "SH.601111", "SH.601985", "SZ.002459", "SH.603501", "SH.601211", "SH.601238", "SZ.002129", "SH.601898", "SZ.300014", "SZ.002371", "SZ.002241", "SH.601688", "SZ.000776", "SZ.300498", "SZ.002271", "SH.600600", "SH.600837", "SZ.001979", "SH.601669", "SH.601009"],
            # 回测的周期，这里设置里，在策略中才能取到对应周期的数据
            'frequencys': ['d'],
            # 回测开始的时间
            'start_datetime': '2017-01-01 00:00:00',
            # 回测的结束时间
            'end_datetime': '2022-06-01 00:00:00',
            # mode 为 trade 生效，初始账户资金
            'init_balance': 1000000,
            # mode 为 trade 生效，交易手续费率
            'fee_rate': 0.001,
            # mode 为 trade 生效，最大持仓数量（分仓）
            'max_pos': 15,
            # 缠论计算的配置，详见缠论配置说明
            'cl_config':{
                'default': {
                    'fx_bh': 'fx_bh_yes', 'fx_qj': 'fx_qj_k', 
                    'bi_type': 'bi_type_old', '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_fx', 'zs_xd_type': 'zs_type_dn', 
                    'zs_wzgx': 'zs_wzgx_zggdd', 'zs_qj': 'zs_qj_ck'
                }
            }
        }

#### 首先使用单个中枢类型进行信号模式回测，结果如下：

`'zs_bi_type': 'zs_type_fx'` 单方向中枢

![方向中枢-表格](img/strategy_multiple_zs_mmds_signal_fx_res_table.png)

![方向中枢-图表](img/strategy_multiple_zs_mmds_signal_fx_res_chart.png)

`'zs_bi_type': 'zs_type_dn'` 单段内中枢

![段内中枢-表格](img/strategy_multiple_zs_mmds_signal_dn_res_table.png)

![段内中枢-图表](img/strategy_multiple_zs_mmds_signal_dn_res_chart.png)

`'zs_bi_type': 'zs_type_bz'` 单标准中枢

![标准中枢-表格](img/strategy_multiple_zs_mmds_signal_bz_res_table.png)

![标准中枢-图表](img/strategy_multiple_zs_mmds_signal_bz_res_chart.png)

`'zs_bi_type': ['zs_type_bz', 'zs_type_fx', 'zs_type_dn']` 三中枢类型

![三中枢类型-表格](img/strategy_multiple_zs_mmds_signal_fxbzdn_res_table.png)

![三中枢类型-图表](img/strategy_multiple_zs_mmds_signal_fxbzdn_res_chart.png)

##### 总结

嗯。。。貌似交易量少了，胜率提升了一点点，其他的也没啥；

不过三类中枢买卖点，是唯一一个没有变为亏钱的策略，始终在 0 之上

| 中枢类型 | 总交易数 | 胜率 | 回吐比例 | 盈亏比 |
| ------- | ------ | ----- | ------ | ------|
| 方向中枢 | 563 | 39.25% | 40.87 | 3.7862 |
| 段内中枢 | 564 | 40.6% | 45.15 | 3.2402 |
| 标准中枢 | 647 | 40.3% | 46.66 | 3.2109 |
| 三类中枢 | 352 | 41.76% | 44.91 | 3.1049 |

#### 接下来进行交易模式回测，结果如下：

`'zs_bi_type': 'zs_type_fx'` 单方向中枢

![方向中枢-表格](img/strategy_multiple_zs_mmds_trade_fx_res_table.png)

![方向中枢-图表](img/strategy_multiple_zs_mmds_trade_fx_res_chart.png)

`'zs_bi_type': 'zs_type_dn'` 单段内中枢

![段内中枢-表格](img/strategy_multiple_zs_mmds_trade_dn_res_table.png)

![段内中枢-图表](img/strategy_multiple_zs_mmds_trade_dn_res_chart.png)

`'zs_bi_type': 'zs_type_bz'` 单标准中枢

![标准中枢-表格](img/strategy_multiple_zs_mmds_trade_bz_res_table.png)

![标准中枢-图表](img/strategy_multiple_zs_mmds_trade_bz_res_chart.png)

`'zs_bi_type': ['zs_type_bz', 'zs_type_fx', 'zs_type_dn']` 三中枢类型

![三中枢类型-表格](img/strategy_multiple_zs_mmds_trade_fxbzdn_res_table.png)

![三中枢类型-图表](img/strategy_multiple_zs_mmds_trade_fxbzdn_res_chart.png)

##### 总结

嗯。。。

| 中枢类型 | 总交易数 | 胜率 | 回吐比例 | 盈亏比 | 总收益 | 年化收益 | 回撤比例 | 收益回撤比 |
| ------- | ------ | ----- | ------ | ------| ----- | ------ | ------| ------|
| 方向中枢 | 447 | 38.03% | 47.6 | 3.4233 | 201.72% | 37.41% | -32.25% | 6.25 |
| 段内中枢 | 457 | 39.17% | 53.86 | 2.8833 | 143.22% | 26.56% | -27.14% | 5.28 |
| 标准中枢 | 455 | 40.22% | 50.6 | 2.9376 | 177.75% | 32.97% | -27.27% | 6.52 |
| 三类中枢 | 338 | 41.76% | 44.91 | 3.1049 | 125.56% | 23.29% | -23.29% | 5.39 |

#### Tips

展示图标中，默认展示的是第一个中枢类型的 中枢以及对应的买卖点，如果需要切换，可以传递画图参数配置进行更改，代码如下：

        BT.show_charts(code, BT.frequencys[0], chart_config={'custom_bi_zs_type': 'zs_type_bz'})

#### 声明

回测中使用的是当前市值前100的股票，并且A股只能做多，市值大也表示之前一段时间可能涨幅也比较大，回测看起来效果会比较好，换成其他股票结果就不一定了。

当前策略只能做到技术择时，实际应用中，还要根据自己的选股逻辑，做下基本面的选股，在结合择时会比较好。