vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 78
声望: 0

现金希腊值的意义,在 Black-76 欧式期货期权 和 二叉树 美式期货期权 两种定价模型上 不一致
早前我曾请教过有关现金希腊值的:
https://www.vnpy.com/forum/topic/2634-qing-jiao-yi-xia-you-guan-vnpyqi-quan-xian-jin-xi-la-zhi-de-yi-xie-yi-wen
在那里,vnpy作者曾解答了我的疑惑,他是这么说的:
用Python的交易员 wrote:

现金Delta:价格上涨1%,合约的价值变动
现金Gamma:价格上涨1%,合约的现金Delta变动
现金Theta:每过去1天,合约价值的减少
现金Vega:隐波上涨1%,合约的价值变动

所有的数字,都直接反应你的账户盈亏,而不是那些理论数值。

好,这个我现在明白了。 非常感谢vnpy耐心的解答。
我现在的问题是,我在实际测试中发现,这个现金希腊值的意义,在 Black-76 欧式期货期权 和 二叉树 美式期货期权 两种定价模型上 不一致。
问题出在 二叉树 美式期货期权 定价模型中希腊值计算返回的只是传统意义上的理论希腊值,以Delta为例,它返回的是传统意义上的理论Delta, 而没有额外乘上了标的物价格的1%,
具体情况,我来说一说:
在OptionData 类 中有一个函数calculate_cash_greeks计算现金希腊值,这个函数中是调用了该期权的定价模型中的方法calculate_greeks去计算希腊值 ,在最开始的时候,我以为定价模型中calculate_greeks函数反回的就是理论希腊值,但是依照作者对现金希腊值的解答,我按照Delta的定义的计算公式推导了一下,发现定价模型中calculate_greeks函数反回的不能是传统意义上的理论Delta, 它返回的应该是 理论delta x (标的价格*0.01) ,即 在传统的理论希腊值Delta上 额外乘上了标的物价格的1%,它返回的是这个额外乘上了标的价格的1%之后的值, 只有这样,再乘上合约尺寸,得到的现金Delta,才符合vnpy作者说的意义:标的物价格上涨1%,期权合约的价值变动。
我进一步去看定价模型,果然如此,Black-76 欧式期货期权black_76.py,计算希腊值Delta返回的时候,确实是额外乘上了标的物价格的1%,
然而,在二叉树 美式期货期权定价模型binomial_tree.py,计算希腊值Delta返回的时候,直接返回Delta, 却并没有额外乘上了标的物价格的1%,
所以,这要一来, 在沪深300 IO股指期权, 上期所沪铜期权,上,现金希腊值,持仓希腊值的意义是正确的,
而在 豆粕期权, 白糖期权。。。。等其它商品期权上,现金希腊值,持仓希腊值的意义 ,比如在vnpy T型报价表上的希腊值, 持仓希腊值列表上的希腊值,它们就和那些欧式期货期权的意思不一样了,它们实际上是 “ 标的物价格变化 一个点/一个跳动/一块钱?时,相应期权合约价值变动多少钱? 而不是”标的物价格上涨1%,期权合约的价值变动。“

如此,我就有点困惑了,现金希腊值的意义,在 Black-76 欧式期货期权 和 二叉树 美式期货期权 两种定价模型上 不一致, 是程序设计本意就是如此?还是其它别的原因呢?
可能 商品期货不如股指波动剧烈? 也可能波动更剧烈? 用”标的物价格上涨1%“ 这个尺度来计量太大了,所以特别的以”标的物价格变动1块钱“这种尺度来计量更适合些?
请大师指点解惑,多谢~~

另外还有一个问题 vnpy-2.1.2,
(VN Studio) E:\vnpy-2.1.2\examples\vn_trader>python run.py
Traceback (most recent call last):
File "run.py", line 57, in <module>
from vnpy.app.option_master import OptionMasterApp
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\app\option_master__init.py", line 3, in <module>
from .engine import OptionEngine, APP_NAME
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\app\option_master\engine.py", line 33, in <module>
from .pricing import binomial_tree_cython as binomial_tree
File "
init__.pxd", line 918, in init binomial_tree_cython
ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C header, got 192 from PyObject
这个不知道 是什么原因?

Administrator
avatar
加入于:
帖子: 4122
声望: 229

pip install numpy --upgrade升级下即可

二叉树和BS的数值应该是一样的,你可以直接在命令行import他们两个计算下看涨期权结果是否一致,如果偏差很大(比如差个几倍),那可能就是我们的BUG了

Member
avatar
加入于:
帖子: 78
声望: 0

我直接在vnpy T型报价表上看到, 平值期权的,现金Delta值, 不对,
以豆粕为例, 二叉树 美式期货期权, m2009现价2750元, 平值期权ATM m2009-C-2750 的现金Delta值显示为5.1821, 这明显不对; 因为平值期权理论是 0.5(其它软件上也确实是0.5082), 按照现金Delta的定义, 它应该等于: 0.5 x 2750 x 0.01 x 10 = 137.5 , 即: 理论Delta x 标的物合约现价的1% x 合约尺寸.

但是vnpy T型报价表上显示的现金Delta却是 5.1821... 明显不对, binomial_tree.py定价模型的calculate_cash_greeks函数返回Delta时漏乘了 " 标的物合约现价的1% "
vnpy T型报价表上显示的现金Gamma 是0.0168, 这个好像也不对, 它也只是理论Gamma 合约尺寸, 定价模型的calculate_cash_greeks函数返回Gamma 时好像也漏乘了 " (标的物合约现价的1%)^2 ", 这里与Delta好像不同,应该是平方,in python: pow(标的物价格,2) 0.0001
其它希腊值 Vega, Thega我没有验算, 不知道是否也同样有这个问题.

而对于Black-76 欧式期货期权,vnpy T型报价表上显示的现金希腊值, 我也只手工验算了一下Delta, 好像是对的. 而其它的希腊字母我就没有细算,

Member
avatar
加入于:
帖子: 78
声望: 0

用Python的交易员 wrote:

pip install numpy --upgrade升级下即可

二叉树和BS的数值应该是一样的,你可以直接在命令行import他们两个计算下看涨期权结果是否一致,如果偏差很大(比如差个几倍),那可能就是我们的BUG了

我又详细看了 binomial_tree_cython.pyx, binomial_tree.py 的calculate_greeks函数 ,
Cython 实现的二叉树 美式期货期权 和 python 实现的, 都有这个问题,
binomial_tree_cython.pyx : calculate_greeks 函数里面第190行~193行是这么写的:

# Delta
option_price_change = option_tree[0, 1] - option_tree[1, 1]
underlying_price_change = underlying_tree[0, 1] - underlying_tree[1, 1]
delta = option_price_change / underlying_price_change

期权价格变化量 / 标的物价格变化量 , 这确实只是一理论Delta, 应该额外乘上标的物价格的1% :
delta = (option_price_change / underlying_price_change) f 0.01
这样后面再计算出来的现金Delta的意义,才是和标的物的cash_delta一致的,才是 和Black-76 欧式期货期权那种cash_delta的意义一致的,
如此,后面进一步计算持仓Delta, 搞Delta对冲....就对了.

 Gamma也有同样的问题.  也应该额外乘上(标的物价格的1%)^2,  [这里好像与Delta不同, 应该算平方, in python:   pow(标的物价格,2)*0.0001 ]

但另外两个希腊值Vega 和 Theta 我没法手工验算, 所以就不知道了, 只有请大师们帮忙再检查检查 二叉树 美式期货期权定价模型这部分代码了

Member
avatar
加入于:
帖子: 78
声望: 0

用Python的交易员 wrote:

pip install numpy --upgrade升级下即可

二叉树和BS的数值应该是一样的,你可以直接在命令行import他们两个计算下看涨期权结果是否一致,如果偏差很大(比如差个几倍),那可能就是我们的BUG了

另外汇报一下, 我之前说的 这个问题 vnpy-2.1.2,
(VN Studio) E:\vnpy-2.1.2\examples\vn_trader>python run.py
Traceback (most recent call last):
File "run.py", line 57, in <module>
from vnpy.app.option_master import OptionMasterApp
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\app\option_masterinit.py", line 3, in <module>
from .engine import OptionEngine, APP_NAME
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\app\option_master\engine.py", line 33, in <module>
from .pricing import binomial_tree_cython as binomial_tree
File "init
.pxd", line 918, in init binomial_tree_cython
ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C header, got 192 from PyObject

pip install numpy --upgrade升级, 这个方法我没试过, 可能这也是一个方法,可能我的本机环境有些是没有更新.
我后来是在本机重新编译了Cython定价模型, 本机环境好像是Microsoft Visual Studio 14.0\VC,......啥的, 就本机重新编译安装了, 然后就没有这个现象了

Administrator
avatar
加入于:
帖子: 4122
声望: 229

收到,我们下个版本来修复下

Member
avatar
加入于:
帖子: 78
声望: 0

嗯, 我提到这里了https://github.com/vnpy/vnpy/issues/2501

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3