第 5 章 · 01 Options Straddle:跨式与事件驱动


文档摘要

第 5 章 · 01 Options Straddle:跨式与事件驱动 本节摘要:本节精读 Options Straddle——跨式期权,事件驱动策略的标配。多头跨式 = 同行权价、同到期日、最好同价的 call + put,它的 payoff 图呈"圆规"形:只要现货大幅偏离行权价(无论方向),就赚钱;真正让它亏钱的不是方向错,而是价格停滞、波动不足。我们重点讲清楚 用正则提取"同时存在 call 和 put"的行权价、 把期权价与现货(乘合约规模 10)合并、 仅当 才入场,以及 怎么画出红亏绿盈的 payoff 图。但本节最深的教学点不在公式,而在那个 quantamental 观点——选择行权价不是 Greeks 银弹,而是要请经济学家给基准/最好/最坏情景。

第 5 章 · 01 Options Straddle:跨式与事件驱动

本节摘要:本节精读 Options Straddle——跨式期权,事件驱动策略的标配。多头跨式 = 同行权价、同到期日、最好同价的 call + put,它的 payoff 图呈"圆规"形:只要现货大幅偏离行权价(无论方向),就赚钱;真正让它亏钱的不是方向错,而是价格停滞、波动不足。我们重点讲清楚 find_strike_price 用正则提取"同时存在 call 和 put"的行权价、straddle 把期权价与现货(乘合约规模 10)合并、signal_generation 仅当 |call-put|<2 欧元才入场,以及 plot 怎么画出红亏绿盈的 payoff 图。但本节最深的教学点不在公式,而在那个 quantamental 观点——选择行权价不是 Greeks 银弹,而是要请经济学家给基准/最好/最坏情景。这为第 6 章的 quantamental 大项目埋下伏笔。

涉及源码:原项目 Options Straddle backtest.py(约 315 行),数据 stoxx50.xlsx(含 spot / aug / jul 三张表,Euro Stoxx 50 指数期权)。

⚠️ 注意:本节策略最大的坑是"同价同权只存理想"。看代码前务必理解:signal_generation|call-put|<threshold 不是可选优化,而是跨式成立的硬条件——若 call 与 put 价格差距过大,说明市场已对某一方向定价,跨式就退化成单边赌注。

学习目标

阅读完本节,你应当能够:

  1. 说清多头跨式与空头跨式的 payoff 结构,以及为什么多头跨式"上行收益无限、下行损失有限"。
  2. 解释跨式为什么是事件驱动(公投/财报)的标配,以及 Brexit 案例的三种情景。
  3. 还原 find_strike_price 用正则提取"call+put 同时存在"的行权价。
  4. 解释 |call-put|<2 欧元 这个入场阈值背后的"同价同权"逻辑。
  5. 画 straddle 的盈亏函数 |spot - K*contractsize| - (call+put),标注盈亏平衡点。
  6. 接受"行权价选择靠基本面而非 Greeks"的 quantamental 观点。

金融/数学原理

跨式:从双向不确定中获利

期权是金融衍生品,让你在未来以某个价格交易标的资产。跨式(straddle)是期权组合里最经典的"赌波动率"结构。多头跨式(long straddle) = 同时买入同一行权价、同一到期日的 call 和 put,最好 call 与 put 的价格也一样。

它的 payoff 图呈"圆规"形——像一个倒 V(对多头而言):

盈亏 ↑ / \ ← 现货远离行权价(任意方向),赚钱 │ / \ │ / \ │ / \ │____/__________\____ → 现货 下盈亏点 行权价 上盈亏点 (圆规尖)
  • 上行收益无限:现货大涨,call 大赚,put 只损失权利金。
  • 下行损失有限:现货大跌,put 大赚(下行收益也很大,但因现货不会跌破 0,理论上不如上行"无限"),call 只损失权利金。
  • 真正亏钱的情形:现货停留在行权价附近,call 和 put 都变成废纸,两头权利金全亏。

所以多头跨式赌的不是方向,是波动率——只要价格动得够远,就赚;不动,就亏。反过来,空头跨式(short straddle) 同一时点卖出 call + put,赌的是"价格不动",适合横盘市场,但上行损失无限,风险极高。

事件驱动:跨式的天然战场

正因为跨式赌的是波动,它天然适合事件驱动(event driven)策略——在结果高度不确定、但"一定会有大波动"的事件前后建仓。典型场景:公投、财报、央行决议。作者举的例子是 Brexit(英国脱欧):

"brexit on 30th of October 2019, its do or die, no ifs and buts. if bojo delivers a no-deal Brexit, uk sterling gonna sink. or he secures a new deal without backstop from macron and merkel. even though unlikely, uk sterling still gonna surge. either way, there will be a lot of volatility around that particular date."

三种情景,无论哪种,英镑都会大动:

  1. 无协议脱欧(Bojo 强硬):英镑暴跌。
  2. 谈成新协议(去掉 backstop,Macron/Merkel 让步):英镑飙升。
  3. 延期(Bojo 认怂):英镑还是涨(避险情绪缓解)。

三种结果方向不一,但"波动大"是确定的——这正是跨式的用武之地。事先买入跨式,不赌方向,只赌"那天一定有大行情"。

同价同权:只存于理想

跨式的理论前提是 call 和 put "同价"——否则一边的权利金比另一边贵,就说明市场对某一方向已有倾向,跨式就退化成"偏多的跨式"或"偏空的跨式"(那种情况该用 strangle 或 strap/strip)。

作者泼了一盆冷水:

"the same call and put option price for the same strike price and the same strike date only exists in an ideal world, in reality, it is like royal flush(同价同权只存于理想世界,现实里就像皇家同花顺一样稀有)。"

所以代码里 signal_generation 只在 |call-put|<threshold 时入场,本质是在"找一个尽可能中性的跨式"。作者还警告:"please don't arrogantly believe that you outsmart the rest of the players in the market, all the information you have obtained from any tips may have already been priced in(别自作聪明以为能赢过市场其他玩家,你从任何小道消息获取的信息可能早已被定价)。"

算法与代码精读

find_strike_price:正则筛"双权"行权价

Options Straddle backtest.py:83-92find_strike_price 是跨式的第一道硬条件——只保留同时有 call 和 put 的行权价:

def find_strike_price(df): temp = [re.search('\d{4}', i).group() for i in df.columns] target = [] for i in set(temp): if temp.count(i) > 1: target.append(i) return target

逻辑:列名形如 C3000(call,行权价 3000)、P3000(put,行权价 3000)。用正则 \d{4} 提取每个列名的四位数字(行权价),统计每个行权价出现的次数——出现超过 1 次说明 call 和 put 都在,这就是跨式可用的行权价。这个正则写法很脆(假设行权价恒为 4 位数字),但对 Euro Stoxx 50 的数据够用。

straddle:合并期权与现货

L101-125straddle 做数据清洗——把指定行权价的 call/put 列与现货列合并,并把现货乘以合约规模:

option = options[[i for i in options.columns if strikeprice in i]] df = pd.merge(spot, option, left_index=True, right_index=True) # 重命名列为 call / put / spot df['spot'] = df['spot'].apply(lambda x: x * contractsize)

合约规模 contractsize=10(Euro Stoxx 50 期权是每欧元 10 tick)——现货价乘以 10,是为了后续画 payoff 图时单位统一(行权价也乘以 contractsize)。这一步看似多余,实则是为了把"指数点位"换算成"合约名义价值",让盈亏图横轴可读。

signal_generation:同价才入场

L134-141 是全策略最短最关键的函数:

def signal_generation(df, threshold): df['signals'] = np.where(np.abs(df['call'] - df['put']) < threshold, 1, 0) return df

只有当 |call - put| < threshold(默认 2 欧元)时才入场。这个 threshold 不是止损,而是"同价同权"的容忍度——2 欧元以内的价差,视为 call 和 put "基本同价",跨式近似成立;超过 2 欧元,说明市场已对某方向定价,跨式失效,不入场。

plot:画"圆规"形 payoff

L147-263plot 是本节的视觉高潮。盈亏函数(任一现货价 j 处):

temp = np.abs(j - int(strikeprice)*contractsize) - (df['call'][ind[0]] + df['put'][ind[0]])

payoff = |现货 - 行权价×合约规模| - (call + put)。这是一个绝对值函数减去一个常数,图像就是"圆规"形的 V 字——两端为正(盈),中间为负(亏)。

画图的关键是红亏绿盈分段(L181-188):

group1, group2 = -10, -10 for j in x: temp = np.abs(j - int(strikeprice)*contractsize) - (df['call'][ind[0]] + df['put'][ind[0]]) y.append(temp) if temp < 0 and group1 < 0: group1 = x.index(j) # 第一次从盈转亏 if temp > 0 and group1 > 0 and group2 < 0: group2 = x.index(j) # 第一次从亏转盈

group1 是"左盈亏平衡点"的索引(第一个 temp 变负的位置),group2 是"右盈亏平衡点"的索引(第一个 temp 重新变正的位置)。两平衡点之间是亏损区(红),两端是盈利区(绿):

plt.plot(x[:group1], y[:group1], c='#57bc90', lw=5) # 左端绿 plt.plot(x[group2:], y[group2:], c='#57bc90', lw=5) # 右端绿 plt.plot(x[group1:group2], y[group1:group2], c='#ec576b', lw=5) # 中间红

再叠加四个标注:行权价(圆规尖,虚线)、下盈亏平衡点(行权价 - 权利金之和)、上盈亏平衡点(行权价 + 权利金之和)、现货价(黄色虚线,告诉你当前落在盈还是亏区)。

图: 跨式payoff

上图就是一张典型的跨式 payoff 图:绿色两段是盈利区(现货远离行权价),红色中段是亏损区(现货停滞在行权价附近),圆规尖正好落在行权价上,两个盈亏平衡点对称分布。标题还打印了该笔交易的实际盈亏 P&L。

main:遍历所有"双权"行权价

main(L283-307)对每一个"双权"行权价都跑一遍 straddle + signal + plot,目的是找出最优行权价最大化收益:

target = find_strike_price(aug) for strikeprice in target: df = straddle(aug, spot, contractsize, strikeprice) signal = signal_generation(df, threshold) plot(signal, strikeprice, contractsize)

🎯 反直觉/quantamental 观点:本节的反直觉不在 payoff 公式,而在那个 quantamental 立场。作者问:"which strike price should we pick? this is when u need to consult with some economists to get a base case(该选哪个行权价?这时候你得去请教经济学家,要一个基准情景)。"

他接着说:"their fundamental analysis will determine your best/worst scenario, therefore, u can pick a good strike price to maximize your profit(他们的基本面分析会决定你的最好/最坏情景,据此你才能选到好行权价最大化收益)。"

这是一记响亮的耳光——很多人以为量化交易就是"算法 + 微积分",以为 Greeks(Delta/Gamma/Vega)是期权定价的银弹。但作者告诉你:选行权价不是 Greeks 能解决的,是要请经济学家给基准/最好/最坏情景,quantamental(quant + fundamental)才能让组合无懈可击。这个观点是通往第 6 章 Oil Money 大项目的桥梁——在那里,quantamental 思维会被全面展开。

关键技巧

  1. 正则提取行权价:re.search('\d{4}', col).group() 从列名抓四位数字,统计频次筛"双权"行权价(假设行权价恒 4 位)。
  2. 合约规模前置相乘:df['spot'] = df['spot'] * contractsize,让现货与行权价单位统一,盈亏图横轴可读。
  3. |call-put|<threshold 是硬条件:不是优化,是跨式成立的"同价同权"门槛;threshold=2 欧元是容忍度。
  4. payoff = |spot - K*size| - (call+put):绝对值函数减常数,图像为 V 字"圆规"。
  5. group1/group2 找盈亏平衡点:扫描 temp 符号变化,左平衡点 = K - (call+put),右平衡点 = K + (call+put)。
  6. 遍历所有双权行权价:find_strike_price 返回列表,逐个回测找最优,这是"没有银弹就穷举"的朴素思路。
  7. 只做欧式现金交割:作者注明"we only consider european options with cash settlement",避开美式提早行权的复杂性。
  8. quantamental 选行权价:Greeks 是定价工具,不是选行权价的依据;请经济学家给情景才是正解。

本节要点

  1. 多头跨式 = 同行权价同到期(最好同价)的 call + put,payoff 呈"圆规"形 V 字,上行收益无限、下行损失有限。
  2. 真正亏钱来自价格停滞波动不足(此时改用空头跨式赌不动,但上行损失无限)。
  3. 事件驱动标配:公投/财报/央行——Brexit 三种情景方向不一但波动确定,跨式正好。
  4. find_strike_price 用正则筛"双权"行权价;straddle 合并并乘合约规模;|call-put|<2 才入场。
  5. payoff = |spot - K*size| - (call+put),group1/group2 切分红亏绿盈,标注行权价/盈亏平衡点/现货价。
  6. quantamental 高潮:选行权价靠经济学家情景分析而非 Greeks,quant + fundamental 才能让组合无懈可击——为第 6 章埋伏笔。

下一节,也是本章最后一节,我们啃一块硬骨头——VIX Calculator。作者把 CBOE 白皮书里那套用黎曼和(Riemann sum)+ 泰勒展开(Taylor series)把连续公平价格方差互换(variance swap)离散化为 VIX 的完整推导,实现成了一个可对任意商品期权、任意预测时长的通用计算器。这是全仓库数学密度最高的一节。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U