前面博客介绍了期权四个基本交易方向,在此基础上,我们看一些期权的交易策略。
在期权交易中,我们不仅可以做多(做空)股价,还可以做多(做空)波动率。跨式组合(straddle)和宽跨式组合(strangle)是较为常用的手段。这篇博客介绍 straddle 和 strangle 交易策略 和 Python绘制收益曲线。
跨式组合
买入跨式组合,即买入到期日相同,行权价格相同的看涨期权(LONG CALL)和看跌期权(LONG PUT),这样我们可以实现下面的收益曲线:
不论标的涨跌,只要 long call 或者 long put 任何一边可以实现盈利,且盈利超过我们支出的两份期权权利金,我们即可以实现组合的盈利。所以,到期日之前,只要股价波动超过一定幅度,组合即可以实现盈利。
需要注意:
- 期权价格不能过高或者过低,以保证足够的利润
- 未来的事件可以显著影响股价
- 未来的事件发生后至少三十天后期权才到期,以便坚持到事件发生之后平仓。因为在快到期时期权时间价值缩减的很厉害,如果迟迟没有发生事件持仓压力很大
- 未来的事件在目前来说不算大,比如9月份时美国大选就不是个很大的事
- 在某些时候(比如有一致预期的),在事件发生之前可以平盈利的leg,因为一般这种都是事件发生前顺预期走,发生之后如果符合预期则反向走,此时可以平掉剩下亏损的leg
- 在事件发生之后尽快平仓,趁着这时候时间价值因为事件的原因大幅上调,之后可能会回落
除了买入跨式组合,我们还可以卖出跨式组合,以做空标的波动,这里就是把上面的图上下翻过来(沿着x轴上下翻转),这里不再赘述。
宽跨式组合
宽跨式组合是由跨式组合衍生过来的,它与跨式组合的区别是,LONG CALL和LONG PUT的行权价不同。我们通常选择更加虚值的CALL和PUT以降低成本,但是组合盈利也要求更大的波动率。
类似于卖出跨式组合,应用于投资者认为未来标的物价格波动较小,不会发生大幅情况,均属于做空波动率的交易策略。其中,卖出宽跨式组合比卖出跨式组合收到的权利金少,但可以确保其能够盈利的标的期货价格波动范围较宽。
代码
github仓库
QIAT (this link opens in a new window) by P-Chao (this link opens in a new window)
Quantitative investment analysis tools
代码比较简单:
import numpy as np import matplotlib.pyplot as plt from types import SimpleNamespace class Option: def __init__(self, name, price): self.name = name self.stock = name self.price = price self.stock, _, self.exercise_price = name.split(' ') self.exercise_price = float(self.exercise_price) def calc_option_earnings(tic_price, option, operation='long'): # exercise inner value value_option = tic_price if 'call' in option.name.lower(): value_option = np.maximum(0, tic_price - option.exercise_price) if 'put' in option.name.lower(): value_option = np.maximum(0, option.exercise_price - tic_price) if 'sell' in operation.lower() or 'short' in operation.lower(): value_option = -value_option earnings = value_option - option.price return earnings def test_straddle(): tic_price = np.arange(0, 100, 0.01) option_call = Option("JD CALL 59", 4.40) option_put = Option('JD PUT 59', 1.67) long_call = calc_option_earnings(tic_price, option_call, 'LONG') long_put = calc_option_earnings(tic_price, option_put, 'LONG') plt.figure() plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.1, hspace=0.0) plt.subplot(1, 2, 1) plt.plot(tic_price, long_call + long_put, label='total') plt.plot(tic_price, long_call, linestyle='--', label='long call') plt.plot(tic_price, long_put, linestyle='-.', label='long put') plt.legend() plt.title('LONG STRADDLE') plt.xlabel('stock price at option expire') plt.ylabel('earnings') plt.grid(axis='y', linestyle=':') def test_strangle(): tic_price = np.arange(0, 100, 0.01) option_call = Option("JD CALL 65", 1.45) option_put = Option('JD PUT 55', 0.58) long_call = calc_option_earnings(tic_price, option_call, 'LONG') long_put = calc_option_earnings(tic_price, option_put, 'LONG') plt.figure() plt.plot(tic_price, long_call + long_put, label='total') plt.plot(tic_price, long_call, linestyle='--', label='long call') plt.plot(tic_price, long_put, linestyle='-.', label='long put') plt.legend() plt.title('LONG STRADDLE') plt.xlabel('stock price at option expire') plt.ylabel('earnings') plt.grid(axis='y', linestyle=':') if __name__ == "__main__": test_straddle() test_strangle()