专栏名称: Python中文社区
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
Python开发者  ·  谢尔盖布林:谷歌不敢用Transformer ... ·  6 天前  
Python中文社区  ·  用OpenAI最新 “o1” 模型开发量化交易策略 ·  4 天前  
Python爱好者社区  ·  吴恩达,yyds!! ·  1 周前  
Python中文社区  ·  抵御市场波动!用 Python 实现对冲策略 ·  1 周前  
Python开发者  ·  PyTorch官宣:告别CUDA ! ·  1 周前  
51好读  ›  专栏  ›  Python中文社区

用Python打造加密货币算法交易机器人

Python中文社区  · 公众号  · Python  · 2024-09-13 09:46

正文

大家好,我是橙哥!今天我们来聊一聊Freqtrade,Freqtrade是一个开源的加密货币量化交易机器人,用Python编写。它支持主流的交易所,可以通过Telegram或网页界面来控制,还提供回测、图表和资金管理工具,并可以通过机器学习来优化交易策略。同时在明天9月14日晚上,我会在腾讯会议内部进行Freqtrade加密货币量化机器人的相关直播,请在文末预约
下面我们来了解一下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()
让我们逐一了解这些函数。

  1. 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。

  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将报告分为四个部分:

  1. 回测结果报告:本部分显示每个币对的性能报告,在我们的例子中,只有ETH/BTC。列“平均利润%”显示所有交易产生的平均利润,而列“累计利润%”汇总了所有利润/亏损。列“总利润百分比”则显示相对于初始余额的总利润百分比。

  2. 卖出原因分析:该报告向我们展示了卖出原因的性能。根据我们的策略,我们只使用了卖出信号,所以我们只有一行。通常,我们还可以因其他原因卖出,例如接受的回报率(ROI)和止损。我们将在系列的下篇文章中看到这一点。

  3. 未平仓交易分析:该报告部分显示在回测结束时未平仓的任何交易。在我们的例子中,我们没有任何未平仓交易,通常这并不非常重要,因为它代表了回测的结束状态。

  4. 总结指标:就我个人而言,这是我通常首先查看的区域。最需要指出的部分如下:


每日交易次数 - 每天平均完成的交易数量。我通常寻找每天大约进行十笔交易的策略。

总利润百分比 - 以初始余额的百分比表示的利润。

最大回撤 - 最大连续亏损的金额

市场变动 - 在指定期间内市场增长/缩减的幅度。当交易多个币对时,此指标是所有币对从指定期间开始到结束的市场变动的平均值。在我们的例子中,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优化我们的策略,部署一个实时交易机器人,以及讨论更多高级改进方法。

我将在9月14日(周六晚上)宽客邦量化俱乐部内部腾讯会议直播间进行用Freqtrade打造加密货币算法交易机器人专题讲解,欢迎参加:

点击阅读原文,加入「宽客邦量化俱乐部