我倒是想研究这个呢,我有个请教,
是这种有监督的学习效果好呢?
还是用强化学习的效果好呢?
哇, 刚了解了一下, 这个组合框架厉害了, 能想到这个办法~,.,
强制合成那个,我估计可能是考虑到期权合约流动性不及期货活跃?
期货合约一般是每秒2跳动
期权合约,我没有跟踪过,不知道是不是也是每秒2跳? 还是说一定要有报价变动或有成交变动才会推送tick进来?
用Python的交易员 wrote:
好问题,不同月份的VEGA其实不是对等的,还有二阶希腊值Vega Corrlation要做校准(这个值还会变),所以期权交易才那么复杂。
是哟~ 是有些复杂呢, 就是不知道 玩Gamma Scalping剥头皮, 究竟有没有个搞头滴, 年化大概能跑到多少收益? 可不可稍稍透露一些? 哈哈~~~
好的,我刚提了三个issue, 有一个我也还没有定位到
https://github.com/vnpy/vnpy/issues/2499
https://github.com/vnpy/vnpy/issues/2500
https://github.com/vnpy/vnpy/issues/2501
Exception in thread Thread-3:
Traceback (most recent call last):
File "C:\vnstudio\lib\threading.py", line 917, in _bootstrap_inner
self.run()
File "C:\vnstudio\lib\threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\event\engine.py", line 60, in _run
self._process(event)
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\event\engine.py", line 73, in _process
[handler(event) for handler in self._handlers[event.type]]
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\event\engine.py", line 73, in <listcomp>
[handler(event) for handler in self._handlers[event.type]]
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\app\option_master\engine.py", line 173, in process_tick_event
portfolio.update_tick(tick)
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\app\option_master\base.py", line 606, in update_tick
chain.update_tick(tick)
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\app\option_master\base.py", line 436, in update_tick
option.update_tick(tick)
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\app\option_master\base.py", line 279, in update_tick
self.calculate_option_impv()
File "C:\vnstudio\lib\site-packages\vnpy-2.1.2-py3.7.egg\vnpy\app\option_master\base.py", line 176, in calculate_option_impv
underlying_price = self.underlying.mid_price
AttributeError: 'NoneType' object has no attribute 'mid_price'
这个问题偶而会出现, 尤其是在交易的开市时段 启动vnpy时,有一定的概率会出现, 不知道是不是标的物合约还未设置,就有期权合约的Tick进来,然后就开始计算隐波了,
可不可以像calculate_cash_greeks那样, 在calculate_option_impv函数开头,加一个:
if not self.underlying:
return
我来试试看,
搞懂了~哈哈哈~
自已来答一下:
1, 对冲的时候最小的时候是以一手为单位进行对冲,所以是用标的物的现金Delta的60%?,即太小了不够一手标的物对冲的就先暂时不对冲了,
2, 最新版的vnpy-2.1.2 上看到, 标的物的那个已经是用现金Delta了,
3, 用户界面上输入的Delta目标 和 对冲阈值(这个好像是容忍Delta偏离范围) , 这个是整个组合的持仓Delta及其容忍度范围
用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,......啥的, 就本机重新编译安装了, 然后就没有这个现象了
用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 我没法手工验算, 所以就不知道了, 只有请大师们帮忙再检查检查 二叉树 美式期货期权定价模型这部分代码了
嗯, 原来如此,那就对了.
那么,对于股指期权,标的物是连续的,只是期权合约会跨月换月, 比较方便用跨月份的期权做对冲,
可是, 商品期权的标的物, 是不连续的,各个月分不同, 那它的Vega期限结构, 相当于算是基于不同的标的物了, 那Vega还可以正常对冲吗?
还是说把远月期权 与近月期权 的标的物合约都配置成近月份的标的合约?
比如豆粕, 在期权组合配置界面就要这么配置吗??: 哈哈哈,感觉怪怪的~
我说的正是这个意思呢.
但是, 对冲引擎的代码中并没有做这个检查,而是直接去发单了, 我跟踪代码直到CTP Gageway API报单出去, 都未见到有做这个检查, 是直接报单出去了..
我目前是这么弄的, 在对冲引擎的定时器 事件处理 上下文的 run 函数中加了一句, 检查对冲手数是否小于1:
order_volume = abs(hedge_volume)
if order_volume < 1: # # 这里做一个检查, 对冲最小的手数是1,如果小于1,不发出委托
return
req = OrderRequest(
symbol=contract.symbol,
exchange=contract.exchange,
direction=direction,
type=OrderType.LIMIT,
volume=order_volume,
price=round_to(price, contract.pricetick),
)
......................................
.......................................
我直接在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, 好像是对的. 而其它的希腊字母我就没有细算,
OptionMaster 怎样对冲组合持仓的Vega风险?
Delta可以自动对冲, 那么Vega是要怎么弄呢, 要手工进行对冲吗?
哦,还有一问,就是,对于股指期权,标的物是连续的,只是期权合约会跨月换月, 比较方便Vega期限结构对冲,
可是, 商品期权的标的物, 是不连续的,各个月分不同, 那它的Vega期限结构, 相当于算是基于不同的标的物了, 那Vega还可以正常对冲吗?
乌拉龟 wrote:
假设第一天持有1手多单,并提前下了止损单。
然后第一天收盘关闭软件。第二天开盘前10分钟开启软件。
开盘前已经发现会低开触发止损价格。
那么这个止损单会在开盘的一瞬间生效吗,还是说要先等X分钟的Bargenerator生成X分钟K线,然后推送并触发X分钟的ONBAR函数,再执行X分钟onbar回调函数下的止损逻辑send stop order? 如果是这样的话就等于是延迟X分钟才会发单了。所以是否有内置函数可以储存之前的订单以供第二天使用?
这个问题吧, 程序停止单当然是在本地机器内存了,程序关了, 当然是失效了. 程序重启之后当然要重新设置停损
不知你用的是哪个版本的程序.
这个问题可也以解决, 把你需要保存的内容,比如持仓, 停损位置, 等,设为策略变量, 引擎会在停止策略时保存到本地文件中, 重启后会重新读回, 然后,当你重新初始化策略的时候,
onbar会被执行, onbar里面, 要在pos不等于0的执行路径里面,重新设置停损单(当然这样的话,每次onbar都会设停损单, 当然每次进入onbar也先要全部撤掉所有本地停止单, 以免多次重复设停损单)
乌拉龟 wrote:
再有一个问题就是第一天有持仓,第二天的话实际上除非自己维护记录,否则不会知道第一天的入场价格了。
这个要看你有的是哪个版本, 新版的程序, 策略好像已经有可以保存策略变量的功能了,
把策略的持仓, 开仓价格, 等需要保存的东西, 设为策略变量, 在停止策略的时候,CTA引擎会将策略的变量保存到 json格式的文件中, 程序重新加载策略的时候会读回文件中保存的内容.
1, 搞一个Tick对象,缓存最新的一个tick, 里面有最新价,涨停价,跌停价...., 报单前可以检查一下,比如,临近涨停价多少多少跳范围之内,禁止做空/做多.....类似....
2, 接1, tick对象里面会有tick的报送时间戳, 可以用来判断当前是否处在开盘30秒或1分钟.......
ontick, onbar, 都是回调函数, 处在同一个线程的上下文环境中, 理论上不会出现竞态/并发等问题也都不用考虑
我早前遇到过这个问题, 好像是机器的" locale " 设置不对? 后来几折腾几折腾可以了,
你的ubuntu是中文系统吗?
对冲引擎在计算对冲报单手数时, 可能会出现纯小数手数, 或非整数手数,
send_order(self, req: OrderRequest) 会把这个接直报给Gateway 的send_order去报单,
CTP Gateway 在send_order里面,对报单手数进行了取整 int(req.volume),
对于大于1的非整数手数, 取整之后的手数会>=1, 报单没有问题,
但对于纯小数手数, 取整之后的手数会变成0, 这样报单会不会被认为是废单/无效单?
如果这种废单/无效单?频繁报送, API那边会不会被封掉账号呢?,
不知道这种情况一般是怎么处理的?
现金希腊值的意义,在 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
这个不知道 是什么原因?
vnpy 2.x. BG怎样生成x秒 K线?