模型,评分,修复网格策略市场状态监听

This commit is contained in:
2026-06-22 10:48:40 +08:00
parent 2e3202968d
commit f938c453e1
42 changed files with 3803 additions and 108 deletions
+132
View File
@@ -0,0 +1,132 @@
"""
grid_seeker v6.4 数据库模型 — 6 张数据表 + 1 张评分结果表
所有模型继承 core.database.BaseModel,复用现有 SQLite 连接。
"""
from peewee import (
CharField, DateField, FloatField, IntegerField,
CompositeKey, TextField,
)
from core.database import BaseModel, db
# ============================================================
# 1. kline_stock — 个股日K线
# ============================================================
class KlineStock(BaseModel):
stock_code = CharField(max_length=10) # 纯数字6位
trade_date = DateField()
open = FloatField()
high = FloatField()
low = FloatField()
close = FloatField()
volume = FloatField() # 成交量(股)
class Meta:
primary_key = CompositeKey('stock_code', 'trade_date')
indexes = (
(('stock_code', 'trade_date'), False),
)
# ============================================================
# 2. stocks — 股票基础信息
# ============================================================
class StockInfo(BaseModel):
code = CharField(max_length=12, primary_key=True) # 带 SH/SZ/BJ 前缀
name = CharField(max_length=32)
exchange = CharField(max_length=4) # SH / SZ / BJ
list_date = DateField(null=True)
listing_status = CharField(max_length=16, default='normal') # normal / delisted / ST
total_share = FloatField(null=True) # 总股本(股)
float_share = FloatField(null=True) # 流通股本(股)
share_updated_at = DateField(null=True) # 股本数据同步时间
# ============================================================
# 3. industry — 股票-行业映射
# ============================================================
class IndustryMapping(BaseModel):
code = CharField(max_length=6, primary_key=True) # 纯数字6位
industry_name = CharField(max_length=64, index=True)
industry_classification = CharField(max_length=32) # 行业分类体系名称
update_date = DateField()
# ============================================================
# 4. kline_index — 指数日K线
# ============================================================
class KlineIndex(BaseModel):
index_code = CharField(max_length=10) # 指数代码(6位数字)
trade_date = DateField()
open = FloatField()
high = FloatField()
low = FloatField()
close = FloatField()
volume = FloatField()
class Meta:
primary_key = CompositeKey('index_code', 'trade_date')
indexes = (
(('index_code', 'trade_date'), False),
)
# ============================================================
# 5. market_regime_daily — 市场状态(本地计算)
# ============================================================
class MarketRegimeDaily(BaseModel):
trade_date = DateField(primary_key=True)
advancers = FloatField(default=0) # 当日上涨家数
decliners = FloatField(default=0) # 当日下跌家数
advance_ratio = FloatField(default=0) # 涨跌比 = advancers/(advancers+decliners)
turnover = FloatField(default=0) # 全市场成交额
turnover_avg_5d = FloatField(default=0) # 5日滚动均量
turnover_ratio_5d = FloatField(default=0) # 量比 = turnover/turnover_avg_5d
source = CharField(max_length=32, default='qmt')
is_extreme_panic = IntegerField(default=0) # advance_ratio<0.2 且 turnover_ratio_5d>1.5
# ============================================================
# 6. sector_features_daily — 行业聚合指数(本地计算)
# ============================================================
class SectorFeaturesDaily(BaseModel):
trade_date = DateField()
sector_name = CharField(max_length=64) # 与 industry.industry_name 对应
sector_ret = FloatField(default=0) # 行业日收益率(均值)
sector_amplitude = FloatField(default=0) # 行业平均振幅
close = FloatField(default=100) # 行业指数(基值100
ema10 = FloatField(default=0)
ema20 = FloatField(default=0)
ema200 = FloatField(default=0)
score = IntegerField(default=0) # 趋势评分 0/1/2
class Meta:
primary_key = CompositeKey('trade_date', 'sector_name')
# ============================================================
# 7. ScoringResult — 评分结果(模型输出写入表)
# ============================================================
class ScoringResult(BaseModel):
stock_code = CharField(max_length=6) # 纯数字6位
trade_date = DateField() # 评分日
predicted_profit = FloatField(default=0) # 最终预测利润(=stacking_probability
rank_predicted_rounds = FloatField(null=True) # Rank 模型输出
top_elite_prob = FloatField(null=True) # Top 模型输出
stacking_probability = FloatField(null=True) # Stacking 模型输出
score_rank = IntegerField(default=0) # 排名
candidate_count = IntegerField(default=0) # 候选股总数
class Meta:
primary_key = CompositeKey('stock_code', 'trade_date')
# ============================================================
# 建表
# ============================================================
ALL_SCORING_TABLES = [
KlineStock, StockInfo, IndustryMapping, KlineIndex,
MarketRegimeDaily, SectorFeaturesDaily, ScoringResult,
]
db.create_tables(ALL_SCORING_TABLES)