基于大语言模型(LLM)Function Calling 与自我反思学习体系的智能加密货币交易策略
这是一个基于 Freqtrade 的自动化交易示例策略。策略使用 OpenAI Function Calling 接入大语言模型,在 30m 主时间框架下对市场进行全局分析:
- LLM 通过 6 个交易函数直接下达开仓/加仓/平仓等指令
- 真实交易日志(JSONL)驱动历史回放、模式分析与自我反思
- 轻量级经验系统替代了早期的 RAG / 向量检索依赖,部署更简单
- 所有状态、日志和数据库都通过
manage.sh一键管理
适合想要验证「LLM + 交易框架」可行性的研究者与工程师。
LLM 通过 6 个核心函数完成交易生命周期:
| 函数名称 | 功能描述 | 关键字段 |
|---|---|---|
signal_entry_long |
做多开仓,指定杠杆/投入金额 | pair, leverage, stake_amount, confidence_score |
signal_entry_short |
做空开仓 | pair, leverage, trend_strength, reason |
signal_exit |
市价平仓 + 自评打分 | trade_score, reason, confidence_score |
adjust_position |
加仓/减仓 | adjustment_pct, key_support, key_resistance |
signal_hold |
有仓位时保持不动 | confidence_score, rsi_value, reason |
signal_wait |
无仓位时观望 | confidence_score, reason |
所有函数都带有严格的参数校验,确保 LLM 只能在允许的风险边界内操作。
早期的 RAG / 向量存储已经废弃。现在的学习闭环完全基于结构化日志:
LLM 决策 → 写入 llm_decisions.jsonl
平仓后 → trade_experience.jsonl + 模型自评(trade_score)
历史查询 → JSONL 扫描 + 模式分析
自我反思 → SelfReflectionEngine 输出教训/总结
奖励学习 → reward_learning.json(可选)记录分值
优点:部署轻量、不依赖额外的嵌入服务,也不会出现向量索引损坏的问题。
| 模块 | 作用 |
|---|---|
PositionTracker |
追踪持仓 MFE/MAE、信号历史 |
MarketStateComparator |
对比开仓时与当前市场状态 |
DecisionQualityChecker |
快速回放最近 50 次决策质量 |
TradeReviewer |
生成平仓后的复盘摘要 |
HistoricalQueryEngine |
直接从 JSONL 查询最近交易/统计 |
PatternAnalyzer |
统计常见成功/失败模式 |
SelfReflectionEngine |
根据入场/出场表现输出教训 |
- 多空双向、隔离保证金、动态杠杆 (1-100x)
- 自定义投入金额或
stake_amount = "unlimited" - 多次加仓/减仓(受
max_entry_position_adjustment限制) DecisionChecker对 LLM 请求做二级风控
- 主时间框架:30m
- 辅助:1h / 4h / 1d(可配置)
- 指标:EMA、RSI、MACD、ATR、ADX、MFI、OBV 等
ContextBuilder自动压缩上下文,控制 token 使用
user_data/logs/
├── freqtrade.log # Freqtrade 运行日志
├── llm_decisions.jsonl # 每次 LLM 决策完整上下文
├── trade_experience.jsonl # 平仓后总结、收益、教训
└── reward_learning.json # 奖励学习记录(可选)
所有日志都可通过 manage.sh 或 tail -f 直接查看。
ft-userdata-llm/
├── docker-compose.yml # Docker 编排
├── Dockerfile.custom # 追加 Python 依赖
├── manage.sh # 一键管理脚本
├── README.md # 当前文档
└── user_data/
├── config.json # 策略配置
├── logs/ # 日志目录
│ ├── freqtrade.log
│ ├── llm_decisions.jsonl
│ ├── trade_experience.jsonl
│ └── reward_learning.json
├── strategies/
│ ├── LLMFunctionStrategy.py
│ └── llm_modules/
│ ├── llm/ # LLM 客户端 & 工具执行器
│ ├── tools/ # Function Calling 定义
│ ├── experience/ # 日志 & 复盘模块
│ ├── learning/ # HistoricalQuery / Pattern / Reflection
│ ├── utils/ # Config/Context/Decision 工具
│ └── indicators/ # 技术指标扩展
└── tradesv3.sqlite* # 交易数据库
-
准备环境
- macOS / Linux / WSL 均可
- Docker Desktop 已启动
- 已克隆仓库并进入
ft-userdata-llm
-
赋权 & 一键启动
chmod +x manage.sh
./manage.sh start # 已启用容器会直接看日志- 完整部署(重新构建镜像)
./manage.sh deploymanage.sh菜单功能
| 序号 | 功能 | 说明 |
|---|---|---|
| 1 | 快速启动 | 检查容器 → 启动 → 跟随日志 |
| 2 | 快速重启 | docker compose restart + 日志 |
| 3 | 完整部署 | 检查镜像 → 构建 → 启动 |
| 4 | 查看容器日志 | 等价 docker logs -f freqtrade-llm |
| 5 | 查看 LLM 决策日志 | tail -f user_data/logs/llm_decisions.jsonl |
| 6 | 查看交易经验日志 | tail -f user_data/logs/trade_experience.jsonl |
| 7 | 清理日志和数据库 | 删除 JSONL / sqlite / reward 数据 |
| 8 | 检查镜像版本 | 比对 freqtrade:stable 摘要 |
| 9 | 停止服务 | docker-compose down |
命令行速查:./manage.sh decisions, ./manage.sh trades, ./manage.sh version 等。
"llm_config": {
"api_base": "http://host.docker.internal:3120",
"api_key": "sk-xxx",
"model": "qwen/qwen3-30b-a3b-thinking-2507",
"temperature": 0.6,
"max_tokens": 2000,
"timeout": 60,
"retry_times": 2
}- 推荐模型:
qwen3-30b-a3b-thinking、gpt-4.1-mini、deepseek-coder(保证 Function Calling 能力即可) - OpenAI 兼容 API:保持
/v1/chat/completions接口即可
"exchange": {
"name": "binance",
"key": "your-api-key",
"secret": "your-api-secret",
"ccxt_config": {
"enableRateLimit": true,
"options": { "defaultType": "future" }
}
}"risk_management": {
"max_leverage": 100,
"default_leverage": 10,
"max_position_pct": 50,
"max_open_trades": 4,
"allow_model_freedom": true,
"emergency_stop_loss": -0.15
}"experience_config": {
"log_decisions": true,
"log_trades": true,
"decision_log_path": "./user_data/logs/llm_decisions.jsonl",
"trade_log_path": "./user_data/logs/trade_experience.jsonl",
"max_recent_trades_context": 5,
"max_recent_decisions_context": 10,
"include_pair_specific_trades": true
}日志路径可自定义,但仍建议放在
user_data/logs/以便manage.sh统一处理。
"context_config": {
"max_context_tokens": 6000,
"indicator_history_points": 80,
"raw_kline_history_points": 80,
"include_multi_timeframe_data": false,
"multi_timeframe_history": {}
}根据大模型价格和速度,自行调整 token 配额。
LLM 在调用 signal_exit 时必须提交 trade_score 和自我反思:
signal_exit(
pair="BTC/USDT:USDT",
confidence_score=85,
rsi_value=72,
trade_score=78,
reason="""
平仓理由:RSI 超买 + 达到预期阻力位
自我反思:入场时机准确,但中途没有分批止盈,导致利润回吐。
教训:盈利>8% 时优先锁仓。
"""
)TradeLogger将决策与交易数据写入 JSONLHistoricalQueryEngine定期重载文件,支持:- 最近 N 笔交易
- 某交易对过去 30 天统计
- 胜率 / 亏损率拆解
PatternAnalyzer会统计常见成功信号、失败原因、时间段表现
SelfReflectionEngine根据盈利、持仓时长、MFE/MAE 输出总结/教训RewardLearningSystem记录reward_learning.json,用于观察累计奖励趋势(可关闭)- 所有文本会再次作为上下文提供给下一次 LLM 决策
1. 决策阶段
├─ LLM 参考市场 + 历史摘要
└─ 决策写入 llm_decisions.jsonl
2. 持仓阶段
├─ PositionTracker 更新 MFE/MAE
└─ MarketComparator 跟踪市场变化
3. 平仓阶段
├─ LLM 调用 signal_exit 并打分
├─ TradeLogger 写入 trade_experience.jsonl
├─ SelfReflectionEngine 输出教训
└─ RewardLearningSystem 更新奖励趋势
4. 下一次决策
└─ HistoricalQuery + PatternAnalyzer 提供统计提示
- 启动/重启:
./manage.sh start或./manage.sh restart - 查看日志:
- 容器:
./manage.sh logs - 决策:
./manage.sh decisions - 经验:
./manage.sh trades
- 容器:
- 导出日志:
cp user_data/logs/*.jsonl ~/backup/ - 数据库:
user_data/tradesv3.sqlite可直接用sqlite3查看 - 监控:
- Web UI: http://localhost:8086(用户名
freqtrader) - API: http://localhost:8086/api/v1/
- Web UI: http://localhost:8086(用户名
- 清理测试数据:
./manage.sh clean(会删除 JSONL + sqlite,请谨慎)
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
Strategy analysis took ... |
LLM 请求耗时过长 | 减少 pair、降低上下文数据量、调低 max_context_tokens |
trade_experience.jsonl not found |
首次运行文件未创建 | 触发一次平仓或手动 touch user_data/logs/trade_experience.jsonl |
工具实例缺少方法 signal_* |
TradingTools 未正确注册 |
重启策略或检查 LLMFunctionStrategy 是否报错 |
| LLM 请求超时 | API 不可达或延迟大 | 提高 timeout、减少 max_tokens、检查网络代理 |
| 无法查看日志 | 文件未生成或权限问题 | 使用 manage.sh decisions 自动创建并 tail |
| Docker 无法启动 | 端口或磁盘权限问题 | docker-compose down -v 后重新启动,确认 8086 端口空闲 |
如需更多调试,可进入容器:docker exec -it freqtrade-llm bash。
- ContextBuilder:组合行情、账户、形态、历史经验,拆分开仓/持仓两套系统提示词。
- FunctionExecutor:接收 LLM 返回的 JSON,匹配到
TradingTools,并把结果回写给策略。 - PositionTracker:保存最近持仓的 MFE/MAE、杠杆、信号,供反思使用。
- DecisionQualityChecker:统计最近 50 次决策的胜率、平均置信度,避免连亏。
- SelfReflectionEngine:
- 入场分析:方向、时机、关键词
- 出场分析:盈利保留、止损及时性、持仓时长
- 产出
lessons与summary
- RewardLearningSystem:
reward = profit_pct/100 * score/100 * leverage_factor- 用 deque 维护 1000 条历史,支持滚动平均
- ✂️ 移除 RAG / 向量检索依赖,改为纯 JSONL 经验系统
- 🧠 新增轻量学习闭环:HistoricalQuery、PatternAnalyzer、SelfReflectionEngine
- 🗂️ 日志结构统一:决策/交易/奖励均放在
user_data/logs - 🛠️ manage.sh 升级:新增决策/经验日志查看、镜像指纹比较、精准清理
- 📄 README 重写:同步最新功能与使用方式
- 曾引入 FAISS + RAG 管理器(现已移除)
- 保留历史记录以供参考
- 加密货币期货波动剧烈,务必在
dry_run下验证策略 - LLM 决策具有随机性,不保证盈利,需人工监控
- 建议单笔风险 ≤ 5%,杠杆建议 ≤ 10x
- 定期备份
user_data/logs/与tradesv3.sqlite - 若长期离线,请停止容器并撤掉 API 权限
- 自定义模型/提示词后务必重新回测或纸面验证
- 任何自动化策略都可能因所依赖服务故障而失效
MIT License
欢迎提交 Issue / PR:
- 修复 Bug 或补充文档
- 分享更优的提示词与风控策略
- 优化日志结构或分析脚本
社区 & 学习:
- Freqtrade Discord / Telegram
- Binance Academy(期货基础)
- Open-source AI 交易社区
祝交易顺利!🚀