"""数据库模型定义""" from datetime import datetime from typing import Optional from sqlalchemy import ( Column, Integer, String, Float, DateTime, Boolean, Numeric, BigInteger, Index, Text ) from app.repositories.database import Base # ============================================ # 股票相关表 # ============================================ class StockSymbol(Base): """股票标的表""" __tablename__ = "stock_symbols" symbol_id = Column(String(20), primary_key=True, index=True, comment="标的代码") symbol_type = Column(String(20), nullable=False, comment="标的类型") exchange = Column(String(10), nullable=False, index=True, comment="交易所") name = Column(String(100), nullable=False, comment="名称") name_en = Column(String(100), nullable=True, comment="英文名称") list_date = Column(DateTime, nullable=True, comment="上市日期") delist_date = Column(DateTime, nullable=True, comment="退市日期") industry = Column(String(50), nullable=True, comment="行业分类") status = Column(String(20), nullable=False, default="active", comment="状态") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class StockTradingCalendar(Base): """股票交易日历表""" __tablename__ = "stock_trading_calendar" trade_date = Column(String(8), primary_key=True, comment="交易日期") is_trading_day = Column(Boolean, nullable=False, comment="是否交易日") week_day = Column(Integer, nullable=True, comment="星期几") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class StockKLine1M(Base): """股票1分钟K线""" __tablename__ = "stock_klines_1m" __table_args__ = ( Index("idx_stock_1m_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") ts = Column(DateTime, nullable=False, comment="时间戳") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") created_at = Column(DateTime, default=datetime.now, comment="创建时间") class StockKLine5M(Base): """股票5分钟K线""" __tablename__ = "stock_klines_5m" __table_args__ = ( Index("idx_stock_5m_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") ts = Column(DateTime, nullable=False, comment="时间戳") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") created_at = Column(DateTime, default=datetime.now, comment="创建时间") class StockKLine1D(Base): """股票日线K线""" __tablename__ = "stock_klines_1d" __table_args__ = ( Index("idx_stock_1d_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") ts = Column(DateTime, nullable=False, comment="时间戳") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") # 新增字段 trade_date = Column(String(10), nullable=True, index=True, comment="交易日 (YYYY-MM-DD)") is_limit_up = Column(Boolean, nullable=True, comment="是否涨停") is_limit_down = Column(Boolean, nullable=True, comment="是否跌停") total_market_cap = Column(Numeric(20, 2), nullable=True, comment="总市值(元)") float_market_cap = Column(Numeric(20, 2), nullable=True, comment="流通市值(元)") inst_holding_ratio = Column(Numeric(8, 4), nullable=True, comment="机构持仓占比(%)") trading_days = Column(Integer, nullable=True, comment="可交易日数(从上市至今)") created_at = Column(DateTime, default=datetime.now, comment="创建时间") # ============================================ # 期货相关表 # ============================================ class FuturesSymbol(Base): """期货合约表""" __tablename__ = "futures_symbols" symbol_id = Column(String(20), primary_key=True, index=True, comment="合约代码") symbol_type = Column(String(20), nullable=False, comment="标的类型") exchange = Column(String(10), nullable=False, index=True, comment="交易所") name = Column(String(100), nullable=False, comment="名称") underlying = Column(String(10), nullable=False, index=True, comment="品种代码") contract_month = Column(String(6), nullable=False, comment="合约月份") list_date = Column(DateTime, nullable=True, comment="上市日期") delist_date = Column(DateTime, nullable=True, comment="退市日期") status = Column(String(20), nullable=False, default="active", comment="状态") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesTradingCalendar(Base): """期货交易日历表""" __tablename__ = "futures_trading_calendar" trade_date = Column(String(8), primary_key=True, comment="交易日期") is_trading_day = Column(Boolean, nullable=False, comment="是否交易日") has_night_session = Column(Boolean, default=False, comment="是否有夜盘") week_day = Column(Integer, nullable=True, comment="星期几") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine1M(Base): """期货1分钟K线""" __tablename__ = "futures_klines_1m" __table_args__ = ( Index("idx_futures_1m_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") class FuturesKLine1D(Base): """期货日线K线""" __tablename__ = "futures_klines_1d" __table_args__ = ( Index("idx_futures_1d_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") # ============================================ # 公共表 # ============================================ class DataSourceConfig(Base): """数据源配置表""" __tablename__ = "data_source_config" asset_class = Column(String(20), primary_key=True, comment="资产类别") active_source = Column(String(50), nullable=False, comment="当前激活源") standby_sources = Column(Text, nullable=True, comment="待命源列表(JSON)") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class DataQualityCheck(Base): """数据质量检查表""" __tablename__ = "data_quality_checks" id = Column(BigInteger, primary_key=True, autoincrement=True) check_date = Column(String(8), nullable=False, index=True, comment="检查日期") symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") freq = Column(String(10), nullable=False, comment="周期") check_type = Column(String(20), nullable=False, comment="检查类型") status = Column(String(10), nullable=False, comment="状态 pass/fail") expect_count = Column(Integer, nullable=True, comment="期望数量") actual_count = Column(Integer, nullable=True, comment="实际数量") detail = Column(String(500), nullable=True, comment="详情") created_at = Column(DateTime, default=datetime.now, comment="创建时间") class StockAdjustFactor(Base): """股票复权系数表""" __tablename__ = "stock_adjust_factors" id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") trade_date = Column(String(10), nullable=False, index=True, comment="交易日期 YYYY-MM-DD") qfq_factor = Column(Numeric(18, 8), nullable=False, default=1.0, comment="前复权系数") hfq_factor = Column(Numeric(18, 8), nullable=False, default=1.0, comment="后复权系数") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") __table_args__ = ( Index("idx_adj_factor_symbol_date", "symbol_id", "trade_date"), ) # ============================================ # 期货分表结构 (新增) # ============================================ class FuturesKLine1DBase(Base): """期货日线K线 - 基础表""" __tablename__ = "futures_klines_1d_base" __table_args__ = ( Index("idx_futures_1d_base_symbol_ts", "symbol_id", "ts"), Index("idx_futures_1d_base_symbol_date", "symbol_id", "trade_date"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") settlement = Column(Numeric(18, 4), nullable=True, comment="结算价") pre_settlement = Column(Numeric(18, 4), nullable=True, comment="昨结算价") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine1DQuote(Base): """期货日线K线 - 行情指标表""" __tablename__ = "futures_klines_1d_quote" __table_args__ = ( Index("idx_futures_1d_quote_symbol_date", "symbol_id", "trade_date"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD") change_pct = Column(Numeric(8, 4), nullable=True, comment="涨跌幅%") change_5d_pct = Column(Numeric(8, 4), nullable=True, comment="5日涨跌幅%") change_10d_pct = Column(Numeric(8, 4), nullable=True, comment="10日涨跌幅%") change_20d_pct = Column(Numeric(8, 4), nullable=True, comment="20日涨跌幅%") ma5 = Column(Numeric(18, 4), nullable=True, comment="5日均线") ma10 = Column(Numeric(18, 4), nullable=True, comment="10日均线") ma20 = Column(Numeric(18, 4), nullable=True, comment="20日均线") ma30 = Column(Numeric(18, 4), nullable=True, comment="30日均线") ma60 = Column(Numeric(18, 4), nullable=True, comment="60日均线") macd_dif = Column(Numeric(18, 6), nullable=True, comment="MACD DIF") macd_dea = Column(Numeric(18, 6), nullable=True, comment="MACD DEA") macd_bar = Column(Numeric(18, 6), nullable=True, comment="MACD BAR") oi_change = Column(BigInteger, nullable=True, comment="持仓量变化") oi_change_pct = Column(Numeric(8, 4), nullable=True, comment="持仓量变化%") amplitude = Column(Numeric(8, 4), nullable=True, comment="振幅%") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine1MBase(Base): """期货1分钟K线 - 基础表""" __tablename__ = "futures_klines_1m_base" __table_args__ = (Index("idx_futures_1m_base_symbol_ts", "symbol_id", "ts"),) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine5MBase(Base): """期货5分钟K线 - 基础表""" __tablename__ = "futures_klines_5m_base" __table_args__ = (Index("idx_futures_5m_base_symbol_ts", "symbol_id", "ts"),) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesRealTimeQuote(Base): """期货实时行情快照""" __tablename__ = "futures_realtime_quotes" symbol_id = Column(String(20), primary_key=True, comment="合约代码") update_time = Column(DateTime, nullable=False, comment="更新时间") last_price = Column(Numeric(18, 4), nullable=True, comment="最新价") open = Column(Numeric(18, 4), nullable=True, comment="开盘价") high = Column(Numeric(18, 4), nullable=True, comment="最高价") low = Column(Numeric(18, 4), nullable=True, comment="最低价") pre_close = Column(Numeric(18, 4), nullable=True, comment="昨收") pre_settlement = Column(Numeric(18, 4), nullable=True, comment="昨结算") settlement = Column(Numeric(18, 4), nullable=True, comment="结算价") volume = Column(BigInteger, nullable=True, comment="成交量") amount = Column(Numeric(20, 4), nullable=True, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") bid1 = Column(Numeric(18, 4), nullable=True, comment="买一价") bid1_volume = Column(BigInteger, nullable=True, comment="买一量") ask1 = Column(Numeric(18, 4), nullable=True, comment="卖一价") ask1_volume = Column(BigInteger, nullable=True, comment="卖一量") limit_up = Column(Numeric(18, 4), nullable=True, comment="涨停价") limit_down = Column(Numeric(18, 4), nullable=True, comment="跌停价") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") # 向后兼容别名 FuturesKLine1M = FuturesKLine1MBase FuturesKLine5M = FuturesKLine5MBase FuturesKLine1D = FuturesKLine1DBase # ============================================ # 股票日线历史数据表 (1d) - 分表 (新增) # ============================================ class StockKLine1DBase(Base): """股票日线K线 - 基础表 存储最基础的K线数据,对应 query_kline 接口 """ __tablename__ = "stock_klines_1d_base" __table_args__ = ( Index("idx_stock_1d_base_symbol_ts", "symbol_id", "ts"), Index("idx_stock_1d_base_symbol_date", "symbol_id", "trade_date"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量(股)") amount = Column(Numeric(20, 4), nullable=False, comment="成交额(元)") adj_factor = Column(Numeric(18, 8), nullable=True, comment="复权系数") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class StockKLine1DQuote(Base): """股票日线K线 - 行情指标表 存储需要计算的行情指标 """ __tablename__ = "stock_klines_1d_quote" __table_args__ = ( Index("idx_stock_1d_quote_symbol_date", "symbol_id", "trade_date"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD") change_pct = Column(Numeric(8, 4), nullable=True, comment="涨跌幅%") change_5d_pct = Column(Numeric(8, 4), nullable=True, comment="5日涨跌幅%") change_10d_pct = Column(Numeric(8, 4), nullable=True, comment="10日涨跌幅%") change_20d_pct = Column(Numeric(8, 4), nullable=True, comment="20日涨跌幅%") change_30d_pct = Column(Numeric(8, 4), nullable=True, comment="30日涨跌幅%") change_60d_pct = Column(Numeric(8, 4), nullable=True, comment="60日涨跌幅%") ma5 = Column(Numeric(18, 4), nullable=True, comment="5日均线") ma10 = Column(Numeric(18, 4), nullable=True, comment="10日均线") ma20 = Column(Numeric(18, 4), nullable=True, comment="20日均线") ma30 = Column(Numeric(18, 4), nullable=True, comment="30日均线") ma60 = Column(Numeric(18, 4), nullable=True, comment="60日均线") ma120 = Column(Numeric(18, 4), nullable=True, comment="120日均线") ma250 = Column(Numeric(18, 4), nullable=True, comment="250日均线") macd_dif = Column(Numeric(18, 6), nullable=True, comment="MACD DIF") macd_dea = Column(Numeric(18, 6), nullable=True, comment="MACD DEA") macd_bar = Column(Numeric(18, 6), nullable=True, comment="MACD BAR") bias_5 = Column(Numeric(8, 4), nullable=True, comment="5日乖离率%") bias_10 = Column(Numeric(8, 4), nullable=True, comment="10日乖离率%") bias_20 = Column(Numeric(8, 4), nullable=True, comment="20日乖离率%") is_limit_up = Column(Boolean, nullable=True, comment="是否涨停") is_limit_down = Column(Boolean, nullable=True, comment="是否跌停") limit_up_price = Column(Numeric(18, 4), nullable=True, comment="涨停价") limit_down_price = Column(Numeric(18, 4), nullable=True, comment="跌停价") is_st = Column(Boolean, nullable=True, comment="是否ST") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class StockKLine1DFinance(Base): """股票日线K线 - 财务数据表 存储财务相关数据 """ __tablename__ = "stock_klines_1d_finance" __table_args__ = ( Index("idx_stock_1d_finance_symbol_date", "symbol_id", "trade_date"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD") total_market_cap = Column(Numeric(20, 4), nullable=True, comment="总市值(元)") float_market_cap = Column(Numeric(20, 4), nullable=True, comment="流通市值(元)") total_shares = Column(BigInteger, nullable=True, comment="总股本(股)") float_shares = Column(BigInteger, nullable=True, comment="流通股本(股)") inst_holding_shares = Column(BigInteger, nullable=True, comment="机构持股数量") inst_holding_ratio = Column(Numeric(8, 4), nullable=True, comment="机构持仓占比%") top10_holders_ratio = Column(Numeric(8, 4), nullable=True, comment="前十大股东持股占比%") net_profit = Column(Numeric(20, 4), nullable=True, comment="净利润") revenue = Column(Numeric(20, 4), nullable=True, comment="营业总收入") eps = Column(Numeric(12, 4), nullable=True, comment="每股收益") roe = Column(Numeric(8, 4), nullable=True, comment="净资产收益率%") trading_days = Column(Integer, nullable=True, comment="从上市至今交易日数") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class StockRealTimeQuote(Base): """股票实时行情快照""" __tablename__ = "stock_realtime_quotes" symbol_id = Column(String(20), primary_key=True, comment="标的代码") update_time = Column(DateTime, nullable=False, comment="更新时间") last_price = Column(Numeric(18, 4), nullable=True, comment="最新价") open = Column(Numeric(18, 4), nullable=True, comment="开盘价") high = Column(Numeric(18, 4), nullable=True, comment="最高价") low = Column(Numeric(18, 4), nullable=True, comment="最低价") pre_close = Column(Numeric(18, 4), nullable=True, comment="昨收") volume = Column(BigInteger, nullable=True, comment="成交量") amount = Column(Numeric(20, 4), nullable=True, comment="成交额") bid1 = Column(Numeric(18, 4), nullable=True, comment="买一价") ask1 = Column(Numeric(18, 4), nullable=True, comment="卖一价") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") # 股票表向后兼容别名 StockKLine1D = StockKLine1DBase # ============================================ # 股票15/30/60分钟K线表 (新增) # ============================================ class StockKLine15M(Base): """股票15分钟K线""" __tablename__ = "stock_klines_15m" __table_args__ = ( Index("idx_stock_15m_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") change_pct = Column(Numeric(8, 4), nullable=True, comment="涨跌幅%") macd_dif = Column(Numeric(18, 6), nullable=True, comment="MACD DIF") macd_dea = Column(Numeric(18, 6), nullable=True, comment="MACD DEA") macd_bar = Column(Numeric(18, 6), nullable=True, comment="MACD BAR") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class StockKLine30M(Base): """股票30分钟K线""" __tablename__ = "stock_klines_30m" __table_args__ = ( Index("idx_stock_30m_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") change_pct = Column(Numeric(8, 4), nullable=True, comment="涨跌幅%") macd_dif = Column(Numeric(18, 6), nullable=True, comment="MACD DIF") macd_dea = Column(Numeric(18, 6), nullable=True, comment="MACD DEA") macd_bar = Column(Numeric(18, 6), nullable=True, comment="MACD BAR") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class StockKLine60M(Base): """股票60分钟K线""" __tablename__ = "stock_klines_60m" __table_args__ = ( Index("idx_stock_60m_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="标的代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") change_pct = Column(Numeric(8, 4), nullable=True, comment="涨跌幅%") macd_dif = Column(Numeric(18, 6), nullable=True, comment="MACD DIF") macd_dea = Column(Numeric(18, 6), nullable=True, comment="MACD DEA") macd_bar = Column(Numeric(18, 6), nullable=True, comment="MACD BAR") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") # ============================================ # 期货15/30/60分钟K线表 (新增) # ============================================ class FuturesKLine15MBase(Base): """期货15分钟K线 - 基础表""" __tablename__ = "futures_klines_15m_base" __table_args__ = ( Index("idx_futures_15m_base_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine30MBase(Base): """期货30分钟K线 - 基础表""" __tablename__ = "futures_klines_30m_base" __table_args__ = ( Index("idx_futures_30m_base_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine60MBase(Base): """期货60分钟K线 - 基础表""" __tablename__ = "futures_klines_60m_base" __table_args__ = ( Index("idx_futures_60m_base_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")