案例:LLM 量化研究员¶
让 Claude 帮你读实时行情和账户状态,写分析报告。不下单。
需求¶
- Claude Desktop 能看到腾讯 / 苹果 / 特斯拉等的实时报价 + K 线 + 基本面
- Claude 能列我所有账户的持仓 + 当天订单 + 历史成交
- 所有读取走 MCP,Claude 不写任何数据
- 审计完整保留
key 策略¶
只给只读 scope,不给 trade:*:
futucli gen-key \
--id claude-analyst \
--scopes qot:read,acc:read \
--expires 90d \
--bind-this-machine
- 不给交易 scope —— 即使 Claude 心血来潮想下单,调
futu_place_order会被missing scope trade:real拒 - 机器绑定 —— keys.json 被拷到别处用不了
- 90 天过期 —— 定期轮转
启动¶
# 网关
futu-opend \
--login-account 12345678 --login-pwd "$FUTU_PWD" \
--rest-port 22222 \
--rest-keys-file ~/.config/futu/keys.json
# MCP(stdio,Claude Desktop 会启子进程)
# 见下面 Claude Desktop 配置
Claude Desktop 配置¶
~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"futu": {
"command": "/usr/local/bin/futu-mcp",
"args": [
"--gateway", "127.0.0.1:11111",
"--keys-file", "/Users/you/.config/futu/keys.json",
"--audit-log", "/Users/you/Library/Logs/futu-mcp-audit.jsonl"
],
"env": {
"FUTU_MCP_API_KEY": "fc_xxxxxxxxxxxxxxxxxx"
}
}
}
}
问 Claude 试试¶
"给我看一下腾讯控股和苹果的最新报价,分析一下今天的盘面"
Claude 会调 futu_get_quote + futu_get_snapshot + futu_get_kline,综合数据给你写分析。
"我账户里有什么持仓?今天成交过什么?"
调 futu_list_accounts → futu_get_positions → futu_get_deals。
"下单买 100 股腾讯"
Claude 会告诉你工具调用失败:missing scope trade:real。符合预期 —— 这把 key 只读。
审计查询¶
# Claude 这周都看了啥
jq 'select(.key_id=="claude-analyst" and .iface=="mcp")' \
~/Library/Logs/futu-mcp-audit.jsonl | tail -100
# 被拒的调用(scope 不够)
jq 'select(.key_id=="claude-analyst" and .outcome=="reject")' \
~/Library/Logs/futu-mcp-audit.jsonl
升级路径¶
想给 Claude 下单权限?不推荐。如果非要:
- 生成独立的key,绑定
trade:simulate先跑 1 周 - 配非常紧的限额(
--max-order-value 10000--max-orders-per-minute 1) - 验证没翻车再考虑
trade:real,且仍然保留严格限额 - 监控
futu_auth_limit_rejects_total{key_id="claude-real"}长期看告警
LLM 犯错是常态,护栏是必须。