【投资】实际计算跨式期权

期权有非常多的交易对,在实际交易中仅以肉眼、脑子计算每个期权的盈亏情况是很难快速完成的,大多数普通人的情况是刚计算完其中一个,价格就波动了,形成了新的买一卖一价,更别说算完全部的内容了,因此借助计算机来完成这一工作是很必要的。

这篇文章就来简要说下跨式期权怎么计算,并且绘制一个图表直观观察。

在这里插入图片描述

获取数据、计算基础期权的内容之前写过,可以回头看。

而计算跨式期权也很简单,买入跨式就是两个买入期权相加,卖出跨式就是两个卖出期权相加。

所以接下来就需要写个循环来计算全部可得的期权,另外将其画图,直观感受。

循环

由于我们每次循环所需要的x轴是到期日价格,所以权利金和行权价都是固定的,而由于每个到期日合约的期权划分是根据行权价来区分的,所以我们循环每个行权价,即:for s in df['行权价'],设定df['当期行权价']=s

之后在正常计算基础期权值的基础上计算跨式期权:df2['买入跨式']=df2['买入看涨']+df['买入看跌'],同理卖出跨式。

在每次循环里将生成的图放入自己想放入的地方即可。

画图

既可以在一张大图上画多个子图,也可以做个类似选项卡、时间轴的图表,最终目的是可视化。

我们这里以时间轴为例:

tl = Timeline()
tl.add_schema()
for s in df['行权价']:
    fig = (Line()
        .add_xaxis()
        .add_yaxis())
    tl.add(fig, s)
tl.render()

大体就是这么一个框架,不管是计算跨式期权还是价差组合都是这样的逻辑,具体如何判断开仓条件就是自己的思维了。

全部代码如下:

import pandas as pd
import numpy as np
import ccxt
from pyecharts.charts import *
from pyecharts import options as opts


df = pd.DataFrame()
exchange = ccxt.okex()  # 建立交易所
df = pd.read_csv(r'C:\Users\xxx\Python\options\options.csv')
params = {
    
    'instrument_id': 'EOS-USD'}  # 参数
price = float(pd.DataFrame(exchange.indexGetInstrumentIdConstituents(params=params)).loc['last', 'data'])  # 获取现价
df['price'] = np.sort(np.append(np.linspace(price-0.5, price+0.5, 18), np.linspace(price-0.5, price+0.5, 18)))
# 画图,新建一个timeline对象
tl = Timeline()
tl.add_schema()
straddle_sell = {
    
    }
straddle_buy = {
    
    }

for s in df['strike']:
    df['strike_using'] = s  # 设定该循环的行权价
    # 计算数据
    Call = df.groupby('type').get_group('C')
    Put = df.groupby('type').get_group('P')
    # 设置参数
    strike = df.loc[df['strike'] == s]  # 行权价暂定值
    Call['best_bid'] = strike.loc[strike['type'] == 'C', 'best_bid']
    Call['best_ask'] = strike.loc[strike['type'] == 'C', 'best_ask']
    Put['best_bid'] = strike.loc[strike['type'] == 'P', 'best_bid']
    Put['best_ask'] = strike.loc[strike['type'] == 'P', 'best_ask']
    Call = Call.fillna(method='ffill')  # 填充权利金
    Call = Call.fillna(method='bfill')
    Put = Put.fillna(method='ffill')
    Put = Put.fillna(method='bfill')
    # 买入看涨
    Call['call_buy'] = -(Call['strike_using'] - Call['price']) * 100 - Call['best_ask'] * 100
    Call.loc[Call['price'] < Call['strike_using'], 'call_buy'] = - Call['best_ask'] * 100
    # 买入看跌
    Put['put_buy'] = (Put['strike_using'] - Put['price']) * 100 - Put['best_ask'] * 100
    Put.loc[Put['price'] > Put['strike_using'], 'put_buy'] = - Put['best_ask'] * 100
    # 卖出看涨
    Call['call_sell'] = (Call['strike_using'] - Call['price']) * 100 + Call['best_bid'] * 100
    Call.loc[Call['price'] < Call['strike_using'], 'call_sell'] = Call['best_bid'] * 100
    # 卖出看跌
    Put['put_sell'] = -(Put['strike_using'] - Put['price']) * 100 + Put['best_bid'] * 100
    Put.loc[Put['price'] > Put['strike_using'], 'put_sell'] = Put['best_bid'] * 100
    # 再次整理
    df2 = Call[['best_bid', 'best_ask', 'type', 'strike_using', 'price', 'call_buy', 'call_sell']]
    df2['put_buy'] = Put['put_buy'].tolist()
    df2['put_sell'] = Put['put_sell'].tolist()
    # 跨式
    df2['straddle_sell'] = df2['call_sell'] + df2['put_sell']
    df2['straddle_buy'] = df2['call_buy'] + df2['put_buy']
    # 画图
    fig_all = (Line(init_opts=opts.InitOpts(width='1200px', height='700px', page_title='Javan'))
               .add_xaxis(df2['price'])
               .add_yaxis('买入跨式', df2['straddle_buy'], linestyle_opts=opts.LineStyleOpts(width=2))
               .add_yaxis('卖出跨式', df2['straddle_sell'], linestyle_opts=opts.LineStyleOpts(width=2))
               .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
               .set_global_opts(tooltip_opts=opts.TooltipOpts(is_show=True,
                                                              formatter='{b}{c}'),
                                yaxis_opts=opts.AxisOpts(name='profit'),
                                xaxis_opts=opts.AxisOpts(name='到期日价格', min_='dataMin')
                                ))
    tl.add(fig_all, s)
    straddle_buy[str(s)] = df2['straddle_buy'].min()
    straddle_sell[str(s)] = df2['straddle_sell'].max()
    # 储存
    df2.to_csv(r'C:\\Users\\xxx\\Python\\options\\cal\\' + 'options' + str(s) + '.csv')

tl.render(r'C:\\Users\\xxx\\Python\\options\\cal\\all.html')
print(pd.DataFrame(straddle_sell.items(), columns=['行权价', '最大收益']))
print(pd.DataFrame(straddle_buy.items(), columns=['行权价', '最小收益']))
exit()

猜你喜欢

转载自blog.csdn.net/food_for_thought/article/details/108358540