VeighNa量化社区
你的开源社区量化交易平台
330815977's Avatar
Member
离线
78 帖子
声望: 0

终于搞明白了哈哈哈 这绕的弯弯大。,

有可能期权的 ask_price1, bid_price1报价 同时 落入 定价的 " 买卖价差/隐波价差"范围之内~~ 双边同时触发
def do_trading(self) -> None: 的这两个if 条件同时满足.,,

用Python的交易员 wrote:

不会,因为有前置检查当前是否所有委托都已经撤销
这个检查是指的"if self.short_allowed and self.check_short_finished()", "if self.long_allowed and self.check_long_finished()" 这个么?
可是这个只是检查了同方向的委托是否完成了, 未检查反方向的委托单情况,比如 :
发买单时, 只检查先前的买单委托是否完成了,
发卖单时, 只检查先前的卖单委托是否完成了, 假如先前已有自已发出的买单还挂着呢?

在电子眼交易时,这样会不会有自成交风险?
def do_trading(self) -> None:
""""""
if self.long_allowed and self.check_long_finished():
self.snipe_long() # 以卖价(对价)出击买入

    if self.short_allowed and self.check_short_finished():
        self.snipe_short()           # 同时以买价(对价)出击卖出

这样会不会有自成交风险呢?
假如在报单的过程中, 盘口已改变发生了变化(比如撤走了), 碰巧网速上又开个玩笑的话? ~~

我又看了代码, 推演了一下,还是没搞懂, 困惑ing.......
假设电子眼UI界面输入的参数是:

持仓上限: self.max_pos = 100
目标持仓: self.target_pos = 30
净持仓: option.net_pos = 0

假定某个时候,程序会按以下方式推演

第一步:
snipe_short(self):

 # Calculate volume left to trade
    pos_down_limit = self.target_pos - self.max_pos  = 30-100 = -70   
    volume_left = option.net_pos - pos_down_limit  = 0-(-70)=70
 ------经过几次狙击卖出,会使得净持仓  option.net_pos = -70(空单70手)

第二步:
snipe_long(self):

  # Calculate volume left to trade
    pos_up_limit = self.target_pos + self.max_pos  = 30+100=130   
    volume_left = pos_up_limit - option.net_pos  = 130-(-70)=200
  ------经过几次狙击买入,会使得净持仓  option.net_pos = 200-70=130(多单130手)
 【可是持仓上限self.max_pos=100, 这样会不会超限了呢? 这个上限有是怎么发挥作用的呢?】

第三步:
snipe_short(self):

 # Calculate volume left to trade
    pos_down_limit = self.target_pos - self.max_pos  = 30-100 = -70   
    volume_left = option.net_pos - pos_down_limit  = 130-(-70)=200
 ------经过几次狙击卖出,会使得净持仓  option.net_pos = -130(空单130手)
 【可是持仓上限self.max_pos=100, 这样会不会超限了呢? 这个上限有是怎么发挥作用的呢?】

第四步:
snipe_long(self):

  # Calculate volume left to trade
    pos_up_limit = self.target_pos + self.max_pos  = 30+100=130   
    volume_left = pos_up_limit - option.net_pos  = 130-(-130)=260
  ------经过几次狙击买入,会使得净持仓  option.net_pos = 260-130=130(多单130手)
 【可是持仓上限self.max_pos=100, 这样会不会超限了呢? 这个上限有是怎么发挥作用的呢?】
  ......到此好像循环了,,

搞不懂哟.....

Delta对冲, 在对冲阈值检查的时候, 用的是标的物的理论Delta, 不是现金Delta.

检查用户界面设定的对冲阈值是否小于标的物理论Delta的60% (underlying.theo_delta (widget.py, Line 665668)
而对冲引擎在判断是否执行对冲的时候, 用的却又是整个组合的现金Delta. portfolio.pos_delta (engine.py Line 429
432)

1, 为什么在对冲阈值检查的时候, 是用标的物的Delta的60%? 而不是用整个组合的 Delta?
2, 为什么在对冲阈值检查的时候, 是用标的物的理论Delta? (underlying.theo_delta), 而不是用现金Delta?
3, 那么, 用户界面上输入的Delta目标 和 对冲阈值(这个好像是容忍Delta偏离范围?) , 这用户输入的 那又是什么Delta呢? theo_delta? pos_delta? underlying delta? 还是指整个组合的Delta? theo_delta? pos_delta?
哈哈哈~ 我转迷糊了

widget.py, Line 665~~668......:

Check delta of underlying

    underlying = self.option_engine.get_instrument(vt_symbol)
    min_range = int(underlying.theo_delta * 0.6)
    if delta_range < min_range:
        msg = f"Delta对冲阈值({delta_range})低于对冲合约"\
            f"Delta值的60%({min_range}),可能导致来回频繁对冲!"
        QtWidgets.QMessageBox.warning(
            self,
            "无法启动自动对冲",
            msg,
            QtWidgets.QMessageBox.Ok
        )
        return
#

engine.py Line 429~~432...:

Do nothing if portfolio delta is in the allowed range

    portfolio = self.option_engine.get_portfolio(self.portfolio_name)
    if delta_min <= portfolio.pos_delta <= delta_max:
        return

噢, 嗡的一下~~明白了! 原来是看标的物价格涨1%啊, 那这样就解释通了. .. 我理解成看标的物价格涨1元钱了, 是我理解错了!
多谢指点!!!

OptionMaster电子眼只能盯一个品种组合吗?有没有办法可以盯多个品种组合呢?
比如,IO股指期权, 还有几个商品期权,比如铜期权, 豆粕,菜粕,白糖,PTA,棉花,铁矿石,甲醇, 橡胶........ 可不可以同时监测描扫呀~
我看到算法代码写法,好像是有考虑到多实例的, 感觉一个期权大师就这样只盯一个品种组合有点浪费哈哈哈~~

再问,如果用多进程的方式来, 那那啥CTP这些目录路径啥的, 是怎样指定的? 不区分目录的话,多进程直接启会不会有什么问题?

自已顶起~ 希望大师们能看到,求解惑~^O^

Delta对冲,对冲引擎只自动对冲买入/卖出标的物合约吗? 如果是看涨看跌期权对冲就不支持自动对冲是吧?
我看代码,好像是这样的,

哦,原来是这样,.. 后来我也想了,这个可能就是为了把理想中的那条波动率微笑那个曲线做的平滑些..
假如实际的波动率典线上看起来太扯了,有些行使价的点看起来太偏离了, 而不想用那里的(市场)隐波, 去做定价波动率, 所以就用拟合来算出一个波动率,去作定价波动率.

又看了代码,终于明白了"拟合"是什么意思了:
就是选用期权链上的各个点(行权价)及其定价波动率pricing_impv,用三次样条插值算法,来拟合那几个被check框选中的点(行权价)的定价隐波:
期权链上所有没有被check框选中的那些合约的行使价和它们的定价隐波,用它们做三次样条插值算法,拟合出来的曲线,会履盖到那几个被check框选中的点(行权价),那些被选中的点就是需要拟合的,

重置: 把所有合约的定价隐波,重新设定为其中值隐波,

+0.1%, -0.1% pricing_impv 加减0.001

可是这样做的意义是啥呢?
假定已知某几个合约的pricing_impv隐波率,或者自行设定某几个合约的pricing_impv隐波率, 或者说认可这几合约的pricing_impv隐波率, 然后,去拟合出另外一些合约的pricing_impv隐波率? 然后用这些隐波率去计算理论价格(定价? ~~~^O^

我看vnpy代码,结合期权书上,大致上的理解是:

1, Delta 表示标的资产价格变动一个单位,期权价格变动的数值, 比如豆粕的某期权合约delta为0.5意味着豆粕价格上涨10块钱,该期权的价格上涨5块钱.
vnpy T型报价表中显示的 Delta 好像是还乘上了合约乘数, 这样的delta 的意义是?
标的物价格上涨1元, 则1手期权的 持仓的 市值 上涨Delta元?

2, Gamma值为0.05,则表示标的价格上升1元,所引起delta增加量为0.05. delta将从0.6增加到0.65。
vnpy T型报价表中显示的Gamma, 也是乘上了合约乘数,,
设Gamma=0.05, 合约乘数为10,标的物价格上涨1元, 所引起delta增加量为0.05, 继而所引起的1手期权的 市值的增量为0.05 *10 =0.5元
这样的vnpy T型报价表中Gamma的意义就是:
标的物价格上涨1元, 所引起 1手期权的 持仓的 市值 上涨Gamma 元? 下跌同理?

3, vega是期权的一种风险度量指标,度量的是动率对期权价格的影响,表示当标的物价格波动率变化一个百分点时期权价格的变化值,计算方法是权利金的变动值/波动率变动值。就是波动率变化1%, 期权权利金会变化Vega元
vnpy T型报价表中显示的Vega, 也是乘上了合约乘数,这个Vega的意义就是:
当波动率变化1%, 1手期权持仓的市值会变化Vega元?

4, theta表示时间(vnpy中指的是交易日)减少一天, 期权价格的变化值(减少值 )
vnpy T型报价表中显示的Theta, 也是乘上了合约乘数, 这个Theta的意义就是:?
表示时间(vnpy中指的是交易日)每减少一天, 1手期权持仓的市值的变化值(减少值 ),也就是1手期权持仓,拿一天会亏多少钱(在时间价值上)

但是我发现, 以上的理解好像和实际不符,好像说不通?:
比如: 沪深300指数4205,
IO2003-C-4150, vnpy T 型报价显示 Delta = 2492 (实值)
IO2003-C-4200, vnpy T 型报价显示 Delta = 2119 (实值)
IO2003-C-4250, vnpy T 型报价显示 Delta = 1735 (平值)
这怎么理解呢?
是说 沪深300指数变动一个点, 一手IO期权的市值变化2492元, 2119元,1735元?
还是说 沪深300指数变动100点, 一手IO期权的市值变化2492元, 2119元,1735元?
但是, 平值期权的delta=0.5, 沪深300指数变动100点, 平值期权价格变动50点(暂不考虑Gamma和其它), 那一手IO期权的市值变化那应是50 x 100(合约乘数)=500元 , 这和vnpy T 型报价显示 Delta却不是, 哈哈哈, 这个没法儿解释了~
请求哪位懂的大师科普一下

情景分析那个 波动率曲面一定要有持仓才能显示出来吗?

哦哦, 我再去详细看看代码了解~~

IO股指期权 电子眼"开始定价" 则是正常的, 不抛出这种异常.,.

不明觉厉~~ 呵呵, 看来还是要一步一步来弄懂才行

电子眼定价
Traceback (most recent call last):
File "C:\vnstudio\lib\site-packages\vnpy-2.1.0.1-py3.7.egg\vnpy\app\option_master\ui\manager.py", line 132, in on_clicked
self.manager.start_algo_pricing(self.vt_symbol)
File "C:\vnstudio\lib\site-packages\vnpy-2.1.0.1-py3.7.egg\vnpy\app\option_master\ui\manager.py", line 412, in start_algo_pricing
self.algo_engine.start_algo_pricing(vt_symbol, params)
File "C:\vnstudio\lib\site-packages\vnpy-2.1.0.1-py3.7.egg\vnpy\app\option_master\engine.py", line 583, in start_algo_pricing
result = algo.start_pricing(params)
File "C:\vnstudio\lib\site-packages\vnpy-2.1.0.1-py3.7.egg\vnpy\app\option_master\algo.py", line 61, in start_pricing
self.calculate_price()
File "C:\vnstudio\lib\site-packages\vnpy-2.1.0.1-py3.7.egg\vnpy\app\option_master\algo.py", line 265, in calculate_price
ref_price = option.calculate_ref_price()
File "C:\vnstudio\lib\site-packages\vnpy-2.1.0.1-py3.7.egg\vnpy\app\option_master\base.py", line 221, in calculate_ref_price
self.option_type
File "binomial_tree_cython.pyx", line 77, in binomial_tree_cython.calculate_price
File "binomial_tree_cython.pyx", line 40, in binomial_tree_cython.generate_tree
ZeroDivisionError: float division

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】