Skip to content

Latest commit

 

History

History
163 lines (120 loc) · 6.45 KB

File metadata and controls

163 lines (120 loc) · 6.45 KB

NDX A 股基金定投信号系统设计

目标

本项目运行在本地 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 不写模拟交易。

信号流程

  1. 判断是否 A 股交易日。
  2. 从当天 SQLite 缓存读取历史溢价。
  3. 拉取基金实时价格、实时估值/IOPV。
  4. 剔除缺关键数据或溢价不合格的基金。
  5. 在合格基金中按当前溢价、溢价分位、数据质量、成交额排序。
  6. 拉取 NDX 历史日线和 NQ 实时行情。
  7. 计算市场评分。
  8. 若硬过滤触发或评分低于阈值,则不买。
  9. 若通过所有规则,则发 BUY 信号。
  10. 如果开启模拟交易,写入一笔 14:57 挂涨停价的本地模拟挂单。
  11. 如果开启新闻上下文,使用 AnySearch 拉取近期相关新闻。
  12. 生成推送 Markdown,LLM 分析读取项目内置的 zhengxi-views 方法框架,按郑希公开方法框架融合规则结果和新闻上下文,不单独展示新闻原文。
  13. 写入 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: trueapi_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

流程:

  1. run-daily 正式运行得到 BUY 后,按推荐基金的信号价格计算整手数量。
  2. SQLite 写入 SUBMITTED 模拟挂单,挂单方式记录为 UP_LIMIT
  3. settle-sim-trades 在 22:30 运行,拉取当日 ETF 收盘价。
  4. 按收盘价更新为 FILLED,记录成交价和成交额。
  5. 若之前有遗留 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 天时,当日剔除该基金。

基金选择

先过滤,再排序:

  1. 当前溢价最低。
  2. 若当前溢价差距小于 0.3 个百分点,选择溢价分位更低者。
  3. 若仍接近,选择数据质量更高者。
  4. 最后用成交额作为 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。

回测

提供三组对比:

  1. 每个 A 股交易日都买。
  2. 只做溢价过滤。
  3. 溢价过滤 + 市场评分。

输出:

  • 终端摘要。
  • 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 补全。