vnpy 量化交易系统 源码分析 v0.01

第一节 参考


https://blog.csdn.net/qtlyx/column/info/30705
https://zhuanlan.zhihu.com/vn-py
https://www.jianshu.com/p/4beaf05fc585
https://blog.csdn.net/joinquantdata/article/details/86715029

安装:
mongod --config /usr/local/etc/mongod.conf
pip install --extra-index-url https://rquser:ricequant99@py.ricequant.com/simple/ rqdatac==1.0.0a35

第二节 金融理论
第三节 架构


一.模块组成
(一).交易所及券商接口
vnpy.api包下,vnpy.trader.gateway包下,
重点关注ctp的期货接口,ok ex的虚拟 币现货,xtp的股票接口.

(二).回测交易策略
在vnpy.trader.app.algoTrading, vnpy.trader.app.ctaStrategy包下.
(三).图形界面
在vnpy.trader包下.
(四).事件引擎
vnpy.event包下.

第四节 源码流程


一.启动


(一)启动逻辑.
入口代码在examples.VnTrader.run.py下面.
启动界面如下图所示:

1.调用vnpy.trader.ui.create_qapp()创建QApplication图形界面对象.
2.调用vnpy.event.engine.EventEngine类的构造函数创建事件引擎.
3.调用vnpy.trader.engine.MainEngine创建主引擎.在构造函数中,调用vnpy.event.engine.EventEngine.start()启动事件引擎.在该方法中主要是创建定时器线程,创建处理事件队列的线程.
4.添加vnpy.app.cta_strategy.CtaStrategyApp的CAT引擎到主引擎中,对应功能菜单中的CTA策略。
5.添加vnpy.app.cta_backtester.CtaBacktesterApp到主引擎中,对应功能菜单中的CTA回测.
6.添加vnpy.app.script_trader.ScriptTraderApp到主引擎中,对应功能菜单中的脚本策略。
7.添加vnpy.app.rpc_service.RpcServiceApp到主引擎中,对应功能菜单的RPC服务.
8.调用vnpy.trader.ui.mainwindow.MainWindow展示主界面.在这个方法中,调用init_ui()初始化界面,主要是初始化工具栏,菜单栏等.
在初始化菜单函数init_menu(),遍历主引擎中添加的所有app,比如CTA策略,CTA回测,脚本策略,RPC服务,每一个添加一个子菜单项.对应的每个子菜单的界面代码,是模块名加.ui包下的widget.py文件.比如CTA回测,就是vnpy.app.cta_backtester.ui包下的widget.py.

二.CTA回测


(一).准备阶段:
以分析DoubleMA Strategy的IF数据为例.
修改vnpy.trader.setting.py文件的米筐的用户名和密码.
选择时间段,点击下载数据。等待数据下载完,然后点击开始回测。看回测结果.
(二).回测页面初始化
由vnpy.app.cta_backtester.CtaBacktesterApp类来处理,对应的界面代码为vnpy.app.cta_backtester.ui.widget.BacktesterManager类.在该类的构造函数中依次执行
1.调用init_strategy_settings()获取各种交易策略,设置交易策略的默认参数.
2.调用init_ui()初始化界面,添加各个界面上的控件.比如合约符号,时间间隔,开始和结束时间,滑点,开始回测,下载数据,参数优化,委托记录,成交记录,每日盈亏,K线图表等按钮.如果是下载数据,进入BacktesterManager.start_downloading()方法.如果是开始回测,进入start_backtesting()方法.继续添加回测成交记录,回测委托记录,回测每日盈亏等结果的对话框.添加K线图的处理类cta_backtester.ui.widget.CandleChartDialog.
3.调用register_event()注册日志信号,回测完成信号,优化完成信号的处理函数。如果是回测完成,进入BacktesterManager.process_backtesting_finished_event()函数处理.
4.调用init_engine()方法初始化引擎,打印"初始化CTA回测引擎"的日志.日志也是作为事件来处理.创建vnpy.app.cta_strategy.backtesting.BacktestingEngine回测引擎类.调用init_rqdata()方法初始化rqdata米筐的sdk.
(三).下载数据
由vnpy.app.cta_backtester.ui.widget.BacktesterManager.start_downloading()方法处理.首先获取界面上输入的合约种类,合约周期,开始和结束时间.然后进入vnpy.app.cta_backtester.engine.BacktesterEngine.start_downloading()方法中,开启新线程下载.具体下载方法为vnpy.app.cta_backtester.engine.BacktesterEngine.run_downloading().主要逻辑是调用vnpy.trader.rqdata.RqdataClient.query_history()根据合约信息下载对应的K线数据.请求的接口是米筐的rqdatac.services.get_price.get_price()的sdk方法.下载完成后,调用vnpy.trader.database.database_sql.SqlManager.save_bar_data()保存K线数据.默认K线数据保存在SQLite数据库中.数据库的配置信息在vnpy/trader/setting.py中.默认路径在'/Users/feivirus/.vntrader/database.db'.
如下图所示:

(四).开始回测
回测结果如下图:

入口代码为vnpy.app.cta_backtester.ui.widget.BacktesterManager.start_backtesting()方法.获取界面配置的合约相关参数,弹窗vnpy.app.cta_backtester.ui.widget.BacktestingSettingEditor对话框,用户确认后,调用vnpy.app.cta_backtester.engine.BacktesterEngine.start_backtesting()开始回测,该方法开启新线程调用run_backtesting().此方法调用逻辑如下:
1.获取vnpy.app.cta_strategy.backtesting.BacktestingEngine类对象,传入界面参数.
2.调用vnpy.app.cta_strategy.backtesting.BacktestingEngine.load_data()方法加载数据.根据是bar模式还是tick模式,调用load_bar_data()和load_tick_data()加载数据到self.history_data的list中。默认bar模式,进入vnpy.app.cta_strategy.backtesting.load_bar_data(),调用vnpy.trader.database.database_sql.SqlManager.load_bar_data(),它通过peewee的orm库读取数据库.
3.调用vnpy.app.cta_strategy.backtesting.BacktestingEngine.run_backtesting()开始回测.
(1).根据bar还是tick模式,确认进入BacktestingEngine.new_bar()还是BacktestingEngine.new_tick()方法.
(2).进入vnpy.app.cta_strategy.strategies.double_ma_strategy.DoubleMaStrategy.on_init()初始化策略.进入vnpy.app.cta_strategy.template.CtaTemplate.load_bar()初始化加载.
(3).遍历历史K线数据,统计总天数.如果是一个月的分钟线,针对前10根K线(这块没看懂?),每一根K线都进入double_ma_strategy.DoubleMaStrategy.on_bar()方法处理。首先调用vnpy.trader.utility.ArrayManager.update_bar()更新当前K线信息.然后计算短期和长期均线价格,如果短期上穿长期均线,且当前仓位为0,则调用template.CtaTemplate.buy()方法下单买入.下单进入vnpy.app.cta_strategy.template.CtaTemplate.send_order()方法,回测期间该方法返回空.如果短期下穿长期均线,且当前仓位为0,调用vnpy.app.cta_strategy.template.CtaTemplate.short()做空.
(4).调用double_ma_strategy.DoubleMaStrategy.on_start()触发start事件.
(5).调用BacktestingEngine.new_bar()从第10根K线开始回放历史数据.该方法处理逻辑如下:
(5.1)调用BacktestingEngine.cross_limit_order()撮合本地限价单委托,将最新的行情K线或者TICK和策略之前下达的所有委托进行检查,如果能够撮合成交,则返回并记录数据。
(5.2)撮合本地停止单(条件单)委托.
(5.3)调用DoubleMaStrategy.on_bar(),该方法处理逻辑在前面3.(3)已经有介绍.
(5.4)调用BacktestingEngine.update_daily_close()处理每天收盘价后的统计计算逻辑,比如统计盈利交易日数,亏损交易日数.
4.调用BacktestingEngine.calculate_result()计算回测结果盈亏.遍历所有交易,计算当期pnl(profit and loss),turnover(交易量),commission(手续费佣金),slippage(滑点统计),总损益,净损益.
5.调用BacktestingEngine.calculate_statistics()计算策略的汇总统计指标,比如总天数,收益天数,最大回撤,净收益,平均日收益,总佣金,总滑点,总交易量,夏普比率等.
6.进入BacktesterManager.process_backtesting_finished_event()处理回撤结束事件,主要是把回测的结果值写到界面上.
(五).K线图表
入口代码为BacktesterManager.show_candle_chart().获取之前加载的数据库里面的bar数据。
1.调用CandleChartDialog.update_history(),调用vnpy.chart.manager.BarManager.update_history(),调用vnpy.chart.item.ChartItem.update_history()遍历所有K线,调用vnpy.chart.item.CandleItem._draw_bar_picture()通过QT画K线图.
2.获取所有交易记录,调用widget.CandleChartDialog.update_trades()在K线图上标记买卖记录.

三.期权模块


对应的业务处理类为OptionMasterApp.界面为OptionManager类.
​(一).期权界面类OptionManager的构造方法
1.初始化主引擎和事件引擎.
当点击T型报价时,展示OptionMarketMonitor的窗口.
(二).当有新的tick行情到来时,调用vnpy_optionmaster.ui.monitor.OptionMarketMonitor.process_tick_event方法.
方法处理三步,更新期权价格信息,更新隐含波动率,更新greeks希腊字母.价格信息主要是更新行情过来的买价,买量,卖价,卖量,成交量,持仓量.隐含抱动率主要是更新计算后的买价隐波,卖价隐波。更新希腊字母,主要是更新计算后的delta,gamma,theta,vega.上面所有的计算都是通过调用vnpy_optionmaster.engine.OptionEngine.get_instrument获取.在OptionEngine的tick事件处理希腊字母。在timer定时处理事件中计算平值价格。
(三).OptionEngine的timer定时事件处理.
进入OptionEngine.process_timer_event方法.调用每个投资组合的calculate_atm_price方法。每个投资组合都遍历ChainData,进入ChainData.calculate_atm_price方法计算期权的平值价格.
(四).OptionEngine的tick事件处理.进入投资组合的PortfolioData.update_tick的方法,更新最新的ChainData的tick数据,然后调用PortfolioData.calculate_pos_greeks累加每个仓位的希腊字母值.
(五).基础标的的tick行情更新事件.这个是计算希腊字母和隐波的核心方法.目前有二叉树,BS,black_76三个模型.
进入UnderlyingData.update_tick方法,进入ChainData.update_underlying_tick方法,进入OptionData.update_underlying_tick方法.这个方法分为三步,计算期权隐波的OptionData.calculate_option_impv方法.计算合约的greeks的OptionData.calculate_cash_greeks方法,累加持仓的greeks.
1.计算期权隐波.分别传入买价和卖价的价格,还有基础标的价格,行权价,利率,到期日,期权类型,调用不同定价模型的calculate_impv方法,这个在OptionData.set_pricing_model方法中初始化。比如BS模型,进入pricing.black_scholes.calculate_impv方法,这里用BS公式计算隐波.
2.计算greeks字母.调用不同模型的calculate_greeks方法,参数是基础标的价格,行权价,利率,到期时间,隐含波动率,期权类型。比如BS模型,进入pricing.black_scholes.calculate_greeks.先通过BS公式计算d1,在计算期权价格,然后计算四个希腊字母.

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值