Skip to content

Commit

Permalink
Merge pull request vnpy#2672 from vnpy/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
vnpy authored Sep 19, 2020
2 parents fd5cd1e + 9d60bf4 commit f53749d
Show file tree
Hide file tree
Showing 476 changed files with 49,172 additions and 34,185 deletions.
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
</p>

<p align="center">
<img src ="https://img.shields.io/badge/version-2.1.5-blueviolet.svg"/>
<img src ="https://img.shields.io/badge/version-2.1.6-blueviolet.svg"/>
<img src ="https://img.shields.io/badge/platform-windows|linux|macos-yellow.svg"/>
<img src ="https://img.shields.io/badge/python-3.7-blue.svg" />
<img src ="https://img.shields.io/github/workflow/status/vnpy/vnpy/Python%20application/master"/>
Expand Down Expand Up @@ -44,7 +44,7 @@ vn.py是一套基于Python的开源量化交易系统开发框架,于2015年1

* 飞创证券(sec):ETF期权

* 宽睿(oes):国内证券(A股)
* 宽睿(oes):国内证券(A股)、ETF期权

* 中泰XTP(xtp):国内证券(A股)、ETF期权

Expand Down Expand Up @@ -136,6 +136,8 @@ vn.py是一套基于Python的开源量化交易系统开发框架,于2015年1

* script_trader:脚本策略模块,针对多标的组合类交易策略设计,同时也可以直接在命令行中实现REPL指令形式的交易,不支持回测功能

* paper_account:模拟交易模块,纯本地化实现的模拟交易功能,基于交易接口获取的实时行情进行委托撮合,提供委托成交推送以及持仓记录

* chart_wizard:K线图表模块,基于RQData数据服务(期货)或者交易接口(数字货币)获取历史数据,并结合Tick推送显示实时行情变化

* portfolio_manager:投资组合模块,面向各类基本面交易策略,以独立的策略子账户为基础,提供交易仓位的自动跟踪以及盈亏实时统计功能
Expand Down Expand Up @@ -164,7 +166,7 @@ vn.py是一套基于Python的开源量化交易系统开发框架,于2015年1

## 环境准备

* 推荐使用vn.py团队为量化交易专门打造的Python发行版[VNStudio-2.1.5](https://download.vnpy.com/vnstudio-2.1.5.exe),内置了最新版的vn.py框架以及VN Station量化管理平台,无需手动安装
* 推荐使用vn.py团队为量化交易专门打造的Python发行版[VNStudio-2.1.6](https://download.vnpy.com/vnstudio-2.1.6.exe),内置了最新版的vn.py框架以及VN Station量化管理平台,无需手动安装
* 支持的系统版本:Windows 7以上/Windows Server 2008以上/Ubuntu 18.04 LTS
* 支持的Python版本:Python 3.7 64位(**注意必须是Python 3.7 64位版本**

Expand Down
1 change: 1 addition & 0 deletions docs/chart_wizard.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# K线图表模块
90 changes: 90 additions & 0 deletions docs/data_manager.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# 历史数据管理模块

DataManger模块,是VN Trader内部针对历史数据的全功能管理工具。

![](https://user-images.githubusercontent.com/11263900/93662584-cf1ad480-fa93-11ea-9111-0383e29c9563.png)


&nbsp;
### 数据导入



打开DataManager模块的界面后,点击右上角的【导入数据】按钮,即可看到如下图所示的对话框:

![](https://user-images.githubusercontent.com/11263900/93662585-cf1ad480-fa93-11ea-8713-4c0d57faca9a.png)

该对话框复用了CsvLoader组件中的功能:



1.点击顶部的【选择文件】按钮,来选择要加载的CSV文件路径;

2.在合约信息中,输入合约代码,选择对应的交易所和周期;

3.查看CSV文件的表头信息,并将对应的表头字符串输入在表头信息中,对于【持仓量】字段,如果CSV文件中不存在的话(比如股票数据)请留空即可

4.在格式信息中,配置时间戳的日期时间格式,用于后续的时间解析处理

5.点击【确定】按钮,开始从CSV文件导入数据到数据库中。



导入过程中界面会处于半卡住的情况,对于越大的CSV文件(数据量越多),卡住的时间也会越长。



最后需要注意的是,这里导入的合约代码(symbol)和交易所(exchange)两个字段组合起来,才能构成在CTA回测等模块中使用的本地代码(vt_symbol)。举例来说,合约代码为IF2003,交易所选择CFFEX(中金所),则在CtaBacktester中回测要用到的本地代码应为IF2003.CFFEX。

&nbsp;

### 数据查看



目前VN Trader中获取数据的方式一共有三种:



- 通过RQData下载

- 从CSV文件导入

- 使用DataRecorder模块录制



不管采用何种方法获取数据,点击左上角的【刷新】按钮,即可看到当前数据库中已有数据的统计情况,如下图所示:

![](https://user-images.githubusercontent.com/11263900/93662586-cfb36b00-fa93-11ea-8075-c295d1730f8e.png)

&nbsp;




选择好要显示的数据范围后,点击【确定】按钮即可在右侧表格中看到每个时间点上具体的数据字段:




![](https://user-images.githubusercontent.com/11263900/93662588-d0e49800-fa93-11ea-828f-d9688299587b.png)

&nbsp;

### 数据导出



除了从CSV导入数据外,社区用户也提出了将数据库中的数据导出为CSV文件的需求。对于熟悉vn.py的用户可能20行代码就能解决问题,不过考虑到对于新用户的友好性,还是决定将导出功能集成到了图形界面上。



选择任意一个合约,点击该合约行数据右侧的【导出】按钮后,再次弹出对话框:

![](https://user-images.githubusercontent.com/11263900/93662589-d0e49800-fa93-11ea-9faf-7e06aa155e77.png)

&nbsp;

选好要导出的数据区间范围点击【确定】后,会再次弹出对话框选择输出文件的位置,输入确定即可完成CSV文件的导出。

1 change: 1 addition & 0 deletions docs/excel_rtd.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Excel RTD模块
21 changes: 15 additions & 6 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,23 @@ vn.py项目文档
introduction.md
install.md
quickstart.md
gateway.md
database.md

cta_strategy.md
cta_backtester.md
data_recoder.md
spread_trading.md
option_master.md
portfolio_strategy.md
algo_trader.md
script_trader.md
spread_trading.md

data_recoder.md
data_manager.md
risk_manager.md
rpc_service.md
gateway.md
database.md
rpc.md
contribution.md
chart_wizard.md
portfolio_manager.md
excel_rtd.md

contribution.md
203 changes: 203 additions & 0 deletions docs/option_master.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
# 期权波动率交易模块

OptionMaster是vn.py框架内针对【期权波动率交易】专门设计的上层应用模块。

![](https://user-images.githubusercontent.com/11263900/93662583-ce823e00-fa93-11ea-9fdb-3836da7ad0cf.png)

&nbsp;

## 初始化配置

![](https://user-images.githubusercontent.com/11263900/93662592-d215c500-fa93-11ea-8a24-a49bc4be7829.png)

&nbsp;

打开OptionMaster后,会看到上图中的长条形组件。【期权产品】下拉框中会显示当前已连接的交易接口上可选的期权产品组合。

注意底层接口必须支持期权合约的交易,这里才会有对应期权产品的显示,否则是不会有任何信息的(比如连接SimNow的CTP测试环境就没有)。

![](https://user-images.githubusercontent.com/11263900/93662593-d215c500-fa93-11ea-8f8f-bbe73c034c0e.png)

&nbsp;

点击【配置】按钮后,弹出上图所示的组合配置对话框,在这里选择要用的期权定价模型,设置期权定价中用到的无风险利率,以及每个期权链定价所用的标的物合约。

注意期权链的标的物可以选择留空,此时该期权链在后续的交易中将不会被添加到期权组合中,可以降低一部分定价相关的计算延时。

&nbsp;

## 期权定价

做期权交易,第一步总是离不开正确的定价,针对国内的期权类型,OptionMaster模块中内置了三大定价模型:

- Black-76模型:针对欧式期货期权(股指期权)
- Black-Scholes模型:针对欧式股票期权(ETF期权)
- Binomial-Tree模型:针对美式期货期权(商品期权)


每个定价模型中,从计算方向来区分,又可以分为:

1.从定价波动率来计算期权价格:calculate_price相关函数,包括希腊值相关的计算函数calculate_greeks;

2.从期权价格来返推隐含波动率:calculate_impv函数,使用Newton-Raphson method(牛顿迭代法)来计算。

所有模型中都包含了输入数值的边界检查功能,避免计算出某些异常数值。

&nbsp;

## 数据模型

期权相关的量化交易,和CTA策略等单标的量化交易相比,最大的区别之一就在于会同时交易大量的合约,包括不同行权价的期权、不同行权月份的期权以及标的物期货和股票(线性资产)。

同时以上合约之间的价格、成交、持仓等情况变化还会互相影响。在任意时间点结合当前最新行情数据的情况下,期权交易员需要能够实时跟踪整个期权交易组合的波动率曲面和希腊值风险情况。

OptionMaster中专门构建了多层嵌套式的立体数据结构,来解决以上多合约数据计算中的复杂性问题:

- UnderlyingData:标的物合约(线性资产)
- OptionData:期权合约(非线性资产)
- ChainData:期权链(某一行权月份的所有期权合约)
- PortfolioData:期权组合(某一品种的所有期权合约,以及标的物合约)

当以上数据结构中的任意一个数据发生变化时,会同时触发与之相关的所有计算,保证整体数据结构的一致性。

&nbsp;

## T型报价

T型报价是期权交易中最常用的行情显示方式,中间白色的一列为行权价,左侧为看涨期权,右侧为看跌期权。

![](https://user-images.githubusercontent.com/11263900/93662594-d2ae5b80-fa93-11ea-8104-02535ac026d4.png)

&nbsp;

上图中,除了由交易接口层推送过来的原始行情数据外(买卖价格、挂单数量、成交量、持仓量等),还包含了实时计算的买卖价隐含波动率和每个期权的现金希腊值。



传统意义上的理论希腊值,直接基于期权定价模型计算,衡量的是当某一变量发生变化时期权价格的变化情况。这种方法从数学的角度容易理解,但是从交易员的实盘使用来说却十分麻烦。



假设某个50ETF期权合约的Delta数值,使用Black-Scholes期权定价公式计算出来的结果为0.5482,意味着每当ETF价格上涨1元时,该期权的价格应该上涨0.5482元。



而50ETF当前的价格大约是3元,上涨1元是足足超过30%的涨幅,对交易员来说,知道【标的物价格上涨30%期权能赚0.5482元】不能说完全没有参考价值,但效果可能也就跟【每天喝10瓶可乐一定会胖】差不多。



所以在实践中,专业期权交易员更多使用的是现金希腊值,衡量的是当某一变量发生1%变化时该期权对应的现金盈亏情况。还是用上面的这个50ETF期权合约,其现金Delta为:



0.5484(理论Delta)x 3(标的价格)x 10000 (合约乘数)x 1% = 165



这里的165,意味着每当ETF价格上涨1%时,持有1手该期权合约的盈利金额是165元,实盘交易中用来判断某个合约当前的风险水平无疑要方便得多。



除了Delta数据外,理论Gamma/Theta/Vega等希腊值也可以同样转化为更加直观的现金希腊值。

&nbsp;


## 希腊值风险

![](https://user-images.githubusercontent.com/11263900/93662596-d346f200-fa93-11ea-9434-ba0ad40c2579.png)

&nbsp;

有了现金希腊值,可以在交易前方便直观的了解某一期权合约的风险水平。但在交易完成后,手头持有一堆期权和标的物持仓时,我们更需要持仓希腊值来跟踪当前整个账户的期权风险暴露:



持仓希腊值 = 现金希腊值 x 合约持仓



上图中的持仓希腊值的风险,分为单合约、期权链、期权组合三个层次统计,方便交易员结合各种不同类型的波动率交易策略使用(如做多近月波动率、做空远月波动率)。

&nbsp;

## 快速交易


![](https://user-images.githubusercontent.com/11263900/93662574-caeeb700-fa93-11ea-9624-56bfae28e503.png)

&nbsp;

和VN Trader主界面的交易下单组件使用类似,在上图中的【代码】编辑框中输入合约代码后回车,即可显示该合约的行情盘口数据。或者在T型报价组件上,寻找到好的交易机会后,双击单元格即可完成合约代码的自动填充和行情显示。



选好方向、开平,输入价格、数量后,点击【委托】按钮即可立即发出交易委托,点击【全撤】按钮则可一次性将当前处于活动状态的委托(未成交、部分成交)全部撤单。


&nbsp;

## 期权电子眼

期权领域的量化交易主要集中在波动率交易策略上。而期权的波动率无法从其价格上直接反应出来,需要通过定价公式来实时反推隐含波动率。

![](https://user-images.githubusercontent.com/11263900/93662578-ccb87a80-fa93-11ea-85dc-9e0df9f13369.png)

通过上图中的波动率曲线图表,交易员可以直观的看到波动率曲线(面)的形状,并且作出相应的判断分析,每个月份的波动率曲线采用不同的颜色显示:



- 向上三角形:市场上看涨期权的买卖价隐含波动率中值

- 向下三角形:市场上看跌期权的买卖价隐含波动率中值

- 圆形曲线:当前系统内的定价参考波动率



用户可以通过顶部的勾选框来选择当前要显示波动率曲线的月份,方便根据自己的需求来详细分析单一月份的形状或者多月份的曲面形态。



对当前市场的隐含波动率曲线形态有所了解后,交易员需要根据自己的判断,使用下图中的波动率管理组件,来设置定价参考波动率,作为后续电子眼交易算法的定价依据:

![](https://user-images.githubusercontent.com/11263900/93662579-cd511100-fa93-11ea-995f-c8f88a3589f2.png)

定价参考波动率的设置需要比较多的期权定价原理知识,以及一定的波动率交易经验,对于单一月份波动率曲线拟合的流程如下:



1.点击【重置】按钮,将每个行权价的期权定价波动率,初始化为该行权价虚值期权(OTM)的中值波动率;

2.观察图表中的曲线形态,对于波动率异常的行权价,勾选【执行拟合】列的勾选框;

3.全部勾选好后,点击顶部的【拟合】按钮,基于Cubic Spline算法来对勾选了的行权价的波动率执行拟合计算;

4.拟合完成后,再次检查图表中的曲线形态,并通过【定价隐波】列的调节器进行细微调整。

![](https://user-images.githubusercontent.com/11263900/93662580-cde9a780-fa93-11ea-9965-c70cf714b43d.png)

&nbsp;

完成定价参考波动率曲线的拟合后,就可以通过上图中的期权电子眼算法(英文名Electronic Eye),来自动扫描市场上的最优交易机会(max price edge),并在Tick级的时间级别上瞬时完成交易。



在波动率交易过程中,无论是期权开平仓本身引入的Delta,或者是由于持仓Gamma随着市场波动带来的Delta,都必须根据交易需求及时处理:



- 做多Gamma时锁定波动利润

- 做空Gamma时对冲额外风险

![](https://user-images.githubusercontent.com/11263900/93662581-ce823e00-fa93-11ea-9b74-a899afec927b.png)

&nbsp;

使用上图中的Delta对冲算法,交易员可以根据自己的需求选择任意定价标的物作为对冲合约,并灵活设置对冲检查执行的频率、Delta对冲目标、对冲触发阈值,以及下单时采用的委托超价等参数,来实现Delta自动实时对冲的功能。


&nbsp;


1 change: 1 addition & 0 deletions docs/portfolio_manager.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# 投资组合管理模块
Loading

0 comments on commit f53749d

Please sign in to comment.