大家好,我是橙哥!今天我们来聊一聊Freqtrade,Freqtrade是一个开源的加密货币量化交易机器人,用Python编写。它支持主流的交易所,可以通过Telegram或网页界面来控制,还提供回测、图表和资金管理工具,并可以通过机器学习来优化交易策略。
下面我们来了解一下freqtrade的工作原理,看看如何使用命令行工具下载历史数据,创建新的配置文件和新的策略;如何使用Python和Pandas编写策略:我们将定义一个简单的移动平均策略,在以太坊(ETH)和比特币(BTC)之间进行交易,来增加持有的比特币数量。我们可以用freqtrade进行以下操作:
开发策略: 轻松使用 Python 和 pandas 开发策略。我们将在下面创建一个简单的策略,freqtrade 有一些示例策略仓库。
下载市场数据: 快速下载你选择的加密货币的历史价格数据。
回测: 查看你的策略在现实世界中是否有盈利机会。
优化: 使用 hyperopt 为你的策略找到最佳参数。
选择交易对: 你的选择可以是静态的或基于简单过滤器的动态选择,例如交易量大于某个数量。
模拟运行: 使用模拟钱包在实时数据上测试策略。
实时运行: 通过加密货币交易所的 API 使用真实资金部署策略。
使用 Telegram 机器人: 通过 Telegram 控制和监控你的策略。
分析和可视化交易历史: 利用保存文件或 SQL 数据库中的交易数据。
Freqtrade 的安装
让我们从安装开始,Docker 是所有安装方法中最便捷的方式。你需要先安装 Docker 和 docker-compose,然后通过启动 Docker Desktop 确保 Docker 正在运行。现在可以通过在你想要的目录中发出以下命令来设置 freqtrade:
现在应该会有以下目录结构:
要验证 freqtrade 是否已正确安装并准备好使用,请运行帮助命令:
你会看到以下输出:
帮助命令的输出列出了所有可用的freqtrade命令。在这一部分,我们将探讨最重要的命令及其使用方法。首先是回测。
回测:freqtrade测试交易策略的方法
在下面,我们将创建一个简单的策略并在历史数据上进行回测。通过历史数据测试策略,模拟策略预期的交易行为。虽然这不能保证在实盘中的表现,但它是一个获胜/亏损策略的参考。
Freqtrade通过以下步骤进行策略回测:
为配置文件中提供的货币对(如ETH/BTC、ADA/BTC、XRP/BTC等)加载历史数据;
调用策略的bot_loop_start()函数一次。这在实时运行中启动一个新循环,而在回测中只需要一次;
调用populate_indicators()方法计算每个货币对的技术指标;
调用populate_buy_trend()和populate_sell_trend()方法计算每个货币对的买卖信号;
如果策略实现了,通过调用confirm_trade_entry()和confirm_trade_exit()方法确认买卖交易;
遍历每个时间段(如5分钟、1小时、1天等),模拟入场和出场点;
生成回测报告,汇总所有交易及其在指定期间的盈亏情况。
下载数据
要进行回测,我们需要从交易所获取历史价格数据。让我们使用以下命令从Binance下载一些数据:
该命令的参数告诉freqtrade以下内容:
-p ETH/BTC - 下载以太坊(ETH)-比特币(BTC)对的数据-t 1d - 下载时间周期为1天的数据--timerange 20200101-20201231 - 下载2020年1月1日至12月31日的数据--exchange binance - 从Binance下载数据。在这里,您可以使用freqtrade支持的任何交易所
此命令生成了以下文件:
其中包含多个开盘-最高-最低-收盘-成交量(OHLCV)数据记录,如下:
列的含义如下:
时间:Unix 时间戳(毫秒)开盘价:蜡烛图开盘价最高价:蜡烛图最高价最低价:蜡烛图最低价收盘价:蜡烛图收盘价成交量:交易量,以基础货币显示,本例中为 ETH。BTC 为报价货币。这些数据可以整齐地显示在以下蜡烛图表中:
如何解读上面的图表上面的图表使用蜡烛图来表示比简单线条更多的信息。你可以在下面的图片中快速了解蜡烛图的含义。
从上一节中的OHLCV行示例,你可以看到每个蜡烛图代表每行数据的开盘、最高、最低、收盘部分。
现在我们已经看到了数据的示例并理解了每行的含义,让我们继续配置freqtrade以运行策略。
Freqtrade配置
我们已经有了回测策略所需的数据,但我们还需要创建一个配置文件,这将使我们能够轻松控制策略的几个参数。
要创建新的配置,我们运行以下命令:
你会看到一些初始问题,回答如下:
下面,我们需要打开配置文件并设置 pair_whitelist = ["ETH/BTC"],这将设定我们关注的货币对。然后我们就可以开始了。
实现一个简单的自定义策略 - 移动平均交叉
这个交易策略其实非常简单,我们只需要做对两件事:
低价买入高价卖出
真的这么简单吗?有什么需要注意的吗?难点在于准确找到实际的低点和高点。移动平均策略背后的想法如下:
你有两条线:慢速移动平均线(SMA):长期平均值,代表一般趋势。快速移动平均线(FMA):短期平均值,代表当前趋势。
对于我们的策略,我们将使用以下指标:
当FMA上穿SMA时买入,表示上升趋势。当FMA下穿SMA时卖出,表示下降趋势。
这就是所谓的移动平均交叉策略。
freqtrade 的策略实现
让我们使用 pandas 实现 freqtrade 中的移动平均交叉策略。
首先,我们需要创建一个新的策略文件,该文件将包含我们买卖信号背后的逻辑。
现在,我们可以在策略文件夹中找到新创建的文件:
SimpleMA_strategy.py
包含一个自动生成的类 SimpleMA_strategy 和几个我们需要更新的函数。
为了定义我们的简单策略,我们需要更新以下三个函数:
populate_indicators()populate_buy_trend()populate_sell_trend()让我们逐一了解这些函数。
在这里,我们计算策略所需的指标,以生成买卖信号。
根据我们的策略,我们计算快线fast_MA(基于最近5根K线图)和慢线slow_ma(基于前50根K线图):
2. populate_buy_trend() 此函数生成我们的买入信号,当快速移动平均线(fast_MA)上穿慢速移动平均线(slow_MA)时触发。
我们可以通过更新 populate_buy_trend() 来加入以下逻辑,以完成这个任务:
使用qtpylib,我们可以轻松找到均线交叉点。本质上,上面的代码在满足买入条件(crossed_above)时,将买入列设置为1。
根据我们的策略,当fast_MA线低于slow_MA线时的代码如下。
我们现在使用crossed_below——与crossed_above相反的信号——当我们的卖出条件被触发时,它会在卖出列中标记为1。
默认情况下,生成的freqtrade策略文件包含更多选项,例如ROI(投资回报率)和止损,后面我们再讨论,现在将暂时禁用它们。
既然我们已经制定了一个策略,我们可以测试它在过去数据上的表现。
回测策略 定义了我们的简单策略后,现在我们想使用历史数据对其进行评估,通过回测,我们可以在过去模拟交易,以评估其表现。
回测并不能完全反映策略在实际市场中的表现,因为在实时市场中,其他因素会影响回报,例如滑点。
要使用freqtrade进行回测,我们可以运行以下命令,利用我们刚刚创建的类和函数:
命令参数如下所示:
-p ETH/BTC - 交易 ETH/BTC 对,用我们的 BTC 换取 ETH--timerange 20200101-20201231 - 回测 2020 年的数据,从 2020 年 1 月 1 日到 2020 年 12 月 31 日。c ./user_data/config-learndatasci.json 使用的是本文前面定义的配置文件。--starting-balance 1 初始余额为 1 BTC。
我们获得了一份完整的报告,其中包含在指定期间内所有交易的成果。
Freqtrade将报告分为四个部分:
每日交易次数 - 每天平均完成的交易数量。我通常寻找每天大约进行十笔交易的策略。
总利润百分比 - 以初始余额的百分比表示的利润。
最大回撤 - 最大连续亏损的金额
市场变动 - 在指定期间内市场增长/缩减的幅度。当交易多个币对时,此指标是所有币对从指定期间开始到结束的市场变动的平均值。在我们的例子中,ETH/BTC市场增长了24.93%。在不同的市场条件下测试策略至关重要,而不仅仅是在上涨市场中。
我们可以看到只发生了六笔交易。这些交易产生了5.09%的利润,初始为1 BTC,最终为1.05086506 BTC。
考虑到涉及的风险,这一结果并不令人印象深刻。然而,这个策略非常简单,有很大的改进空间:
与买入并持有相比 仅仅持有ETH,即在测试期开始时将我们的全部BTC转换为ETH,我们将获得24.93%的收益(市场变动指标),但这并不是我们通常可以预期的。我们每次交易只投入了10%的仓位,而不是全部。在不同的条件下测试我们的策略非常重要——不仅在市场上涨时,也在市场下跌时。
交易更多币对:我们只考虑了以太坊,这是我们可以交易的数百种币之一。这种限制只允许一次进行一笔交易,这显然不是最优的。
使用更高级的策略:我们使用了可以说是其中最简单的策略之一,仅使用简单移动平均线作为指标。增加复杂性并不一定意味着更好的性能,但我们可以对许多指标组合进行回测,以找到最佳策略。
参数优化:目前,我们尚未尝试优化任何超参数,例如移动平均周期、回报率和止损。
更短的时间周期:我们只考虑了每日蜡烛图,这也是为什么机器人每天只找到大约0.02笔交易,远少于人工交易。机器人通过更频繁的交易和查看更详细的蜡烛图,有可能获得更多利润。
绘制结果 要使用freqtrade的绘图命令,我们需要修改docker-compose.yml文件。我们唯一需要做的就是注释掉一行并取消注释另一行。请查看示例:
这会指示 docker-compose 拉取包含正确绘图库的 freqtrade Docker 镜像。
现在可以使用 freqtrade plot-dataframe 命令来可视化数据、指标以及买卖信号。
--indicators1 选项定义了我们想要绘制的指标,即 fast_MA 和 slow_MA。这些指标必须在 -s 选项指定的策略内定义。
默认情况下,这会在 plot 目录中创建一个可用的 plotly html 文件:./user_data/plot/freqtrade-plot-ETH_BTC-1d.html
在图表上,可以观察机器人如何按照我们定义的简单移动平均策略执行操作:
要了解更多plot-dataframe的功能,请运行docker-compose run --rm freqtrade plot-dataframe -h或访问相关文档。
总结
在本文中,我们只是看到了freqtrade可以做的一小部分:
后面我们将了解更多freqtrade的高级用法,我们将添加更多交易对,讨论投资回报率(ROI)和止损,并正确地定义它们。使用hyperopt优化我们的策略,部署一个实时交易机器人,以及讨论更多高级改进方法。
原文链接: