05_商品期权T型报价代码.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # 商品期权T型报价代码
  2. # 参考资料:
  3. # - 原始策略来源: https://www.joinquant.com/view/community/detail/625edad0050315dcc2df540cd462df60
  4. # - 研究网址: https://www.joinquant.com/research?target=research&url=/user/75474983526/notebooks/Options/%E5%95%86%E5%93%81%E6%9C%9F%E6%9D%83T%E5%9E%8B%E6%8A%A5%E4%BB%B7.ipynb
  5. # TODO: 添加商品期权T型报价相关代码
  6. import pandas as pd
  7. import numpy as np
  8. import talib as tb
  9. from pandas.plotting import table
  10. from jqdata import *
  11. # 期权合约信息
  12. class OptionContract:
  13. close: 0 #现价
  14. volume: 0 #成交量
  15. position: 0 #当前持仓量
  16. priceChangePct: 0 #收盘价涨跌幅
  17. def __init__(self,close, volume, position, priceChangePct):
  18. self.close = close
  19. self.volume = volume
  20. self.position = position
  21. self.priceChangePct = priceChangePct
  22. # 同一行权价的一组期权
  23. class OptionGroup:
  24. exercisePrice: 0 ##行权价
  25. call: None ##提醒的品种
  26. put: None ##提醒的类型
  27. def __init__(self, exercisePrice, call, put):
  28. self.exercisePrice = exercisePrice
  29. self.call = call
  30. self.put = put
  31. def __init__(self, exercisePrice):
  32. self.exercisePrice = exercisePrice
  33. #数据内容
  34. CONTENT = [
  35. 'close',
  36. 'volume',
  37. 'position',
  38. 'priceChangePct',
  39. ]
  40. ##数据域
  41. CONTENT_HEADER_MAP = {
  42. 'prePosition': '昨日持仓',
  43. 'close': '现价',
  44. 'volume': '成交量',
  45. 'position': '持仓量',
  46. 'priceChangePct': '涨跌幅'
  47. }
  48. # 豆粕期权
  49. SUBJECT_MATTER = 'M2407.XDCE'
  50. ##查询数据日期,以2024-03-22为例
  51. DATA_DATE = '2024-03-22'
  52. EXPIRE_MONTH = '2024-03-27'
  53. #m2407 匹配 2024-04-19
  54. EXPIRE_MONTH = '2024-06-07'
  55. ## 行权价间隔 比如3800 3750 每50元一档
  56. gap = 50
  57. #查询相关的合约,适用于商品
  58. qy = query(opt.OPT_CONTRACT_INFO).filter(
  59. opt.OPT_CONTRACT_INFO.underlying_symbol == SUBJECT_MATTER, ##期权标的物
  60. opt.OPT_CONTRACT_INFO.expire_date == EXPIRE_MONTH,##期权到期日
  61. ).order_by(opt.OPT_CONTRACT_INFO.exercise_price, opt.OPT_CONTRACT_INFO.contract_type)
  62. optList = opt.run_query(qy)
  63. optList
  64. optionGroups = {}
  65. for index, row in optList.iterrows():
  66. code = row['code'] #key - 期权代码
  67. #查询具体合约的信息,商品需要去掉开盘前的静态信息
  68. realTimeQuery = query(opt.OPT_DAILY_PRICE).filter(opt.OPT_DAILY_PRICE.code==code, opt.OPT_DAILY_PRICE.date==DATA_DATE).order_by(opt.OPT_DAILY_PRICE.date.desc()).limit(1)
  69. realTimeData = opt.run_query(realTimeQuery)
  70. #期权基本信息
  71. exercisePrice = row['exercise_price'] #行权价
  72. contractType = row['contract_type'] #合约类型。CO-认购期权,PO-认沽期权
  73. #实时表查询
  74. close = realTimeData.loc[0].at['close'] #现价
  75. volume = int(realTimeData.loc[0].at['volume']) #成交量
  76. position = realTimeData.loc[0].at['position'] #当前持仓量
  77. priceChangePct = str(round(realTimeData.loc[0].at['change_pct_close'], 2)) + '%' #收盘价涨跌幅
  78. #去除非标准的带A合约
  79. if(exercisePrice % gap != 0):
  80. continue
  81. optionContract = OptionContract(close, volume, position, priceChangePct)
  82. if(exercisePrice in optionGroups):
  83. if(contractType == 'CO'):
  84. optionGroups[exercisePrice].call = optionContract
  85. else:
  86. optionGroups[exercisePrice].put = optionContract
  87. else:
  88. optionGroup = OptionGroup(exercisePrice)
  89. if(contractType == 'CO'):
  90. optionGroup.call = optionContract
  91. else:
  92. optionGroup.put = optionContract
  93. optionGroups[exercisePrice] = optionGroup
  94. list = optionGroups.values()
  95. rtitle = CONTENT.copy()
  96. rtitle.reverse()
  97. data = {}
  98. for key in rtitle:
  99. data['C-'+CONTENT_HEADER_MAP[key]] = []
  100. data['行权价'] = []
  101. for key in CONTENT:
  102. data['P-'+CONTENT_HEADER_MAP[key]] = []
  103. for option in list:
  104. for key in CONTENT:
  105. data['C-'+CONTENT_HEADER_MAP[key]].append(getattr(option.call, key))
  106. data['行权价'].append(option.exercisePrice)
  107. for key in rtitle:
  108. data['P-'+CONTENT_HEADER_MAP[key]].append(getattr(option.put, key))
  109. df = pd.DataFrame(data)
  110. df