Freqtrade FreqAI 数据转换 5 步入门:如何把原始 K 线变成 PyTorch 模型输入
【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade
这份教程带你用 Freqtrade 的 FreqAI 模块完成 AI 交易的数据转换全流程:从原始 K 线清洗、特征工程、滑动窗口切分训练集,到最终生成 PyTorch 张量并喂给深度学习模型。跟着 5 个步骤走,你不需要手写任何数据预处理代码,一次跑通第一个 AI 回测。
第一次写 AI 策略时,数据总不听话
你是不是也遇到过这种情况:K 线里前几十根全是 NaN,特征列里混着无穷大,训练集和测试集一划分就"泄露"了未来价格,模型回测收益漂亮得像画出来的——实盘却完全不复现。
这些坑本质上都是数据管道的问题。FreqAI(Freqtrade 内置的机器学习模块)把清洗、特征识别、时间切分、张量转换全部封装好了,你只负责定义"哪些列是特征、哪列是要预测的目标",剩下的交给它。读完这篇,你能省掉至少几个小时的手写预处理工作,并直接拿到一个可运行的 PyTorch 模型回测。
FreqAI 数据管道能帮你做什么
| 能力 | 说明 | 你得到的结果 |
|---|---|---|
| 特征/标签自动识别 | 以%开头的列自动当特征,&开头自动当标签 | 不用手动维护特征列表 |
| 数据清洗 | 自动处理 NaN 与无穷大,训练模式直接丢弃坏行 | 干净的训练矩阵 |
| 滑动窗口切分 | 按"训练 N 天→回测 M 天"滚动推进,绝不跨窗口 | 无未来数据泄露的回测 |
| 预处理管道 | 基于 datasieve 的 Pipeline,可接缩放、PCA、异常值移除 | 特征尺度统一 |
| PyTorch 张量转换 | DataFrame 一键转torch.float32张量,支持窗口数据集 | 直接喂给 MLP/LSTM/Transformer |
准备工作:环境与依赖
先装好项目并准备 FreqAI + PyTorch 依赖,整个过程在终端里敲三条命令:
git clone https://gitcode.com/GitHub_Trending/fr/freqtrade cd freqtrade ./setup.sh -r requirements-freqai.txt # 基础依赖 + FreqAI 依赖 pip install torch # PyTorch 深度学习框架前置条件只有三个:Python 3.9+、已安装 TA-Lib(setup.sh会提示)、一台有 8GB 内存的机器。如果只想用 LightGBM 等树模型验证流程,torch可以最后再装,先跑通再升级,能少踩一半的坑。
配置文件可以直接从示例改起,这份示例就是 FreqAI 的完整模板:
{ "freqai": { "enabled": true, "train_period_days": 15, "backtest_period_days": 7, "data_split_parameters": { "test_size": 0.33, "random_state": 1 } } }这段在干什么:打开 FreqAI 开关,并声明"每 15 天训一次模型,之后 7 天用来验证"。
核心流程:5 步从原始 K 线到模型训练
第 1 步:创建 AI 策略并定义特征
新建策略时别从零写,直接基于官方示例改,它演示了全部约定:templates/FreqaiExampleStrategy.py。
关键就两点:特征列名前加%,标签列名前加&,FreqAI 靠这个命名约定自动识别:
def feature_engineering_expand_all(self, dataframe, period, metadata, **kwargs): # 一行代码,FreqAI 会自动把它展开到多个周期上 dataframe["%-rsi-period"] = ta.RSI(dataframe, timeperiod=period) dataframe["%-roc-period"] = ta.ROC(dataframe, timeperiod=period) return dataframe def set_freqai_targets(self, dataframe, metadata): # 标签:告诉模型"预测未来 20 根 K 线的收益率" label_period = self.dp.get_label_period() dataframe["&-s_close"] = dataframe["close"].shift(-label_period) return dataframe注意shift(-label_period):标签是"未来的值",回测时它不会提前出现在训练数据里,这正是避免未来泄露的关键设计。
第 2 步:下载足够长的历史数据
这是新手最常翻车的一步。回测起点之前必须多下train_period_days+startup_candle_count的数据,否则第一个训练窗口根本凑不满。
freqtrade download-data --pairs BTC/USDT ETH/USDT \ --timeframe 5m --timerange 20240101-20240401这段在干什么:按 5 分钟周期下载 3 个月数据。假设train_period_days是 15,回测从 20240201 开始,你就得保证 20240116 之前的数据也存在——上面的下载区间已经覆盖了。更精确的换算方法见 docs/freqai-running.md。
第 3 步:运行回测,观察数据管道工作
freqtrade backtesting --strategy FreqaiExampleStrategy \ --strategy-path freqtrade/templates \ --config config_examples/config_freqai.example.json \ --freqaimodel LightGBMRegressor --timerange 20240201-20240301这段在干什么:跑一次完整回测。日志里你会看到滑动窗口一个接一个地推进,每个窗口内 FreqAI 自动完成:拉取数据 → 过滤坏行 → 提取%特征 → 按test_size切训练/验证 → 训练模型 → 在窗口尾部预测。回测结束后,模型文件会存进models_freqai/目录。
第 4 步:切换到 PyTorch 模型
想上深度学习?只需把--freqaimodel换成 PyTorch 模型,比如 MLP 回归器 freqai/prediction_models/PyTorchMLPRegressor.py:
freqtrade backtesting --freqaimodel PyTorchMLPRegressor \ --strategy MyFreqaiStrat --strategy-path user_data/strategies ...训练超参在配置文件的model_training_parameters里给,不用改代码:
"model_training_parameters": { "learning_rate": 3e-4, "trainer_kwargs": { "n_steps": 5000, "batch_size": 64 }, "model_kwargs": { "hidden_dim": 512, "n_layer": 1 } }第 5 步:确认张量转换已生效
模型内部的数据流长这样:DataKitchen 交出的train_featuresDataFrame,先经过 datasieve 管道标准化,再由DefaultPyTorchDataConvertor转成float32张量并送进 GPU:
# 源码位置:freqtrade/freqai/torch/PyTorchDataConvertor.py x = torch.tensor(df.values, device="cuda", dtype=torch.float32)如果你要写时序模型(LSTM/Transformer),项目自带WindowDataset(freqtrade/freqai/torch/datasets.py),把 K 线序列按window_size切成"窗口特征 → 单点标签"的样本对,形状直接满足(批次, 时间步, 特征数)的时序模型输入要求。
关键参数与调优
这些是数据行为最敏感的旋钮,都藏在配置的freqai段里:
| 参数 | 默认值(示例配置) | 调大 / 调小的影响 |
|---|---|---|
train_period_days | 15 | 训练窗口越长模型越稳,但重训越慢 |
backtest_period_days | 7 | 决定"多久用新模型重验一次" |
data_split_parameters.test_size | 0.33 | 验证集比例,调大会吃掉训练样本 |
label_period_candles | 20 | 预测多远的未来;调大后信号更钝 |
include_timeframes | 3m/15m/1h | 引入多时间框架特征,数量会乘法级膨胀 |
DI_threshold/weight_factor | 0.9 / 0.9 | 前者剔除剧烈异常时段,后者让近期数据权重更高 |
data_kitchen_thread_count | CPU 核数×2−2 | 数据处理并行度,机器吃紧时手动调小 |
一个实用组合:新手先关掉 PCA("principal_component_analysis": false)和异常值移除,用最简单的管道跑通;确认流程后再按需开启,出问题才好在日志里定位是数据还是模型。
常见坑与最快排错法
现象:日志提示"未找到特征"或模型输入是 0 维→ 原因:特征列名漏了%前缀,或标签漏了&。 → 解法:回策略里检查feature_engineering_*和set_freqai_targets两个函数,命名约定一个字母都不能少。
现象:训练样本被大量丢弃,日志里 NaN 比例偏高→ 原因:startup_candle_count不够,指标计算的前几十根 K 线全是空值。 → 解法:把策略里的startup_candle_count提到最大指标周期之上(示例里是 40,用长周期布林带就应更高),同时确认下载数据覆盖了这段前置期。
现象:回测一开始就报数据不足,或第一个窗口没训出模型→ 原因:回测起点之前没下载train_period_days的额外数据。 → 解法:按回测起点 − train_period_days − startup_candle_count往前补数据,文档 docs/freqai-running.md 里有逐步换算的例子。
现象:PyTorch 训练时报张量形状不匹配→ 原因:分类任务标签必须是torch.long,回归任务是float,两者弄反了。 → 解法:看DefaultPyTorchDataConvertor的target_tensor_type参数(freqtrade/freqai/torch/PyTorchDataConvertor.py),按任务类型选对 dtype。
进阶与延伸方向
流程跑通后,这几条路值得走:
- 特征重要性分析:配置里
"plot_feature_importances": 20,训练后自动输出 Top20 特征图,快速淘汰无效指标。 - 训练过程可视化:接上 TensorBoard(
tb_logger在训练器里已内置),损失曲线实时可查。 - 时序深度模型:用
WindowDataset+ 自定义模型类(参考 freqtrade/freqai/prediction_models/ 里的 PyTorch 变体)写自己的 LSTM/Transformer 回归器。 - 强化学习:FreqAI 的 RL 模块支持 3~5 个离散动作环境,目录在 freqtrade/freqai/RL/。
- 异常值处理:默认用 SVM 移除离群点,换成 DBSCAN 的思路见 docs/assets/freqai_dbscan.jpg 对应的文档说明。
资源汇总
| 类型 | 位置 |
|---|---|
| FreqAI 总览 | docs/freqai.md |
特征工程指南(%/&约定详解) | docs/freqai-feature-engineering.md |
| 配置说明 | docs/freqai-configuration.md |
| 运行与数据量换算 | docs/freqai-running.md |
| 全部参数速查表 | docs/freqai-parameter-table.md |
| 示例策略 | freqtrade/templates/FreqaiExampleStrategy.py |
| 数据厨房源码 | freqtrade/freqai/data_kitchen.py |
| PyTorch 数据转换 | freqtrade/freqai/torch/ |
| 示例配置 | config_examples/config_freqai.example.json |
【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考