用Python打造加密货币算法交易机器人 原创
大家好,我是橙哥!今天我们来聊一聊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()
让我们逐一了解这些函数。
- populate_indicators()
在这里,我们计算策略所需的指标,以生成买卖信号。
根据我们的策略,我们计算快线fast_MA(基于最近5根K线图)和慢线slow_ma(基于前50根K线图):
2. populate_buy_trend()
此函数生成我们的买入信号,当快速移动平均线(fast_MA)上穿慢速移动平均线(slow_MA)时触发。
我们可以通过更新 populate_buy_trend() 来加入以下逻辑,以完成这个任务:
使用qtpylib,我们可以轻松找到均线交叉点。本质上,上面的代码在满足买入条件(crossed_above)时,将买入列设置为1。
- populate_sell_trend()
与前一个函数类似,此函数生成我们的卖出信号。
根据我们的策略,当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。列“平均利润%”显示所有交易产生的平均利润,而列“累计利润%”汇总了所有利润/亏损。列“总利润百分比”则显示相对于初始余额的总利润百分比。
- 卖出原因分析:该报告向我们展示了卖出原因的性能。根据我们的策略,我们只使用了卖出信号,所以我们只有一行。通常,我们还可以因其他原因卖出,例如接受的回报率(ROI)和止损。我们将在系列的下篇文章中看到这一点。
- 未平仓交易分析:该报告部分显示在回测结束时未平仓的任何交易。在我们的例子中,我们没有任何未平仓交易,通常这并不非常重要,因为它代表了回测的结束状态。
- 总结指标:就我个人而言,这是我通常首先查看的区域。最需要指出的部分如下:
每日交易次数 - 每天平均完成的交易数量。我通常寻找每天大约进行十笔交易的策略。
总利润百分比 - 以初始余额的百分比表示的利润。
最大回撤 - 最大连续亏损的金额
市场变动 - 在指定期间内市场增长/缩减的幅度。当交易多个币对时,此指标是所有币对从指定期间开始到结束的市场变动的平均值。在我们的例子中,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
在图表上,可以观察机器人如何按照我们定义的简单移动平均策略执行操作:
- 当fast_MA上穿slow_MA时买入。
- 当fast_MA下穿slow_MA时卖出。
要了解更多plot-dataframe的功能,请运行docker-compose run --rm freqtrade plot-dataframe -h或访问相关文档。
总结
在本文中,我们只是看到了freqtrade可以做的一小部分:
- 使用pandas定义自定义策略。
- 使用历史数据进行回测并生成相关报告。
- 使用plotly绘制结果并可视化模拟交易。
后面我们将了解更多freqtrade的高级用法,我们将添加更多交易对,讨论投资回报率(ROI)和止损,并正确地定义它们。使用hyperopt优化我们的策略,部署一个实时交易机器人,以及讨论更多高级改进方法。
本文转载自公众号开发者阿橙 ,作者:橙哥