项目作者: yutiansut

项目描述 :
策略基类/ 支持QIFI协议
高级语言: Jupyter Notebook
项目地址: git://github.com/yutiansut/QAStrategy.git
创建时间: 2019-08-29T10:48:30Z
项目社区:https://github.com/yutiansut/QAStrategy

开源协议:MIT License

下载


QAStrategy

策略基类/ 基于QAAccount/QACEPEnging/QASPMS/QAREALTIMECollector/QATRADER

QAStrategy支持QIFI协议

QAStrategy 的实盘使用天勤的下单网关(Open-Trade-Gateway) 如果是天勤的用户 你可以理解为这是另一个版本的tqsdk

QAStrategy 的回测也兼容QUANTAXIS的QAAccount 以及QACommunity的可视化内容

QAStrategy 是QUANTAXIS 第一个面向交易员/策略开发者的 用户友好型项目, 致力于降低使用门槛和成本,

  1. 当你用QAStrategy写完一个回测 你可以无缝的把他直接改成一个实时模拟策略
  2. QAStrategy 面向场景, 主要有3个策略基类
  3. (PS: 股票日内回转(有底仓的情况) QAStrategy也一并支持, 默认给予10万股, 使用debug_t0()/run_backtestt0())
  4. - QAStrategyCTABase cta模板/ 单标的模板 支持股票/期货
  5. - QAStrategyStockBase 股票池模板/ 多标的模板 支持股票/期货
  6. - QAStrategyHedgeBase 对冲模板/ 双标的模板 (目前没写完)
  7. 策略开发者/交易员 只需要面向你自己的主要方向, 选择一个你想要的模板, 继承并开发即可快速在2分钟内完成一个简单策略
  8. ## 为什么使用QAStrategy
  9. 1. 你们根本不会用quantaxis 大部分人还停留在pandas都不会用的阶段
  10. 2. quantaxis 项目过于灵活, 并且文档缺失较多 除非二次开发人员和我自己 都不推荐直接使用quantaxis
  11. 3. 你应该专注在策略开发上 而不是先学个python
  12. 4. QAStrategy 无缝兼容回测/模拟/实盘的 你可以较为快速的直接上手
  13. 5. 支持QAStrategy的周边手机APP即将上线, QACommunity桌面端也是无缝兼容的
  14. > 书生造反 十年不成 不要总是在想这个难那个不好用了 just do it 现在开始比什么都重要 !#
  15. > 如果你在QAStrategy的过程中遇到了任何问题 都可以直接发issue要求群主给你解决!
  16. ## 如何使用QAStrategy
  17. 我们推荐你使用QUANTAXISdocker环境来直接上手
  18. 如果你希望手动部署 可以参考QUANTAXIS项目中的issue 部署好行情网关 数据更新以及相应其他的设置(mq/db)
  19. 当你通过QUANTAXIS DOCKER打开了 81界面, 即可进入研究选项
  20. QAStrategy是内置在本docker环境中的, 直接调用即可
  21. 在每个策略基类中 有一些是 大家共享的公共变量 还有一些是基类自己的变量
  22. =====================================================================================
  23. ## varibles 一些变量
  24. - self.market_data 此变量为公共变量 记录策略的历史数据 [回测/实时均可用]
  25. - self.send_order 此函数为公共函数 但是在不同的基类中, 参数不同
  26. - self.running_time 当前运行时间
  27. - self.acc 此变量为公共变量 代表了账户
  28. - self.market_datetime
  29. - self.bar_id 在回测中使用, barid
  30. - self.latest_price 一个json格式的最新价格变量 一般在实时模拟中使用
  31. - self.isupdate
  32. - self.dt 当前时间(datetime的缩写)
  33. [可以在user_init中重写的变量]
  34. - self.username 此为回测的时候的账户名
  35. - self.password 此为回测的时候的密码
  36. ## 一些比较重要的变量[篇幅较长 在首页我就不展开讲 可以移步链接中的教程]
  37. ### [持仓Position](doc/Position.md)
  38. ### [账户 Account](doc/Account.md)
  39. ### [数据 MarketData](doc/MarketData.md)
  40. ### [订单 Order](doc/Order.md)
  41. ## functions 常用函数
  42. - 画图函数 self.plot(name, data, format)
  43. - 获取当前code self.get_code()
  44. - self.ind2str(ind, ind_type)
  45. - 获取品种所在的交易所 self.get_exchange(code)
  46. - 获取品种持仓 self.get_positions(code)
  47. - 获取当前现金 self.get_cash()
  48. - 获取某个品种的marketdata self.get_code_marketdata(code)
  49. - 获取当前的maretdata切片 self.get_current_marketdata()
  50. - 订阅数据 (实时模拟用/ 回测不需要) self.subscribe_data(code, frequence, data_host, data_port, data_user, data_password, model='py')
  51. - 用当日tick数据进行回测(期货) self.debug_currenttick(freq)
  52. - 用历史tick数据进行回测(期货) self.debug_histick(freq)
  53. - 使用t0模式进行回测 self.debug_t0()
  54. - 回测(不存储账户数据的模式) self.debug()
  55. - 回测(存储账户数据的模式) self.run_backtest()
  56. - 实时模拟(阻塞形式 不能同时多开很多个) self.run_sim()
  57. - 实时模拟(非阻塞模式 可以同时开很多个) self.debug_sim()
  58. ## inherit functions 常用继承函数 (一般来说 就是你需要自定义的函数)
  59. 用户初始化函数
  60. ```python
  61. def user_init(self):

每日开盘前运行的函数 默认是自带的 你可以改写

  1. def on_dailyopen(self):
  2. pass

每日收盘后运行的函数 默认是自带的 你可以改写

  1. def on_dailyclose(self):
  2. pass

在你订阅分钟级别的数据的时候, 你需要继承并改写on_bar函数

  1. def on_bar(self, bar):
  2. print(bar)

在你订阅tick级别的数据的时候, 你需要继承并改写on_tick函数

  1. def on_tick(self, tick):
  2. pass

强制平仓函数 默认是自带的 你可以改写

  1. def force_close(self):
  2. pass

在发单后会运行的函数 默认是自带的 你可以改写

  1. def check_order(self, direction, offset, code= None):
  2. pass

当发单失败的时候运行的函数 默认是自带的 你可以改写

  1. def on_ordererror(self, direction, offset, price, volume):
  2. pass

=====================================================================================

一个常见的示例如下 更多的示例可以参考 /example 中的例子

  1. from QAStrategy import QAStrategyCTABase
  2. import QUANTAXIS as QA
  3. class CCI(QAStrategyCTABase):
  4. def on_bar(self, bar):
  5. """你的大部分策略逻辑都是在此写的
  6. """
  7. res = self.cci()
  8. print(res.iloc[-1])
  9. if res.CCI[-1] < -100:
  10. print('LONG')
  11. if self.positions.volume_long == 0:
  12. self.send_order('BUY', 'OPEN', price=bar['close'], volume=1)
  13. if self.positions.volume_short > 0:
  14. self.send_order('BUY', 'CLOSE', price=bar['close'], volume=1)
  15. elif res.CCI[-1] > 100:
  16. print('SHORT')
  17. if self.positions.volume_short == 0:
  18. self.send_order('SELL', 'OPEN', price=bar['close'], volume=1)
  19. if self.positions.volume_long > 0:
  20. self.send_order('SELL', 'CLOSE', price=bar['close'], volume=1)
  21. def cci(self,):
  22. """你可以自定义你想要的函数
  23. """
  24. return QA.QA_indicator_CCI(self.market_data, 61)
  25. strategy = CCI(code='rb2005', frequence='1min',
  26. strategy_id='a3916de0-bd28-4b9c-bea1-94d91f1744ac')
  27. strategy.run_backtest()

更多详细信息参考教程