future_info.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. """
  2. 期货基础信息模型文件
  3. 定义期货标的的基础信息表结构,包括合约字母、名称、交易所、保证金率等
  4. """
  5. from app.database.db_manager import db
  6. from datetime import datetime
  7. class FutureInfo(db.Model):
  8. """
  9. 期货标的基础信息表
  10. 对应BRD文档中的"future_info"表
  11. 维护期货标的及主连的基础信息,记录合约的保证金、手续费等交易参数
  12. """
  13. __tablename__ = 'future_info'
  14. id = db.Column(db.Integer, primary_key=True, comment='序号:相当于是ID')
  15. contract_letter = db.Column(db.String(2), unique=True, nullable=False, comment='合约字母:1位或者2位的英文字母,这是唯一的')
  16. name = db.Column(db.String(50), nullable=False, comment='名称:可能是中文(还可能包含数字),也可能是英文')
  17. market = db.Column(db.Integer, nullable=False, comment='市场:分为国内(0)和国外(1)')
  18. exchange = db.Column(db.String(5), comment='交易所:3-5位的英文字母,从"future_daily"用合约字母匹配')
  19. contract_multiplier = db.Column(db.Float, comment='合约乘数:数字,从"future_daily"用合约字母匹配')
  20. long_margin_rate = db.Column(db.Float, comment='做多保证金率(按金额):数字,从"future_daily"用合约字母匹配')
  21. short_margin_rate = db.Column(db.Float, comment='做空保证金率(按金额):数字,从"future_daily"用合约字母匹配')
  22. open_fee = db.Column(db.Float, comment='开仓费用(按手):数字,从"future_daily"用合约字母匹配')
  23. close_fee = db.Column(db.Float, comment='平仓费用(按手):数字,从"future_daily"用合约字母匹配')
  24. close_today_rate = db.Column(db.Float, comment='平今费率(按金额):数字,从"future_daily"用合约字母匹配')
  25. close_today_fee = db.Column(db.Float, comment='平今费用(按手):数字,从"future_daily"用合约字母匹配')
  26. long_margin_amount = db.Column(db.Float, comment='做多1手保证金(金额):数字,根据最新价格计算得出')
  27. short_margin_amount = db.Column(db.Float, comment='做空1手保证金(金额):数字,根据最新价格计算得出')
  28. th_main_contract = db.Column(db.String(6), comment='同花主力合约:字母加上4位数字,如PG2503')
  29. current_main_contract = db.Column(db.String(6), comment='当前主力合约:同"同花主力合约"')
  30. th_order = db.Column(db.Integer, comment='同花顺顺序:数字')
  31. long_term_trend = db.Column(db.String(100), comment='长期趋势:记录期货品种的长期趋势特征')
  32. core_ratio = db.Column(db.Float, comment='核心比率:用于记录期货品种的核心比率信息')
  33. def __repr__(self):
  34. return f'<FutureInfo {self.contract_letter} - {self.name}>'
  35. def to_dict(self):
  36. """转换为字典,用于API返回"""
  37. return {
  38. 'id': self.id,
  39. 'contract_letter': self.contract_letter,
  40. 'name': self.name,
  41. 'market': self.market,
  42. 'exchange': self.exchange,
  43. 'contract_multiplier': self.contract_multiplier,
  44. 'long_margin_rate': self.long_margin_rate,
  45. 'short_margin_rate': self.short_margin_rate,
  46. 'open_fee': self.open_fee,
  47. 'close_fee': self.close_fee,
  48. 'close_today_rate': self.close_today_rate,
  49. 'close_today_fee': self.close_today_fee,
  50. 'long_margin_amount': self.long_margin_amount,
  51. 'short_margin_amount': self.short_margin_amount,
  52. 'th_main_contract': self.th_main_contract,
  53. 'current_main_contract': self.current_main_contract,
  54. 'th_order': self.th_order,
  55. 'long_term_trend': self.long_term_trend,
  56. 'core_ratio': self.core_ratio
  57. }
  58. class FutureDaily(db.Model):
  59. """
  60. 期货每日数据表
  61. 存储从网页爬取的期货每日数据
  62. 该表每日更新,覆盖之前的数据
  63. """
  64. __tablename__ = 'future_daily'
  65. id = db.Column(db.Integer, primary_key=True, comment='自增ID')
  66. exchange = db.Column(db.String(10), nullable=False, comment='交易所')
  67. contract_code = db.Column(db.String(20), index=True, nullable=False, comment='合约代码')
  68. contract_name = db.Column(db.String(50), nullable=False, comment='合约名称')
  69. product_code = db.Column(db.String(10), index=True, nullable=False, comment='品种代码')
  70. product_name = db.Column(db.String(50), nullable=False, comment='品种名称')
  71. contract_multiplier = db.Column(db.Float, nullable=False, comment='合约乘数')
  72. price_tick = db.Column(db.Float, nullable=False, comment='跳动变动')
  73. open_fee_rate = db.Column(db.Float, comment='开仓费率(按金额)')
  74. open_fee = db.Column(db.Float, comment='开仓费用(按手)')
  75. close_fee_rate = db.Column(db.Float, comment='平仓费率(按金额)')
  76. close_fee = db.Column(db.Float, comment='平仓费用(按手)')
  77. close_today_fee_rate = db.Column(db.Float, comment='平今费率(按金额)')
  78. close_today_fee = db.Column(db.Float, comment='平今费用(按手)')
  79. long_margin_rate = db.Column(db.Float, comment='做多保证金率(按金额)')
  80. long_margin_fee = db.Column(db.Float, comment='做多保证金(按手)')
  81. short_margin_rate = db.Column(db.Float, comment='做空保证金率(按金额)')
  82. short_margin_fee = db.Column(db.Float, comment='做空保证金(按手)')
  83. latest_price = db.Column(db.Float, comment='最新价')
  84. open_interest = db.Column(db.Integer, comment='持仓量')
  85. volume = db.Column(db.Integer, comment='成交量')
  86. is_main_contract = db.Column(db.Boolean, default=False, comment='是否是主力合约')
  87. update_time = db.Column(db.DateTime, default=datetime.now, comment='更新时间')
  88. def __repr__(self):
  89. return f'<FutureDaily {self.contract_code} - {self.product_name}>'
  90. def to_dict(self):
  91. """转换为字典,用于API返回"""
  92. return {
  93. 'id': self.id,
  94. 'exchange': self.exchange,
  95. 'contract_code': self.contract_code,
  96. 'contract_name': self.contract_name,
  97. 'product_code': self.product_code,
  98. 'product_name': self.product_name,
  99. 'contract_multiplier': self.contract_multiplier,
  100. 'price_tick': self.price_tick,
  101. 'open_fee_rate': self.open_fee_rate,
  102. 'open_fee': self.open_fee,
  103. 'close_fee_rate': self.close_fee_rate,
  104. 'close_fee': self.close_fee,
  105. 'close_today_fee_rate': self.close_today_fee_rate,
  106. 'close_today_fee': self.close_today_fee,
  107. 'long_margin_rate': self.long_margin_rate,
  108. 'long_margin_fee': self.long_margin_fee,
  109. 'short_margin_rate': self.short_margin_rate,
  110. 'short_margin_fee': self.short_margin_fee,
  111. 'latest_price': self.latest_price,
  112. 'open_interest': self.open_interest,
  113. 'volume': self.volume,
  114. 'is_main_contract': self.is_main_contract,
  115. 'update_time': self.update_time.strftime('%Y-%m-%d %H:%M:%S') if self.update_time else None
  116. }