01_聚宽平台期权数据获取与绘图.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. # 聚宽平台期权数据获取与绘图
  2. # 参考资料:
  3. # - 原始策略来源: https://www.joinquant.com/view/community/detail/aa77127d7eccdaa699de7e87977f35dc
  4. # - 研究网址: 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
  5. # TODO: 添加期权数据获取与绘图相关代码
  6. from jqdata import *
  7. import pandas as pd
  8. import numpy as np
  9. import matplotlib.pyplot as plt
  10. from matplotlib import rc
  11. rc("mathtext", default="regular")
  12. import seaborn as sns
  13. sns.set_style("white")
  14. from matplotlib import dates
  15. from pandas import Series,DataFrame,concat
  16. import matplotlib.dates as mdates
  17. from datetime import datetime
  18. warnings.filterwarnings('ignore')
  19. # 通过 get_all_securities 获得期权合约信息
  20. data = get_all_securities(types=['options'])
  21. print(data.head(10))
  22. print("\n")
  23. print(data.tail(10))
  24. # 通过 OPT_CONTRACT_INFO 表获取 50ETF 的所有合约
  25. start = "2025-01-01"
  26. end = "2025-03-01"
  27. q = query(opt.OPT_CONTRACT_INFO).filter(
  28. opt.OPT_CONTRACT_INFO.underlying_symbol=='510050.XSHG',
  29. opt.OPT_CONTRACT_INFO.list_date > start,
  30. opt.OPT_CONTRACT_INFO.list_date < end)
  31. ins = opt.run_query(q)
  32. # cal应该是认购,put应该是认沽
  33. callOption = ins[ins["contract_type"]=="CO"].code.tolist()
  34. putOption = ins[ins["contract_type"]=="PO"].code.tolist()
  35. #早期可以使用这个函数获取期权行情数据。近期已失效
  36. #使用 get_price 获取多个期权的日行情
  37. # price = get_price(["10001151.XSHG","10001152.XSHG"],start_date='2018-01-02',panel = False)
  38. # price
  39. for c in callOption[:5]:
  40. q_price = query(opt.OPT_DAILY_PRICE.code, opt.OPT_DAILY_PRICE.date, opt.OPT_DAILY_PRICE.close,
  41. ).filter(opt.OPT_DAILY_PRICE.code.in_([c]),
  42. opt.OPT_DAILY_PRICE.date>start)
  43. price = opt.run_query(q_price)
  44. print(f"c: {c}, price: {price.head()}")
  45. # 获取 10006932 在 2024-03-08 的 tick 数据
  46. get_ticks("10006932.XSHG", end_dt='2024-03-08 15:30:00', start_dt='2024-03-08 09:00:00')
  47. #获取所有 SR2405 合约的合约资料
  48. info_df = opt.run_query(query(opt.OPT_CONTRACT_INFO).filter(opt.OPT_CONTRACT_INFO.underlying_symbol=="SR2405.XZCE"))
  49. info_df.tail()
  50. #获取 SR405P7800.XZCE 在 2024-03-22 这天及之前10个交易日的行情数据
  51. q = query(opt.OPT_DAILY_PRICE).filter(
  52. opt.OPT_DAILY_PRICE.code=='SR405P7800.XZCE',# 选择标的,多个合约用in_操作,详细查看query教程
  53. opt.OPT_DAILY_PRICE.date<='2024-03-22' # 过滤掉date大于 2024-03-22 的数据
  54. ).order_by(opt.OPT_DAILY_PRICE.date.desc() # 根据日期排序
  55. ).limit(10)
  56. opt.run_query(q)
  57. #获取 20240321 这天所有 CU 合约的日行情数据
  58. q = query(opt.OPT_DAILY_PRICE).filter(
  59. opt.OPT_DAILY_PRICE.code.like('CU%'), # 选择code中以CU开头的标的,详细查看query教程
  60. opt.OPT_DAILY_PRICE.date=='2024-03-21' # 指定date等于2024-03-21
  61. ).order_by(opt.OPT_DAILY_PRICE.date.desc() # 根据日期排序
  62. ).limit(10)
  63. opt.run_query(q)
  64. # 分别获取etf50的认购以及认沽期权合约
  65. start = "2025-01-01"
  66. end = "2025-03-01"
  67. q = query(opt.OPT_CONTRACT_INFO).filter(
  68. opt.OPT_CONTRACT_INFO.underlying_symbol=='510050.XSHG',
  69. opt.OPT_CONTRACT_INFO.list_date>start,
  70. opt.OPT_CONTRACT_INFO.list_date<end)
  71. ins = opt.run_query(q)
  72. callOption = ins[ins["contract_type"]=="CO"].code.tolist()
  73. putOption = ins[ins["contract_type"]=="PO"].code.tolist()
  74. # 获取价格数据序列
  75. q= query(opt.OPT_DAILY_PRICE.date,opt.OPT_DAILY_PRICE.volume,opt.OPT_DAILY_PRICE.money).filter(
  76. opt.OPT_DAILY_PRICE.code.in_(callOption),
  77. opt.OPT_DAILY_PRICE.date > start,
  78. opt.OPT_DAILY_PRICE.date < end,
  79. )
  80. codf = opt.run_query(q)
  81. q= query(opt.OPT_DAILY_PRICE.date,opt.OPT_DAILY_PRICE.volume,opt.OPT_DAILY_PRICE.money).filter(
  82. opt.OPT_DAILY_PRICE.code.in_(putOption),
  83. opt.OPT_DAILY_PRICE.date > start,
  84. opt.OPT_DAILY_PRICE.date < end,
  85. )
  86. podf = opt.run_query(q)
  87. # codf = get_price(callOption,start_date=start, end_date=end, frequency='daily', fields=["volume","money"], skip_paused=False, fq='pre', count=None, panel=False)
  88. # podf = get_price(putOption,start_date=start, end_date=end, frequency='daily', fields=["volume","money"], skip_paused=False, fq='pre', count=None, panel=False)
  89. # 转变数据格式
  90. callvol = pd.pivot_table(codf, values=["money", "volume"], index="date", aggfunc=[np.sum], dropna=True)
  91. putvol = pd.pivot_table(podf, values=["money", "volume"], index="date", aggfunc=[np.sum], dropna=True)
  92. # 认购于认沽对比
  93. fig = plt.figure(figsize=(10,13))
  94. ax = fig.add_subplot(211)
  95. import matplotlib.dates as mdates
  96. ax.xaxis.set_major_formatter(mdates.DateFormatter('%y-%m-%d'))
  97. ax.plot(putvol.index, putvol["sum", "volume"], '--gs',linewidth=1, label = u'Put Volume')
  98. ax.plot(callvol.index, callvol["sum", "volume"], '--rs',linewidth=1, label = u'Call Volume')
  99. ax.grid()
  100. ax.set_xlabel(u"trade Date")
  101. ax.set_ylabel(r"Turnover Volume")
  102. ax1 = fig.add_subplot(212)
  103. ax1.plot(putvol.index, putvol["sum", "money"], '--gs',linewidth=1, label = u'Put Money')
  104. ax1.plot(callvol.index, callvol["sum", "money"], '--rs',linewidth=1, label = u'Put Money')
  105. ax1.grid()
  106. ax1.set_xlabel(u"trade Date")
  107. ax1.set_ylabel(r"Turnover Money")
  108. ax.legend(loc="best")
  109. ax1.legend(loc="best")
  110. plt.title('50ETF Option TurnoverVolume/ TurnoverMoney')
  111. plt.show()