| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- # 聚宽平台期权数据获取与绘图
- # 参考资料:
- # - 原始策略来源: 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<end)
- ins = opt.run_query(q)
- callOption = ins[ins["contract_type"]=="CO"].code.tolist()
- putOption = ins[ins["contract_type"]=="PO"].code.tolist()
- # 获取价格数据序列
- q= query(opt.OPT_DAILY_PRICE.date,opt.OPT_DAILY_PRICE.volume,opt.OPT_DAILY_PRICE.money).filter(
- opt.OPT_DAILY_PRICE.code.in_(callOption),
- opt.OPT_DAILY_PRICE.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()
|