Files
xiaobai-review/backend/features/screener/catalog.py
T

712 lines
35 KiB
Python

from __future__ import annotations
from backend.features.screener.strategies import ADVANCED_CURATED_STRATEGIES
from backend.features.screener.signals import attach_strategy_validity
REGIMES = {
"ice": "冰点",
"repair": "修复",
"fermentation": "发酵",
"climax": "高潮",
"divergence": "分化",
"retreat": "退潮",
}
FACTOR_FIELDS = {
"close": "收盘价",
"pct_chg": "当日涨幅",
"return_5d": "5日涨幅",
"return_10d": "10日涨幅",
"return_20d": "20日涨幅",
"return_60d": "60日涨幅",
"return_5d_rank": "5日涨幅排名",
"momentum_60_5": "中期动量",
"momentum_60_5_rank": "中期动量排名",
"above_ma20": "站上20日线",
"rsi_6": "RSI(6)",
"ma60_slope": "60日线斜率",
"ma20_slope_5d": "20日线5日斜率",
"ma_bull_alignment": "均线多头排列",
"drawdown_from_high_250": "距250日高点回撤",
"donchian_breakout_pct": "唐奇安突破幅度",
"range_20d": "20日振幅",
"rs_high_120": "RS线120日新高",
"excess_return_60d": "60日超额收益",
"weekly_trend_signal": "周线趋势信号",
"daily_buy_trigger": "日线买点",
"weekly_amount_trend": "周成交趋势",
"volume_ratio_5d": "5日量比",
"turnover_5d": "5日累计换手",
"volatility_10d": "10日波动率",
"amount_billion": "成交额",
"turnover_rate": "换手率",
"circ_mv_billion": "流通市值",
"net_flow_million": "主力净流入",
"large_flow_million": "大单净流入",
"net_flow_5d_million": "5日主力净流入",
"flow_to_circ_mv_5d": "5日净流入占流通市值",
"sector_strength": "板块强度",
"sector_return_5d": "行业5日涨幅",
"sector_return_20d": "行业20日涨幅",
"sector_momentum_rank": "行业20日动量排名",
"sector_stock_momentum_rank": "行业内个股动量排名",
"sector_net_flow_5d_million": "行业5日主力净流入",
"sector_flow_rank": "行业资金流排名",
"sector_prosperity_rank": "行业景气度排名",
"sector_trend_rank": "行业趋势排名",
"sector_crowding_rank": "行业拥挤度排名",
"sector_composite_score": "行业三维综合分",
"sector_limit_count": "板块涨停数",
"sector_up_count": "板块强势股数",
"relative_strength": "相对强度",
"limit_streak": "连板高度",
"auction_change": "竞价涨幅",
"auction_amount_million": "竞价成交额",
"auction_turnover_rate": "竞价换手率",
"auction_volume_ratio": "竞价量比",
"total_mv_billion": "总市值",
"pe_ttm": "市盈率TTM",
"pb": "市净率",
"ps_ttm": "市销率TTM",
"dividend_yield_ttm": "股息率TTM",
"dividend_years": "近年持续分红",
"roe": "净资产收益率",
"roa": "总资产收益率",
"roic": "投入资本回报率",
"gross_margin": "销售毛利率",
"netprofit_yoy": "净利润同比",
"revenue_yoy": "营业收入同比",
"ocf_to_opincome": "经营现金流质量",
"earnings_surprise_pct": "业绩超预期幅度",
"earnings_days_since_announce": "业绩公告后天数",
"earnings_event_quality": "业绩事件质量",
"popularity_score": "人气榜热度",
"popularity_rank_change": "人气排名跃升",
"popularity_dual_source": "双榜共识",
"institution_net_buy_million": "机构席位净买入",
"institution_seat_count": "机构席位数",
"style_size_fit": "大小盘风格匹配",
"style_growth_fit": "成长价值风格匹配",
"style_fit_score": "当前风格匹配度",
"factor_value_score": "价值因子分",
"factor_growth_score": "成长因子分",
"factor_quality_score": "质量因子分",
"factor_momentum_score": "动量因子分",
"factor_sentiment_score": "交易情绪因子分",
"multi_factor_composite": "动态多因子综合分",
"relative_position_60": "60日相对位置",
"max_abs_change_15d": "15日最大波动",
"close_to_high_15d": "距15日高点",
"close_to_high_60d": "距60日高点",
"no_limit_30d": "近30日无涨停",
"had_limit_80d": "近80日曾涨停",
"previous_first_limit": "昨日首板",
"previous_limit_signal": "昨日涨停或触板",
"previous_limit_streak": "昨日连板高度",
"previous_amount_billion": "昨日成交额",
"is_limit_up_today": "当日涨停",
"is_limit_down_today": "当日跌停",
"sector_breadth_ma20": "行业20日线宽度",
"no_limit_down_20d": "近20日无跌停",
"financial_risk": "财务风险标记",
"is_market_height": "当前市场最高板",
"new_space_board": "新晋空间板",
"max_continuous_board_10d": "近10日最高连板",
"dragon_first_yin": "龙头首阴",
"yin_day_pct": "首阴跌幅",
"vol_vs_previous": "较前日量能",
"broken_reversal": "断板反包",
"days_since_broken": "断板后天数",
"close_above_broken_high": "收复断板高点",
"vol_vs_broken_day": "较断板日量能",
"recent_limit_up_5d": "近5日涨停次数",
"intraday_min_pct": "盘中最大跌幅",
"lower_shadow_ratio": "下影线实体比",
}
FACTOR_GROUPS = {
"行情动量": [
"close", "pct_chg", "return_5d", "return_10d", "return_20d", "return_60d",
"return_5d_rank", "momentum_60_5", "momentum_60_5_rank", "above_ma20",
"rsi_6", "ma60_slope", "ma20_slope_5d", "ma_bull_alignment",
"drawdown_from_high_250", "donchian_breakout_pct", "range_20d",
"rs_high_120", "excess_return_60d", "weekly_trend_signal",
"daily_buy_trigger", "weekly_amount_trend", "relative_strength",
"relative_position_60", "close_to_high_15d", "close_to_high_60d",
],
"量价交易": [
"volume_ratio_5d", "turnover_5d", "volatility_10d", "amount_billion", "turnover_rate",
"net_flow_million", "large_flow_million", "net_flow_5d_million",
"flow_to_circ_mv_5d", "previous_amount_billion",
"intraday_min_pct", "lower_shadow_ratio", "vol_vs_previous", "vol_vs_broken_day",
],
"板块结构": [
"sector_strength", "sector_return_5d", "sector_return_20d", "sector_momentum_rank",
"sector_stock_momentum_rank", "sector_net_flow_5d_million", "sector_flow_rank",
"sector_prosperity_rank", "sector_trend_rank", "sector_crowding_rank",
"sector_composite_score",
"sector_limit_count", "sector_up_count", "sector_breadth_ma20",
"limit_streak", "previous_limit_streak", "previous_first_limit", "previous_limit_signal",
"is_limit_up_today", "is_limit_down_today",
"no_limit_30d", "had_limit_80d", "max_abs_change_15d", "no_limit_down_20d",
"is_market_height", "new_space_board", "max_continuous_board_10d",
"dragon_first_yin", "yin_day_pct", "broken_reversal", "days_since_broken",
"close_above_broken_high", "recent_limit_up_5d",
],
"竞价因子": [
"auction_change", "auction_amount_million", "auction_turnover_rate", "auction_volume_ratio",
],
"估值规模": [
"circ_mv_billion", "total_mv_billion", "pe_ttm", "pb", "ps_ttm",
"dividend_yield_ttm", "dividend_years",
],
"财务质量": [
"roe", "roa", "roic", "gross_margin", "netprofit_yoy", "revenue_yoy",
"ocf_to_opincome", "financial_risk",
"earnings_surprise_pct", "earnings_days_since_announce", "earnings_event_quality",
],
"特色数据": [
"popularity_score", "popularity_rank_change", "popularity_dual_source",
"institution_net_buy_million", "institution_seat_count",
"style_size_fit", "style_growth_fit", "style_fit_score",
"factor_value_score", "factor_growth_score", "factor_quality_score",
"factor_momentum_score", "factor_sentiment_score", "multi_factor_composite",
],
}
ALLOWED_OPERATORS = {">", ">=", "<", "<=", "==", "!=", "between", "in"}
BUILTIN_STRATEGIES = [
{
"name": "冰点抗跌先手",
"description": "寻找冰点中保持相对强度、低波动且有板块承接的个股,允许无结果。",
"regimes": ["ice"],
"formula": {
"universe": {"exclude_st": True, "listed_days_min": 120},
"filters": [
{"field": "pct_chg", "op": "between", "value": [-3, 7]},
{"field": "return_5d", "op": ">=", "value": -5},
{"field": "amount_billion", "op": ">=", "value": 1},
{"field": "volatility_10d", "op": "<=", "value": 7},
],
"score": [
{"field": "relative_strength", "weight": 0.30, "direction": "desc"},
{"field": "sector_strength", "weight": 0.25, "direction": "desc"},
{"field": "volume_ratio_5d", "weight": 0.20, "direction": "desc"},
{"field": "volatility_10d", "weight": 0.15, "direction": "asc"},
{"field": "amount_billion", "weight": 0.10, "direction": "desc"},
],
"limit": 12,
"min_score": 0.58,
},
},
{
"name": "修复先锋",
"description": "筛选率先站回趋势、温和放量并获得板块共振的修复前排。",
"regimes": ["repair"],
"formula": {
"universe": {"exclude_st": True, "listed_days_min": 120},
"filters": [
{"field": "pct_chg", "op": "between", "value": [1, 9.7]},
{"field": "return_5d", "op": ">", "value": 0},
{"field": "above_ma20", "op": "==", "value": 1},
{"field": "volume_ratio_5d", "op": ">=", "value": 1.05},
],
"score": [
{"field": "sector_strength", "weight": 0.28, "direction": "desc"},
{"field": "relative_strength", "weight": 0.24, "direction": "desc"},
{"field": "volume_ratio_5d", "weight": 0.18, "direction": "desc"},
{"field": "net_flow_million", "weight": 0.16, "direction": "desc"},
{"field": "amount_billion", "weight": 0.14, "direction": "desc"},
],
"limit": 15,
"min_score": 0.54,
},
},
{
"name": "主线发酵跟随",
"description": "在主线扩散期寻找趋势、成交承载和板块涨停梯队共同增强的个股。",
"regimes": ["fermentation"],
"formula": {
"universe": {"exclude_st": True, "listed_days_min": 120},
"filters": [
{"field": "pct_chg", "op": "between", "value": [0, 9.8]},
{"field": "return_5d", "op": ">=", "value": 3},
{"field": "above_ma20", "op": "==", "value": 1},
{"field": "amount_billion", "op": ">=", "value": 2},
],
"score": [
{"field": "sector_limit_count", "weight": 0.25, "direction": "desc"},
{"field": "sector_strength", "weight": 0.24, "direction": "desc"},
{"field": "return_10d", "weight": 0.20, "direction": "desc"},
{"field": "amount_billion", "weight": 0.16, "direction": "desc"},
{"field": "large_flow_million", "weight": 0.15, "direction": "desc"},
],
"limit": 15,
"min_score": 0.55,
},
},
{
"name": "高潮核心去后排",
"description": "高潮阶段只保留容量、趋势和辨识度较高的核心,降低后排跟风权重。",
"regimes": ["climax"],
"formula": {
"universe": {"exclude_st": True, "listed_days_min": 120},
"filters": [
{"field": "pct_chg", "op": "between", "value": [-2, 7]},
{"field": "return_10d", "op": ">=", "value": 5},
{"field": "above_ma20", "op": "==", "value": 1},
{"field": "amount_billion", "op": ">=", "value": 5},
],
"score": [
{"field": "amount_billion", "weight": 0.28, "direction": "desc"},
{"field": "sector_strength", "weight": 0.22, "direction": "desc"},
{"field": "relative_strength", "weight": 0.20, "direction": "desc"},
{"field": "volatility_10d", "weight": 0.15, "direction": "asc"},
{"field": "limit_streak", "weight": 0.15, "direction": "desc"},
],
"limit": 10,
"min_score": 0.62,
},
},
{
"name": "分化承接回流",
"description": "寻找分化中仍有趋势承接、板块强度和资金回流的核心候选。",
"regimes": ["divergence"],
"formula": {
"universe": {"exclude_st": True, "listed_days_min": 120},
"filters": [
{"field": "pct_chg", "op": "between", "value": [-3, 7]},
{"field": "return_5d", "op": ">", "value": 0},
{"field": "above_ma20", "op": "==", "value": 1},
{"field": "volume_ratio_5d", "op": "between", "value": [0.7, 3.5]},
],
"score": [
{"field": "relative_strength", "weight": 0.28, "direction": "desc"},
{"field": "sector_strength", "weight": 0.24, "direction": "desc"},
{"field": "net_flow_million", "weight": 0.20, "direction": "desc"},
{"field": "volatility_10d", "weight": 0.16, "direction": "asc"},
{"field": "amount_billion", "weight": 0.12, "direction": "desc"},
],
"limit": 12,
"min_score": 0.57,
},
},
{
"name": "退潮防守观察",
"description": "退潮期采用高门槛防守筛选,结果为空代表当前不宜主动出击。",
"regimes": ["retreat"],
"formula": {
"universe": {"exclude_st": True, "listed_days_min": 180},
"filters": [
{"field": "pct_chg", "op": "between", "value": [-2, 4]},
{"field": "return_5d", "op": ">=", "value": -2},
{"field": "above_ma20", "op": "==", "value": 1},
{"field": "volatility_10d", "op": "<=", "value": 4.5},
{"field": "amount_billion", "op": ">=", "value": 2},
],
"score": [
{"field": "volatility_10d", "weight": 0.30, "direction": "asc"},
{"field": "relative_strength", "weight": 0.25, "direction": "desc"},
{"field": "amount_billion", "weight": 0.20, "direction": "desc"},
{"field": "sector_strength", "weight": 0.15, "direction": "desc"},
{"field": "net_flow_million", "weight": 0.10, "direction": "desc"},
],
"limit": 8,
"min_score": 0.68,
},
},
{
"name": "竞价强势确认",
"description": "用竞价涨幅、成交承载和量比确认修复或发酵阶段的主动进攻标的。",
"regimes": ["repair", "fermentation", "divergence"],
"formula": {
"universe": {"exclude_st": True, "listed_days_min": 120},
"filters": [
{"field": "auction_change", "op": "between", "value": [1, 7]},
{"field": "auction_amount_million", "op": ">=", "value": 3},
{"field": "auction_volume_ratio", "op": ">=", "value": 0.8},
{"field": "amount_billion", "op": ">=", "value": 1},
],
"score": [
{"field": "auction_amount_million", "weight": 0.26, "direction": "desc"},
{"field": "auction_volume_ratio", "weight": 0.22, "direction": "desc"},
{"field": "auction_change", "weight": 0.18, "direction": "desc"},
{"field": "sector_strength", "weight": 0.18, "direction": "desc"},
{"field": "relative_strength", "weight": 0.16, "direction": "desc"},
],
"limit": 15,
"min_score": 0.56,
},
},
]
for _strategy in BUILTIN_STRATEGIES:
_strategy["formula"].setdefault("meta", {
"library": "smart", "category": "周期策略", "quality": "系统",
"frequency": "每日", "risk": "随市场阶段", "data_group": "行情因子",
})
CURATED_STRATEGIES = [
{
"name": "连续分红质量",
"description": "寻找持续派息、盈利质量稳定且波动可控的长期现金回报型公司。",
"regimes": list(REGIMES),
"formula": {
"meta": {"library": "curated", "category": "红利价值", "quality": "A", "frequency": "月度", "risk": "中低", "data_group": "估值与财务"},
"universe": {"exclude_st": True, "listed_days_min": 1095},
"filters": [
{"field": "dividend_years", "op": ">=", "value": 4},
{"field": "dividend_yield_ttm", "op": ">=", "value": 2},
{"field": "roe", "op": ">=", "value": 6},
{"field": "pb", "op": "between", "value": [0.1, 4]},
],
"score": [
{"field": "dividend_yield_ttm", "weight": 0.30, "direction": "desc"},
{"field": "roe", "weight": 0.24, "direction": "desc"},
{"field": "ocf_to_opincome", "weight": 0.18, "direction": "desc"},
{"field": "volatility_10d", "weight": 0.16, "direction": "asc"},
{"field": "total_mv_billion", "weight": 0.12, "direction": "desc"},
], "limit": 20, "min_score": 0.52,
},
},
{
"name": "ROIC质量低波",
"description": "以投入资本回报、毛利率和估值为核心,寻找低波动的高质量公司。",
"regimes": ["ice", "repair", "divergence", "retreat"],
"formula": {
"meta": {"library": "curated", "category": "质量价值", "quality": "A-", "frequency": "月度", "risk": "中低", "data_group": "估值与财务"},
"universe": {"exclude_st": True, "listed_days_min": 730},
"filters": [
{"field": "roic", "op": ">=", "value": 6},
{"field": "gross_margin", "op": ">=", "value": 15},
{"field": "pe_ttm", "op": "between", "value": [1, 45]},
{"field": "amount_billion", "op": ">=", "value": 1},
],
"score": [
{"field": "roic", "weight": 0.28, "direction": "desc"},
{"field": "gross_margin", "weight": 0.22, "direction": "desc"},
{"field": "ps_ttm", "weight": 0.18, "direction": "asc"},
{"field": "volatility_10d", "weight": 0.18, "direction": "asc"},
{"field": "total_mv_billion", "weight": 0.14, "direction": "desc"},
], "limit": 20, "min_score": 0.54,
},
},
{
"name": "低估值现金流白马",
"description": "筛选估值克制、经营现金流健康、资产回报稳定的大中型公司。",
"regimes": ["ice", "repair", "divergence", "retreat"],
"formula": {
"meta": {"library": "curated", "category": "现金流价值", "quality": "A-", "frequency": "月度", "risk": "中低", "data_group": "估值与财务"},
"universe": {"exclude_st": True, "listed_days_min": 730},
"filters": [
{"field": "pb", "op": "between", "value": [0.1, 1.8]},
{"field": "roa", "op": ">=", "value": 3},
{"field": "ocf_to_opincome", "op": ">", "value": 0},
{"field": "netprofit_yoy", "op": ">=", "value": -15},
{"field": "total_mv_billion", "op": ">=", "value": 100},
],
"score": [
{"field": "roa", "weight": 0.26, "direction": "desc"},
{"field": "ocf_to_opincome", "weight": 0.24, "direction": "desc"},
{"field": "pb", "weight": 0.20, "direction": "asc"},
{"field": "total_mv_billion", "weight": 0.16, "direction": "desc"},
{"field": "volatility_10d", "weight": 0.14, "direction": "asc"},
], "limit": 20, "min_score": 0.53,
},
},
{
"name": "高增长合理估值",
"description": "在收入和利润同步增长的公司中,优先选择估值合理、趋势得到确认的标的。",
"regimes": ["repair", "fermentation", "divergence"],
"formula": {
"meta": {"library": "curated", "category": "成长质量", "quality": "B+", "frequency": "月度", "risk": "中", "data_group": "估值与财务"},
"universe": {"exclude_st": True, "listed_days_min": 365},
"filters": [
{"field": "pe_ttm", "op": "between", "value": [1, 35]},
{"field": "revenue_yoy", "op": ">=", "value": 10},
{"field": "netprofit_yoy", "op": ">=", "value": 15},
{"field": "roe", "op": ">=", "value": 5},
{"field": "amount_billion", "op": ">=", "value": 1},
],
"score": [
{"field": "netprofit_yoy", "weight": 0.27, "direction": "desc"},
{"field": "revenue_yoy", "weight": 0.23, "direction": "desc"},
{"field": "roe", "weight": 0.20, "direction": "desc"},
{"field": "pe_ttm", "weight": 0.16, "direction": "asc"},
{"field": "relative_strength", "weight": 0.14, "direction": "desc"},
], "limit": 20, "min_score": 0.55,
},
},
{
"name": "行业宽度主线",
"description": "从行业站上20日线的覆盖率和板块强度出发,筛选主线中的强势个股。",
"regimes": ["repair", "fermentation", "climax", "divergence"],
"formula": {
"meta": {"library": "curated", "category": "行业轮动", "quality": "B+", "frequency": "每周", "risk": "中", "data_group": "行情与行业"},
"universe": {"exclude_st": True, "listed_days_min": 180},
"filters": [
{"field": "sector_breadth_ma20", "op": ">=", "value": 55},
{"field": "sector_strength", "op": ">=", "value": 55},
{"field": "above_ma20", "op": "==", "value": 1},
{"field": "amount_billion", "op": ">=", "value": 2},
],
"score": [
{"field": "sector_breadth_ma20", "weight": 0.28, "direction": "desc"},
{"field": "sector_strength", "weight": 0.24, "direction": "desc"},
{"field": "relative_strength", "weight": 0.20, "direction": "desc"},
{"field": "sector_limit_count", "weight": 0.16, "direction": "desc"},
{"field": "amount_billion", "weight": 0.12, "direction": "desc"},
], "limit": 20, "min_score": 0.56,
},
},
{
"name": "首板低开",
"description": "昨日首板且位置不高,次日竞价温和低开并具备成交承载时进入候选。",
"regimes": ["ice", "repair", "divergence"],
"formula": {
"meta": {"library": "curated", "category": "短线竞价", "quality": "B+", "frequency": "每日9:25", "risk": "高", "data_group": "行情与竞价"},
"universe": {"exclude_st": True, "listed_days_min": 250},
"filters": [
{"field": "previous_first_limit", "op": "==", "value": 1},
{"field": "auction_change", "op": "between", "value": [-4.5, -2.5]},
{"field": "relative_position_60", "op": "<=", "value": 0.55},
{"field": "previous_amount_billion", "op": ">=", "value": 1},
],
"score": [
{"field": "auction_amount_million", "weight": 0.28, "direction": "desc"},
{"field": "previous_amount_billion", "weight": 0.24, "direction": "desc"},
{"field": "relative_position_60", "weight": 0.20, "direction": "asc"},
{"field": "sector_strength", "weight": 0.16, "direction": "desc"},
{"field": "auction_volume_ratio", "weight": 0.12, "direction": "desc"},
], "limit": 12, "min_score": 0.50,
},
},
{
"name": "小碎步临界突破",
"description": "寻找近期窄幅爬升、接近阶段高点且具备历史活跃记忆的突破候选。",
"regimes": ["repair", "fermentation", "divergence"],
"formula": {
"meta": {"library": "curated", "category": "形态突破", "quality": "B+", "frequency": "每日", "risk": "中高", "data_group": "历史行情"},
"universe": {"exclude_st": True, "listed_days_min": 250},
"filters": [
{"field": "no_limit_30d", "op": "==", "value": 1},
{"field": "had_limit_80d", "op": "==", "value": 1},
{"field": "max_abs_change_15d", "op": "<=", "value": 3},
{"field": "close_to_high_15d", "op": ">=", "value": 0.98},
{"field": "close_to_high_60d", "op": ">=", "value": 0.90},
],
"score": [
{"field": "close_to_high_15d", "weight": 0.26, "direction": "desc"},
{"field": "volume_ratio_5d", "weight": 0.22, "direction": "desc"},
{"field": "relative_strength", "weight": 0.20, "direction": "desc"},
{"field": "max_abs_change_15d", "weight": 0.18, "direction": "asc"},
{"field": "circ_mv_billion", "weight": 0.14, "direction": "asc"},
], "limit": 15, "min_score": 0.54,
},
},
{
"name": "连板龙头",
"description": "从昨日连板梯队中按高度、板块热度和成交承载筛选辨识度前排。",
"regimes": ["fermentation", "climax", "divergence"],
"formula": {
"meta": {"library": "curated", "category": "连板接力", "quality": "B", "frequency": "每日", "risk": "很高", "data_group": "涨停结构"},
"universe": {"exclude_st": True, "listed_days_min": 120},
"filters": [
{"field": "previous_limit_streak", "op": ">=", "value": 2},
{"field": "previous_amount_billion", "op": ">=", "value": 1},
],
"score": [
{"field": "previous_limit_streak", "weight": 0.34, "direction": "desc"},
{"field": "sector_limit_count", "weight": 0.24, "direction": "desc"},
{"field": "previous_amount_billion", "weight": 0.18, "direction": "desc"},
{"field": "turnover_rate", "weight": 0.14, "direction": "desc"},
{"field": "sector_strength", "weight": 0.10, "direction": "desc"},
], "limit": 10, "min_score": 0.50,
},
},
{
"name": "微盘三正",
"description": "以正估值、正盈利和正经营现金流约束微盘暴露,保留明确风险提示。",
"regimes": ["repair", "fermentation"],
"formula": {
"meta": {"library": "curated", "category": "小盘质量", "quality": "B", "frequency": "每周", "risk": "高", "data_group": "估值与财务"},
"universe": {"exclude_st": True, "listed_days_min": 365},
"filters": [
{"field": "pb", "op": ">", "value": 0},
{"field": "roe", "op": ">", "value": 0},
{"field": "ocf_to_opincome", "op": ">", "value": 0},
{"field": "circ_mv_billion", "op": "between", "value": [5, 100]},
{"field": "amount_billion", "op": ">=", "value": 0.5},
],
"score": [
{"field": "circ_mv_billion", "weight": 0.32, "direction": "asc"},
{"field": "roe", "weight": 0.24, "direction": "desc"},
{"field": "ocf_to_opincome", "weight": 0.20, "direction": "desc"},
{"field": "turnover_rate", "weight": 0.14, "direction": "desc"},
{"field": "relative_strength", "weight": 0.10, "direction": "desc"},
], "limit": 20, "min_score": 0.52,
},
},
{
"name": "首板高开弱转强",
"description": "昨日涨停或触板后,使用9:25最终竞价涨幅、量比和板块承接确认强度。",
"regimes": ["repair", "fermentation", "divergence"],
"formula": {
"meta": {"library": "curated", "category": "短线竞价", "quality": "B-", "frequency": "每日9:25", "risk": "高", "data_group": "行情与竞价"},
"universe": {"exclude_st": True, "listed_days_min": 120},
"filters": [
{"field": "previous_limit_signal", "op": "==", "value": 1},
{"field": "auction_change", "op": "between", "value": [1, 6]},
{"field": "auction_volume_ratio", "op": ">=", "value": 0.8},
{"field": "previous_amount_billion", "op": "between", "value": [3, 25]},
],
"score": [
{"field": "auction_amount_million", "weight": 0.28, "direction": "desc"},
{"field": "auction_volume_ratio", "weight": 0.24, "direction": "desc"},
{"field": "auction_change", "weight": 0.18, "direction": "desc"},
{"field": "sector_strength", "weight": 0.17, "direction": "desc"},
{"field": "relative_strength", "weight": 0.13, "direction": "desc"},
], "limit": 15, "min_score": 0.52,
},
},
]
CURATED_STRATEGIES.extend(ADVANCED_CURATED_STRATEGIES)
STRATEGY_ENVIRONMENT_NOTES = {
"连续分红质量": (
"防守市、低利率环境与中长期配置窗口",
"风险偏好快速上升时,稳健资产的价格弹性通常落后",
),
"ROIC质量低波": (
"震荡偏弱、重视盈利质量与回撤控制的市场",
"主题快速扩散或高弹性行情中,低波筛选可能错过进攻方向",
),
"低估值现金流白马": (
"估值修复、价值回归及防守配置阶段",
"低估值可能来自基本面持续走弱,需警惕价值陷阱",
),
"高增长合理估值": (
"业绩驱动、成长风格占优且趋势获得确认的阶段",
"增长预期下修或估值快速收缩时,回撤可能明显放大",
),
"行业宽度主线": (
"主线清晰、行业内部多数个股同步走强的行情",
"板块快速轮动时,宽度信号容易在确认后迅速衰减",
),
"首板低开": (
"情绪修复期的分歧转一致与首板次日承接",
"退潮加速或低开缺少量能承接时,弱势可能继续扩大",
),
"小碎步临界突破": (
"趋势蓄势、波动收敛后临近突破的结构市",
"无量突破或指数剧烈震荡时,容易形成冲高回落",
),
"连板龙头": (
"高度拓展、题材梯队完整且接力情绪活跃的阶段",
"亏钱效应扩散或高位股集中退潮时,接力风险很高",
),
"微盘三正": (
"小盘风格活跃、流动性宽松且风险偏好较高的行情",
"风格切向大盘或微盘流动性收缩时,组合波动会显著上升",
),
"首板高开弱转强": (
"竞价承接明确、短线情绪修复或主线发酵阶段",
"高开缺乏板块共振时,竞价强势可能转为盘中兑现",
),
"中期动量·强者恒强": (
"趋势延续、主升段及强弱分化清晰的行情",
"无趋势震荡或快速轮动中,动量信号容易反复失效",
),
"强者回调": (
"主升趋势未破、强势股完成良性回踩的窗口",
"趋势已反转时,回调信号可能演变为下跌中继",
),
"超跌反转": (
"急跌后恐慌释放充分、市场进入修复预期的阶段",
"单边下跌初段容易过早介入,超跌不等于止跌",
),
"相对强度新高": (
"指数偏弱但结构性主线明确,或机构抱团强化的行情",
"基准快速补涨或强势方向瓦解时,相对优势可能迅速消失",
),
"均线多头排列": (
"中期趋势向上、回撤有序的趋势市与主升段",
"高位趋势末端或宽幅震荡中,均线信号通常反应滞后",
),
"唐奇安通道突破": (
"整理末端、放量突破并启动新趋势的行情",
"无量突破和宽幅震荡环境中,假突破出现概率较高",
),
"周线趋势·日线买点": (
"中期趋势稳定、日线回踩或再启动的多周期共振阶段",
"周线拐点尚未确认时,日线信号可能只是短暂反抽",
),
"空间板": (
"市场高度持续拓展、板块梯队完整的强接力环境",
"高度压缩或亏钱效应扩散时,最高板的补跌风险极高",
),
"龙头首阴": (
"主线龙头仍有辨识度、首次分歧后存在回流预期的阶段",
"题材退潮或龙头地位被替代后,首阴可能只是下跌起点",
),
"断板反包": (
"强势题材分歧后快速修复、核心股重新获得资金承接时",
"板块强度不足或反包缩量时,形态持续性通常较弱",
),
"核按钮反核": (
"恐慌释放后出现明确承接、短线情绪转暖的窗口",
"系统性退潮中深水拉回可能只是日内脉冲,隔日风险较高",
),
"行业动量轮动": (
"主线相对清晰、行业趋势能够延续两周以上的结构市",
"行业轮动速度过快或前三名差距很小时,动量优势容易迅速衰减",
),
"主力资金行业流入": (
"板块轮动初期、资金先于价格形成连续净流入的阶段",
"资金流口径可能受大宗交易和短期对倒影响,单日突增不代表趋势",
),
"景气-趋势-拥挤三维行业打分": (
"行业景气与价格趋势同向、但交易拥挤尚未达到极端的结构市",
"财务披露存在滞后,行业快速反转时三维综合分可能反应偏慢",
),
"大小盘/成长价值风格切换(元策略)": (
"大小盘或成长价值风格形成持续相对强弱的阶段",
"风格快速往返切换时,近20日相对表现容易产生滞后信号",
),
"业绩超预期漂移(SUE/PEAD)": (
"业绩披露窗口中,快报相对预告继续上修且价格尚未充分兑现时",
"预告与快报口径可能不同,公告后高开兑现会削弱漂移效应",
),
"多因子综合打分(IC动态加权)": (
"因子表现具备一定延续性、市场并非由单一极端主题主导时",
"近期有效因子可能快速失效,动态权重不能消除风格突变风险",
),
"热度突增潜伏(另类数据)": (
"人气快速抬升但股价尚未明显启动的题材萌芽与扩散初期",
"榜单热度可能由短期讨论驱动,缺少价格确认时误报率较高",
),
"机构榜溢价": (
"机构专用席位在相对低位形成明确净买入、且成交承载正常时",
"高位机构榜可能对应兑现或对倒,席位净买入不等于持续锁仓",
),
}
for strategy in CURATED_STRATEGIES:
suitable_environment, failure_risk = STRATEGY_ENVIRONMENT_NOTES[strategy["name"]]
strategy["formula"]["meta"].update(
{
"suitable_environment": suitable_environment,
"failure_risk": failure_risk,
}
)
BUILTIN_STRATEGIES.extend(CURATED_STRATEGIES)
for strategy in BUILTIN_STRATEGIES:
attach_strategy_validity(strategy)