# TickBacktestPy **Repository Path**: tangqianli/tick-backtest-py ## Basic Information - **Project Name**: TickBacktestPy - **Description**: py版日内高频数据回测 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2021-07-28 - **Last Updated**: 2021-07-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 数据特征 - 开盘集合竞价期间应当使用bid/ask价来判断 - volume/amount为累积值,需要增加两个字段:当前tick的成交量 ## 模拟环境下的时序控制 回测时如果真的异步操作,将行情读入后全部送入行情队列,那么将导致logger和策略无法获悉当前时间。 因此回测时应尽可能不要多线程读写,而是送入一个tick后,处理完成后再送入下一个tick。 一个可行的机制是: - 令原始行情队列长度=1 - 不开启策略进程,由RawMDProcesser读入行情后直接调用策略的ProcessEvent函数 - 这也意味着,需要将ProcessEvent作为IStrategy的一个必须实现的虚函数,并将获取event的部分封装到父类里面 - 加入系统context维护最新tick时间,回测时,logger就用最新tick时间当作当前时间 策略应当自行记录时间,而不能过度依赖系统。sleep这类等待函数至少在回测中严禁使用。 ## 代码不足 - 由于py真多线程实际运行与多个进程,导致线程内数据无法共享。 这个问题短期难以解决,因此改用Thread即伪多线程进行操作。 - LocalTickLoader中将同步读取全部行情数据,占用内存 - Windows平台上py的多进程机制可能有问题,子进程无法退出(目前又没问题了) - 冗余不够,策略不能处理速度不能太慢,但实际上后果仅是多占用一部分内存,应当不会影响系统稳定性 - 看起来在python工程中并不需要出现虚类,虚类的设置仅用于提醒自己要实现哪些代码 ## 组件设计 项目采用模块化的设计,交易系统部分与实盘尽可能保持一致或仅需要很少的修改。 目前有如下几个模块: - 行情 - IMDListener.py - 回测时使用从本地读取tick的模式 - LocalTickLoader.py - 记录日志信息 - Logger.py - 公共上下文 - PublicContext.py - 策略上下文 - IStrategyContext.py / StrategyContext.py - 前者包含需要提供给策略开发者的功能 - 后者用于实现与交易系统交互的功能 - 需要提供put_md和put_event两个函数 - 行情分发 - RawMDProcessor.py - 原始行情先送到这里,然后put到各个策略context维护的queue里面。 - 策略管理 - StrategyManager.py - 目前功能还不太明确 - 订单管理 - OrderManager.py - 管理各个策略提交的订单信息(TODO - 没弄完) - 交易员 - 执行交易并记录各个策略的仓位 - 下单时的流程:买单先扣掉所有的钱,卖单先扣掉所有的可用持仓 必须补充的工作: - 开发仓位管理组件 - 完成订单管理组件 - 多策略测试 ## 一些记录 python多进程在start后不会随主进程的结束而结束,反而会等待所有进程都退出