# 缠论回测与交易指南

---

### [B站视频教程](https://space.bilibili.com/384267873)

**不建议修改项目提供的策略、交易、自动化交易代码**

**自己的策略、交易等代码，新建名称前缀为 my_ 的py文件，如 my_ma_strategy.py**

**以 my_ 为前缀的文件，会被git忽略，不被添加到仓库中**

### 行情数据同步到本地

支持将行情保存到本地 MySQL 数据库，自动化脚本：

* [scripts/crontab/reboot_sync_currency_klines.py](../script/crontab/reboot_sync_currency_klines.py) 同步数字货币到数据库
* [scripts/crontab/reboot_sync_hk_klines.py](../script/crontab/reboot_sync_hk_klines.py) 同步港股股票数据到数据库
* [scripts/crontab/reboot_sync_a_klines.py](../script/crontab/reboot_sync_a_klines.py) 同步沪深股票数据到数据库
* [scripts/crontab/reboot_sync_futures_klines.py](../script/crontab/reboot_sync_futures_klines.py) 同步期货数据到数据库（需要天勤的专业版）

可自行查看具体代码实现

### 本地缠论选股脚本

[reboot_xuangu.py](../script/crontab/reboot_xuangu.py) 本地选股脚本

可根据自己实际需求，选择符合自己要求的股票，并添加到指定的自选列表中

### 策略回测

项目中已经写了关于 A股、港股、期货、数字货币的默认交易与实盘脚本，可根据自己需求进行修改使用； 复制原来的文件，命名为 my_ 前缀的文件，进行修改

**目录结构**

    src/chanlun/backtesting : 存放与回测与交易运行的核心功能
    src/chanlun/strategy : 所有的策略文件所在目录
    src/chanlun/trader : 实盘中，各个市场实际的交易方法所在目录
    script/trader : 实盘策略执行脚本所在目录

**回测与实盘交易的简单逻辑**

    BackTestKlines 加载回测K线数据，并自动处理低级别到高级别时间周期的合并
    Strategy 策略类，接收 缠论 数据，策略给出相应的 开仓、平仓信号（只给信号，不涉及资金仓位管理）
    Trader 交易类，按照 Strategy 给出的信号，执行相应的交易操作（这里可以根据实盘情况，进行分仓与资金管理）

**回测行情数据基于本地 MySQL 中的数据，所以在回测前需要确认本地是否有回测时间段的行情数据**

回测的类为 :[BackTest](../src/chanlun/backtesting/backtest.py)

自己写的策略，需要继承 Strategy 类，并实现其中的 open、close

方法 Demo 实例参考 ： [strategy_demo.py](../src/chanlun/strategy/strategy_demo.py)

回测运行实例参考(JupyterLab)：[回测_数字货币策略.ipynb](../notebook/回测_数字货币策略.ipynb)

### 实盘策略交易

> 当前项目还处于不断完善的过程，其中核心的 cl.py 文件肯定会有变动，这样会导致之前回测的信号发生变化；  
> 如果用于实盘，代码要与研究环境分开，避免因为代码更新，导致实盘信号与之前回测有偏差，导致亏损。


策略经过回测验证，满足自己要求，即可接入实盘进行交易；  
实盘的交易对像需要继承 [Trader类](../src/chanlun/backtesting/backtest_trader.py)    
实现其中的 open_buy/open_sell/close_buy/close_sell 交易方法即可

### 策略开发小文档

策略需要继承 Strategy 类

    from chanlun.backtesting.base import *
    class MyStrategy(Strategy):    
        ......

策略需要实现两个方法 open 、close

> open 方法：用来接收行情，并根据判断，给出开仓信号
>
> close 方法：用来检测当前持仓，并根据判断，给出平仓信号

### 策略的 open 方法

    def open(self, code, market_data: MarketDatas) -> List[Operation]:

    code 参数：当前传递行情的 标的代码，多标的回测，如需记录数据可进行识别
    market_data 参数： 缠论行情数据对象

MarketDatas 是根据在回测或实盘中设置的周期列表来获取对应周期的数据的，如 回测中设置 frequencys = ['30m', '5m']

在策略中获取 30m 周期数据 使用 market_data.get_cl_data(code, market_data.frequencys[0])

5m 周期数据使用 market_data.get_cl_data(code, market_data.frequencys[1])

这样设计的好处是，如改变回测的周期，如 ['d', '30m']，则不用在修改策略中的代码

还有一点需要注意的是，CLDatas 类有类似懒加载的机制，如果不显示获取指定下标（周期）的数据，则不会进行缠论计算（用来节省回测时间）

举例：周期设置 ['30m', '5m'] ，策略根据 30m 周期买卖点操作，如果有买卖点，在看 5m 周期来确定买卖点成功概率，可以这样写：

    cd_30m = market_data.get_cl_data(code, market_data.frequencys[0])  # 这里获取 30m 缠论数据，30m 周期的数据会计算，但是 5m 周期的数据并不会进行缠论计算
    bi = cd_30m.get_bis()[-1]  # 获取最后一笔
    if len(bi.line_mmds()) == 0:  # 判断笔是否有买卖点，没有则直接返回，则不用获取 5m 数据
        return []
    cd_5m = market_data.get_cl_data(code, market_data.frequencys[1])  # 有 30m 买卖点，在获取 5m 数据，用于后续的判断，则可以省掉一些计算花费

    返回对象 List[Operation]

opt 操作指示 buy 买入（开仓） sell 卖出（平仓）

mmd 触发信号的买卖点

loss_price 设置的止损价格

msg 自定义的信息

info 字典格式，可自定义保存一些信息

    如 opt: buy  mmd: 1buy  则会进行做多开仓
    如 opt: buy  mmd: 1sell  则会进行做空开仓
    如 opt: sell  mmd: 1sell  则会进行做空平仓
    如 opt: sell  mmd: 1buy  则会进行做多平仓

### 策略的 close 方法

    def close(self, code, mmd: str, pos: POSITION, market_data: MarketDatas) -> [Operation, None]:

> code 持仓的标的
>
> mmd 开仓时触发的买卖点
>
> pos 持仓对象
>
> cl_datas 缠论数据，作用同 open 中的 cl_datas 对象一样
>
> return Operation 同开仓返回的对象一样，平仓 中 opt 统一为 sell
>

## 进行回测的配置

回测运行实例参考：
[回测_数字货币策略.ipynb](../notebook/回测_数字货币策略.ipynb)

都有注释说明，就不过多介绍了

[回测结果查看.ipynb](../notebook/回测数据查看.ipynb)
这个 notebook 可以加载落地回测数据，进行策略执行检查，以此进行优化并调整策略


```

back_config = {
    # 策略结果保存的文件
    'save_file': './data/bk/currency_strategy_demo.pkl',
    # 设置策略对象
    'strategy': strategy_demo.StrategyDemo(),
    # 回测模式：signal 信号模式，固定金额开仓； trade 交易模式，按照实际金额开仓
    'mode': 'trade',
    # 市场配置，currency 数字货币  a 沪深  hk  港股  futures  期货
    'market': 'currency',
    # 基准代码，用于获取回测的时间列表
    'base_code': 'BCH/USDT',
    # 回测的标的代码
    'codes': ['BCH/USDT', 'EOS/USDT'],
    # 回测的周期，这里设置里，在策略中才能取到对应周期的数据
    'frequencys': ['5m'],
    # 回测开始的时间
    'start_datetime': '2022-02-01 00:00:00',
    # 回测的结束时间
    'end_datetime': '2022-04-01 00:00:00',
     # mode 为 trade 生效，初始账户资金
    'init_balance': 1000000,
    # mode 为 trade 生效，交易手续费率
    'fee_rate': 0.0006,
    # mode 为 trade 生效，最大持仓数量（分仓）
    'max_pos': 3,
    # 缠论计算的配置，详见缠论配置说明
    'cl_config': {'xd_bzh': 'xd_bzh_no'},
}

```