# 聚宽平台期权数据获取与绘图 # 参考资料: # - 原始策略来源: https://www.joinquant.com/view/community/detail/aa77127d7eccdaa699de7e87977f35dc # - 研究网址: https://www.joinquant.com/research?target=research&url=/user/75474983526/notebooks/Options/%E6%9C%9F%E6%9D%83%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96%E4%B8%8E%E7%BB%98%E5%9B%BE.ipynb # TODO: 添加期权数据获取与绘图相关代码 from jqdata 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 warnings.filterwarnings('ignore') # 通过 get_all_securities 获得期权合约信息 data = get_all_securities(types=['options']) print(data.head(10)) print("\n") print(data.tail(10)) # 通过 OPT_CONTRACT_INFO 表获取 50ETF 的所有合约 start = "2025-01-01" end = "2025-03-01" 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) # cal应该是认购,put应该是认沽 callOption = ins[ins["contract_type"]=="CO"].code.tolist() putOption = ins[ins["contract_type"]=="PO"].code.tolist() #早期可以使用这个函数获取期权行情数据。近期已失效 #使用 get_price 获取多个期权的日行情 # price = get_price(["10001151.XSHG","10001152.XSHG"],start_date='2018-01-02',panel = False) # price for c in callOption[:5]: q_price = query(opt.OPT_DAILY_PRICE.code, opt.OPT_DAILY_PRICE.date, opt.OPT_DAILY_PRICE.close, ).filter(opt.OPT_DAILY_PRICE.code.in_([c]), opt.OPT_DAILY_PRICE.date>start) price = opt.run_query(q_price) print(f"c: {c}, price: {price.head()}") # 获取 10006932 在 2024-03-08 的 tick 数据 get_ticks("10006932.XSHG", end_dt='2024-03-08 15:30:00', start_dt='2024-03-08 09:00:00') #获取所有 SR2405 合约的合约资料 info_df = opt.run_query(query(opt.OPT_CONTRACT_INFO).filter(opt.OPT_CONTRACT_INFO.underlying_symbol=="SR2405.XZCE")) info_df.tail() #获取 SR405P7800.XZCE 在 2024-03-22 这天及之前10个交易日的行情数据 q = query(opt.OPT_DAILY_PRICE).filter( opt.OPT_DAILY_PRICE.code=='SR405P7800.XZCE',# 选择标的,多个合约用in_操作,详细查看query教程 opt.OPT_DAILY_PRICE.date<='2024-03-22' # 过滤掉date大于 2024-03-22 的数据 ).order_by(opt.OPT_DAILY_PRICE.date.desc() # 根据日期排序 ).limit(10) opt.run_query(q) #获取 20240321 这天所有 CU 合约的日行情数据 q = query(opt.OPT_DAILY_PRICE).filter( opt.OPT_DAILY_PRICE.code.like('CU%'), # 选择code中以CU开头的标的,详细查看query教程 opt.OPT_DAILY_PRICE.date=='2024-03-21' # 指定date等于2024-03-21 ).order_by(opt.OPT_DAILY_PRICE.date.desc() # 根据日期排序 ).limit(10) opt.run_query(q) # 分别获取etf50的认购以及认沽期权合约 start = "2025-01-01" end = "2025-03-01" 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 start, opt.OPT_DAILY_PRICE.date < end, ) codf = opt.run_query(q) q= query(opt.OPT_DAILY_PRICE.date,opt.OPT_DAILY_PRICE.volume,opt.OPT_DAILY_PRICE.money).filter( opt.OPT_DAILY_PRICE.code.in_(putOption), opt.OPT_DAILY_PRICE.date > start, opt.OPT_DAILY_PRICE.date < end, ) podf = opt.run_query(q) # 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="date", aggfunc=[np.sum], dropna=True) putvol = pd.pivot_table(podf, values=["money", "volume"], index="date", aggfunc=[np.sum], dropna=True) # 认购于认沽对比 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'Call 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()