给 AI 智能体用的 A 股交易技能 — 行情 · 信号 · 回测 · 风控,自带"信号不可信"预警
让智能体看得到数据、算得出信号、知道信号什么时候不可信、并且永远碰不到你的真实账户。
给 LLM 智能体接上股票数据很容易,难的是另外三件事:
- 不胡说 — 所有数字来自实时接口,智能体被禁止凭记忆编造行情;
- 不自信过头 — 技术信号在震荡阴跌股上会反复止损失血。本技能会用该股自己的历史数据回测这套信号,胜率不行就把买入信号当场拦下来,并告诉你证据;
- 不碰真钱 — 不接任何券商接口,模拟盘 + 人工确认是写死在技能定义里的红线。
| 模块 | 能力 |
|---|---|
| 🔌 行情数据 | 实时报价(批量)· 前复权日K · 四大指数 · 主力资金流向 |
| 📊 技术分析 | 六指标投票信号(MA/MACD/RSI/KDJ/BOLL/量能)· 支撑阻力位 · ADX/ER 趋势强度 |
| 🚨 三层预警 | 适配度硬门槛(核心)· 大盘空头降级 · 震荡/下跌环境提示 |
| 🔬 信号回测 | 含佣金印花税 · 固定止损+移动止盈 · 胜率/回撤 vs 买入持有 |
| 💼 模拟盘 | T+1(按当日买入部分锁定)· 单票/总仓位上限 · 移动止盈 · 权益曲线与最大回撤 |
| ⭐ 自选股 | 增删查 + 一键批量扫描 |
flowchart LR
subgraph 数据源
T[腾讯行情<br>报价/日K/指数]
E[东方财富<br>主力资金流]
end
subgraph "scripts/"
F[fetch_data.py]
A[analyze.py<br>信号+预警]
B[backtest.py<br>策略回测]
P[paper_trade.py<br>模拟盘+风控]
W[watchlist.py]
end
AGENT((AI 智能体<br>SKILL.md 驱动))
T --> F
E --> F
F --> A
F --> P
A -->|信号| AGENT
A <-->|适配度门槛| B
W --> A
P -->|持仓/报警| AGENT
AGENT -->|建议委托单| USER[用户手动下单]
技术信号最大的谎言是"它对每只股票都管用"。实测同一套六指标信号:
| 股票 | 近500日信号胜率 | 策略收益 | 同期买入持有 |
|---|---|---|---|
| 宁德时代 | 69.2% | +113.9% | +138.6% |
| 招商银行 | 87.5% | +34.7% | +28.7% |
| 贵州茅台 | 18.2% | −22.1% | −1.0% |
| 五粮液 | 25.0% | −12.1% | −25.4% |
同一信号,有的票能用,有的票是绞肉机。因此:
第 1 层 · 适配度硬门槛(自动强制) — analyze 产出买入信号时,自动回测该票近 500 日(结果按天缓存)。胜率 <45% 或策略收益为负 → 买入信号强制降为 hold:
"signal": "hold",
"raw_signal": "buy",
"warnings": [
"适配预警(已拦截买入):该票近500日信号胜率 18.2%、策略收益 -22.12%
(同期持有 -0.97%),本信号体系与该票不匹配"
]第 2 层 · 大盘过滤 — 上证指数空头排列时,买入信号自动降一级。
第 3 层 · 环境预警(仅提示) — 个股下跌趋势(close<MA60 且 MA20<MA60)、震荡市(ADX<20 且 ER<0.25)输出警告但不拦截。
💡 为什么第 3 层不做硬拦截? 我们做过 5 股 × 500 日的对照实验:环境硬拦截改善了茅台(−22%→−18%)却重伤了宁德(+114%→+62%)和五粮液(−12%→−30%),五股合计收益从 +121% 砍到 +52%——因为 V 型反转的最强买点必然出现在"下跌趋势"判定区内。预测环境不可靠,直接测量信号在这只票上的历史战绩才可靠。 实验开关保留在
backtest.py --entry-mode供复现。
写死在 SKILL.md,任何对话指令不得覆盖:
- ❌ 不连接任何券商实盘接口,不自动下单
- ✅ 实盘操作只输出"建议委托单",由用户在券商 App 手动执行
- ✅ 止损报警只提醒,模拟盘卖出也需用户确认
- ✅ 每条买入建议必须附带止损价、仓位上限与风险提示
# 1. 安装依赖
pip install -r requirements.txt
# 2. 作为 OpenClaw 技能安装
cp -r stock-trader ~/.openclaw/skills/
# 之后在对话中提到 行情/信号/回测/复盘 即自动触发
# 3. 或者直接当 CLI 用
python scripts/fetch_data.py quote 600519 300750 # 实时行情
python scripts/analyze.py --watchlist # 扫描自选股(含三层预警)
python scripts/backtest.py 600519 --days 500 # 回测验证
python scripts/paper_trade.py init --cash 1000000 # 开模拟盘📜 全部命令速查
# 行情
python scripts/fetch_data.py quote <代码...> # 实时行情(批量)
python scripts/fetch_data.py history <代码> --days N # 前复权日K
python scripts/fetch_data.py index # 四大指数
python scripts/fetch_data.py moneyflow <代码> # 主力资金流向
# 分析与回测
python scripts/analyze.py <代码...> [--scan|--watchlist|--no-market]
python scripts/backtest.py <代码...> [--days 500] [--entry-mode off|soft|hard]
# 自选股
python scripts/watchlist.py add <代码> [--note 备注]
python scripts/watchlist.py remove <代码>
python scripts/watchlist.py list
# 模拟盘
python scripts/paper_trade.py init --cash <金额>
python scripts/paper_trade.py buy <代码> --qty <数量> --reason <理由>
python scripts/paper_trade.py sell <代码> --qty <数量> --reason <理由>
python scripts/paper_trade.py status # 持仓+盈亏+最大回撤
python scripts/paper_trade.py risk # 止损巡检(适合定时任务)| 规则 | 数值 | 说明 |
|---|---|---|
| 单票仓位上限 | 总资产 30% | 超额拒单 |
| 总仓位上限 | 总资产 90% | 强制留现金 |
| T+1 | 仅锁当日买入部分 | 原有持仓可卖 |
| 固定止损 | 成本价 −8% | 买入即记录 |
| 移动止盈 | 浮盈 +10% 启动,最高价回撤 8% 触发 | 自动抬升止损线 |
| 交易成本 | 佣金万2.5(最低5元,双向)+ 印花税 0.05%(卖出) | 盈亏均为含费净值 |
所有拒单都会返回人话原因,例如:
风控拒单:T+1 规则,今日买入的 100 股锁定,当前可卖 100 股
风控拒单:买入后总仓位将超过 90% 上限,须保留现金
stock-trader/
├── SKILL.md # 技能定义:触发条件、安全红线、工作流(智能体读这个)
├── requirements.txt # 仅 requests + pandas
└── scripts/
├── fetch_data.py # 数据层:行情/日K/指数/资金流,自带重试与代理绕过
├── analyze.py # 信号层:六指标投票 + 三层预警
├── backtest.py # 验证层:含费回测引擎(被适配度门槛复用)
├── paper_trade.py # 执行层:模拟盘 + 全套风控
└── watchlist.py # 自选股管理
技能本体就是 SKILL.md(Anthropic Skill 规范)+ 普通 Python CLI 脚本,
不依赖 OpenClaw 任何私有 API——Claude Code、Codex 等任何能读 Markdown、
能执行命令的智能体框架都可以直接使用。
本项目仅供技术研究与教育用途。所有信号、回测与预警均基于历史数据, 不构成任何投资建议,不保证未来有效。股市有风险,入市需谨慎, 使用本工具产生的任何投资决策与盈亏由使用者自行承担。