请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  数理科学 帖子:3353524 新帖:1

# 「期权研究」50ETF期权之PCR

谎言梦发表于:9 月 27 日 00:00回复(1)

「期权研究」50ETF期权之PCR¶

突然发现joinquant有期权数据,正好研究下PCR和50etf的关系,看看是否能作为一个择时信号。

先import各种包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc("mathtext", default="regular")
import seaborn as sns
sns.set_style("white")
from matplotlib import dates
from pandas import Series,DataFrame,concat
import matplotlib.dates as mdates
from datetime import datetime

期权分看跌和看涨两种,买入两种不同的期权,代表着对于后市的不同看法,因此可以引进一个量化指标。¶

*  PCR = Put Call Ratio
*  PCR可以是关于成交量的PCR,也可以是成交额的PCR

期权合约信息可以用jq的opt.OPT_CONTRACT_INFO获得,方便的一b。

start = "2018-01-01"
end = "2019-09-01"
from jqdata import *
q = query(opt.OPT_CONTRACT_INFO).filter(
    opt.OPT_CONTRACT_INFO.underlying_symbol=='510050.XSHG',
    opt.OPT_CONTRACT_INFO.list_date>start,
    opt.OPT_CONTRACT_INFO.list_date<end)
ins = opt.run_query(q)
callOption = ins[ins["contract_type"]=="CO"].code.tolist()
putOption = ins[ins["contract_type"]=="PO"].code.tolist()
codf = get_price(callOption,start_date=start, end_date=end, frequency='daily', fields=["volume","money"], skip_paused=False, fq='pre', count=None, panel=False)
podf = get_price(putOption,start_date=start, end_date=end, frequency='daily', fields=["volume","money"], skip_paused=False, fq='pre', count=None, panel=False)
callvol = pd.pivot_table(codf, values=["money", "volume"], index="time", aggfunc=[np.sum], dropna=True)
putvol = pd.pivot_table(podf, values=["money", "volume"], index="time", aggfunc=[np.sum], dropna=True)
etf = get_price("510050.XSHG",start_date=start, end_date=end, frequency='daily', fields=["close"], skip_paused=False, fq='pre', count=None, panel=False)

对比下成交量和成交金额PCR¶

可以看出走势大致相同

fig = plt.figure(figsize=(10,13))
ax = fig.add_subplot(211)

import matplotlib.dates as mdates
ax.xaxis.set_major_formatter(mdates.DateFormatter('%y-%m-%d'))

ax.plot(putvol.index, putvol["sum", "volume"], '--gs',linewidth=1, label = u'Put Volume')
ax.plot(callvol.index, callvol["sum", "volume"], '--rs',linewidth=1, label = u'Put Volume')

ax.grid()
ax.set_xlabel(u"trade Date")
ax.set_ylabel(r"Turnover Volume")

ax1 = fig.add_subplot(212)
ax1.plot(putvol.index, putvol["sum", "money"], '--gs',linewidth=1, label = u'Put Money')
ax1.plot(callvol.index, callvol["sum", "money"], '--rs',linewidth=1, label = u'Put Money')
ax1.grid()
ax1.set_xlabel(u"trade Date")
ax1.set_ylabel(r"Turnover Money")

ax.legend(loc="best")
ax1.legend(loc="best")
plt.title('50ETF Option TurnoverVolume/ TurnoverMoney')

plt.show()

对比50etf走势和基于成交量PCR¶

fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)

import matplotlib.dates as mdates
ax.xaxis.set_major_formatter(mdates.DateFormatter('%y-%m-%d'))

ax.plot(putvol.index, putvol["sum", "volume"]/callvol["sum", "volume"], '--rs',linewidth=1, label = u'Volume PCR')
# ax.plot(callvol.index, putvol["sum", "money"]/callvol["sum", "money"], '--rs', linewidth=1,label = u'Money PCR')
ax.legend(loc="best")

ax2 = ax.twinx()
lns3 = ax2.plot(etf.index, etf.close, 'b-', label = 'ETF closePrice')

ax.grid()
ax.set_xlabel(u"trade Date")
ax.set_ylabel(r"Turnover Volume")
plt.title('50ETF Option TurnoverMoney')

plt.show()

因为两个PCR都差不多,为了更直观的分析就只画了基于成交量的PCR,可以看出:

PCR和价格存在负相关性,价格一路下跌,PCR一路上涨,价格在上升趋势的时候,PCR趋于平稳。方向上的择时可能用近月的PCR来计算比较精确,因为近月的gamma最大,用来判断方向比较合理。有兴趣可以clone自己实现下。

 

全部回复

0/140

达人推荐

量化课程

    移动端课程