You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

648 lines
33 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""数据库模型定义"""
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="更新时间")