本项目运行在本地 macOS,A 股交易日 14:40 预热历史溢价缓存,14:55 拉取实时行情和市场数据,计算是否发出买入信号,并在 14:56 前通过 Bark / PushPlus 推送。用户执行策略为:大资金、每日最多一次、14:57 挂涨停价买入,回测按当日收盘价成交。
程序只发信号,不自动交易。可选的模拟交易只是本地账本,不连接券商真实交易接口。
- 规则决定买不买,LLM 只按郑希公开方法框架融合解释规则结果和新闻上下文。
- 默认基金池为手工配置的 A 股纳斯达克 100 / NDX 等价 QDII-ETF。
- LOF 不进入默认买入池,只放 watchlist。
- 每日只选一只最优基金。
- 溢价过滤使用相对分位数加绝对硬上限。
- NDX/NQ 参与市场评分,极端行情触发硬过滤。
- 市场评分低于阈值时完全不买。
- 关键数据缺失、过期、交叉校验异常时不发买入信号。
- 回测信号只使用当时可见数据,成交使用基金收盘价。
- 回测不调用 LLM。
- 新闻上下文只供 LLM 融合解释当前市场背景和风险,不参与规则决策。
- 最终推送标题保持简短,正文按结论、LLM 分析、市场评分、候选基金、模拟交易排序。
- 模拟交易只在正式
run-daily且信号为BUY时记录挂单;--dry-run不写模拟交易。
- 判断是否 A 股交易日。
- 从当天 SQLite 缓存读取历史溢价。
- 拉取基金实时价格、实时估值/IOPV。
- 剔除缺关键数据或溢价不合格的基金。
- 在合格基金中按当前溢价、溢价分位、数据质量、成交额排序。
- 拉取 NDX 历史日线和 NQ 实时行情。
- 计算市场评分。
- 若硬过滤触发或评分低于阈值,则不买。
- 若通过所有规则,则发 BUY 信号。
- 如果开启模拟交易,写入一笔 14:57 挂涨停价的本地模拟挂单。
- 如果开启新闻上下文,使用 AnySearch 拉取近期相关新闻。
- 生成推送 Markdown,LLM 分析读取项目内置的
zhengxi-views方法框架,按郑希公开方法框架融合规则结果和新闻上下文,不单独展示新闻原文。 - 写入 SQLite 审计记录。
新闻上下文是可选解释层,不是交易规则。
news:
enabled: false
provider: anysearch
endpoint: "https://api.anysearch.com/mcp"
api_key: "${ANYSEARCH_API_KEY}"
lookback_hours: 24
max_results: 6
max_chars: 3000
timeout_seconds: 15原则:
- 只有
news.enabled: true且api_key非空时才拉取新闻。 - 新闻抓取失败不会阻塞规则信号,会写入审计记录并作为 LLM 输入上下文。
- LLM 可以按郑希公开方法框架融合规则结果、当前市场背景和风险,但不得改变
BUY/SKIP信号。 - 最终推送不单独展示原始新闻上下文。
- 若新闻长期证明有稳定决策价值,应沉淀成明确规则,而不是让 LLM 临场决策。
模拟交易用于复盘用户自己的执行行为,不代表真实下单。
sim_trading:
enabled: false
order_amount: 100000
order_time: "14:57:00"
settle_time: "22:30:00"
lot_size: 100流程:
run-daily正式运行得到BUY后,按推荐基金的信号价格计算整手数量。- SQLite 写入
SUBMITTED模拟挂单,挂单方式记录为UP_LIMIT。 settle-sim-trades在 22:30 运行,拉取当日 ETF 收盘价。- 按收盘价更新为
FILLED,记录成交价和成交额。 - 若之前有遗留
SUBMITTED挂单,后续结算任务会继续按对应交易日收盘价处理。
lot_size 表示一手的份额数量。A 股 ETF 场内交易通常一手为 100 份,默认值保持 100。
每日最终推送会在“模拟交易”段展示账户摘要,包括持仓、持仓成本、最新市值、浮动盈亏、浮动收益率、待结算挂单和最近模拟交易。模拟账户摘要只用于观察,不参与规则引擎决策。
如果 22:30 免费数据源还没有当日收盘价,结算命令会失败暴露错误,等待下次手工或定时重跑,不使用 14:55 价格假装收盘价。
lookback_days: 60
min_history_days: 40
max_percentile: 0.70
hard_cap: 0.12某基金当日溢价需同时满足:
- 当前溢价不超过 12%。
- 当前溢价不超过近 60 个可用交易日溢价的 70% 分位阈值。
- 历史可用天数少于 40 天时,当日剔除该基金。
先过滤,再排序:
- 当前溢价最低。
- 若当前溢价差距小于 0.3 个百分点,选择溢价分位更低者。
- 若仍接近,选择数据质量更高者。
- 最后用成交额作为 tie-breaker,但不做流动性过滤。
总分 100,阈值 60。
| 指标 | 权重 | 含义 |
|---|---|---|
| medium_trend | 25 | NDX 是否仍处于中期上升趋势 |
| short_pullback | 25 | NDX 近期是否有适度回调 |
| overbought_control | 15 | 避免明显过热 |
| nq_intraday_position | 20 | A 股 14:55 时 NQ 是否适合低吸 |
| volatility_risk | 15 | 避免近期波动异常放大 |
硬过滤:
- NQ 实时涨跌幅 <= -3%。
- NDX 前一交易日收盘价 < MA120 * 0.95。
提供三组对比:
- 每个 A 股交易日都买。
- 只做溢价过滤。
- 溢价过滤 + 市场评分。
输出:
- 终端摘要。
- Markdown 报告,方便交给 LLM 分析。
- Plotly HTML 交互式报告。
- SQLite 明细。
回测市场评分支持两种模式:
daily-proxy:默认模式,适合一年以上回测。使用基金历史溢价和 NDX 日频指标,NQ 盘中分量记为中性半分。intraday-strict:严格模式,尝试使用 NQ 14:55 附近历史盘中数据,适合近期或未来接入付费数据源后使用。
第一版使用免费源:
- 东方财富窄接口:A 股 ETF 实时价格、IOPV 实时估值、成交额、更新时间。
- AkShare:HaoETF 历史缺失时,用 AkShare ETF 日线收盘价与历史单位净值生成近似历史溢价。
- HaoETF:QDII 历史溢价,仍作为历史溢价优先源。
- EastMoney:基金实时价格和历史 K 线,可作为备用源。
- Yahoo Finance/yfinance:NDX 日线、NQ 期货实时/历史行情。
免费数据源可能缺失、延迟或字段变化。凡是参与规则的关键字段不可用,系统返回 SKIP_DATA,不会用旧数据、猜测数据或 LLM 补全。