无噪 logo
项目 速读教程 文档
  1. freqtrade 速读指南
  2. 市场数据获取

4. 市场数据获取

本文详细介绍了 Freqtrade 量化交易中市场数据的获取方法,包括数据下载命令的使用、支持的数据格式及其特点、时间框架的选择策略以及数据质量检查的具体方法,帮助读者建立可靠的历史数据基础,为后续的策略开发和回测提供保障。

在量化交易中,高质量的历史数据是策略开发和回测的基础。没有可靠的数据,即使最精妙的策略也可能得出错误的结论。Freqtrade 提供了完善的数据获取和管理工具,让我们能够轻松获取和验证市场数据。本章将详细介绍如何获取适合量化交易的市场数据,包括具体的命令使用、数据格式选择、时间框架考量以及数据质量检查方法。

数据下载命令

Freqtrade 提供了 freqtrade download-data 命令来获取回测和超参数优化所需的 K 线数据(OHLCV)。这个命令功能强大,支持多种参数组合,可以灵活满足不同的数据需求。

最基本的用法是直接指定交易所,此时会使用配置文件中的交易对和默认时间框架(1 分钟和 5 分钟)下载最近 30 天的数据:

freqtrade download-data --exchange binance

这个命令会从 Binance 交易所下载配置文件中指定的所有交易对数据。如果没有配置文件,或者想临时指定交易对,可以直接在命令中列出:

freqtrade download-data --exchange binance --pairs ETH/USDT XRP/USDT BTC/USDT

对于需要下载大量交易对的场景,Freqtrade 支持使用正则表达式来匹配交易对。例如,要下载所有 USDT 交易对,可以使用:

freqtrade download-data --exchange binance --pairs ".*/USDT"

这个命令会自动扩展为交易所上所有以 USDT 为计价货币的交易对。如果需要包含已下架的交易对,可以添加 --include-inactive-pairs 参数。

时间范围的指定有两种方式:相对时间和绝对时间。相对时间使用 --days 参数,例如下载最近 10 天的数据:

freqtrade download-data --exchange binance --days 10

绝对时间则使用 --timerange 参数,格式为 YYYYMMDD-YYYYMMDD。例如,下载 2023 年 1 月的数据:

freqtrade download-data --exchange binance --timerange 20230101-20230131

如果只指定开始日期(如 --timerange 20230101-),则会下载从该日期到当前的所有数据。值得注意的是,Freqtrade 会自动检测本地已有的数据,只下载缺失的部分,这大大提高了数据更新的效率。

时间框架的选择通过 --timeframes 参数实现,默认下载 1 分钟和 5 分钟数据。如果需要其他时间框架,可以这样指定:

freqtrade download-data --exchange binance --timeframes 1m 5m 15m 1h

数据默认保存在 user_data/data/<exchange> 目录下,如果需要更改保存位置,可以使用 --datadir 参数:

freqtrade download-data --exchange binance --datadir user_data/data/binance-2023

对于已经有部分数据,需要补充更早时期数据的情况,可以使用 --prepend 参数。例如,假设已经有 2023 年的数据,现在需要补充 2022 年的数据:

freqtrade download-data --exchange binance --pairs ETH/USDT BTC/USDT --prepend --timerange 20220101-20230101

这个命令会将 2022 年的数据添加到现有数据的前面,而不会覆盖已有的 2023 年数据。

数据格式

Freqtrade 支持多种数据格式存储 OHLCV 数据,每种格式都有其特点,适用于不同的场景。了解这些格式的优缺点,可以帮助我们做出合适的选择。

目前支持的主要格式有:

  • feather:基于 Apache Arrow 的二进制格式,是 Freqtrade 的默认格式
  • json:纯文本 JSON 格式,可读性好但体积大
  • jsongz:gzip 压缩的 JSON 格式,体积较小但读取速度较慢
  • parquet:列式存储格式,适合大数据量分析

默认情况下,OHLCV 数据和交易数据都使用 feather 格式存储。这可以通过 --data-format-ohlcv--data-format-trades 命令行参数更改,也可以在配置文件中设置默认格式:

// 配置文件中设置数据格式
"dataformat_ohlcv": "feather",
"dataformat_trades": "feather",

不同数据格式在文件大小和读取速度上有显著差异。根据官方测试数据,在包含 6 个交易对不同时间框架的数据集上,各格式表现如下:

格式 大小 读取时间
feather 72Mb 3.5s
json 149Mb 25.6s
jsongz 39Mb 27s
parquet 83Mb 3.8s

可以看出,feather 格式在大小和速度之间取得了很好的平衡,这也是它成为默认格式的原因。json 格式虽然可读性最好,但文件体积大且读取速度慢,适合需要手动检查数据的场景。jsongz 格式压缩率最高,但解压过程增加了读取时间。parquet 格式作为一种新兴的列式存储格式,表现也很出色,特别适合需要进行大量数据分析的场景。

如果需要转换已有的数据格式,可以使用 convert-data 命令。例如,将 json 格式转换为更高效的 feather 格式:

freqtrade convert-data --format-from json --format-to feather --datadir user_data/data/binance -t 5m 15m

添加 --erase 参数可以在转换完成后删除原始格式文件,节省磁盘空间:

freqtrade convert-data --format-from json --format-to feather --datadir user_data/data/binance -t 5m 15m --erase

同样,交易数据可以使用 convert-trade-data 命令进行格式转换:

freqtrade convert-trade-data --format-from jsongz --format-to parquet --datadir user_data/data/kraken --erase

选择合适的数据格式需要权衡存储空间、读取速度和兼容性需求。对于日常回测和策略开发,推荐使用默认的 feather 格式;如果需要与外部工具共享数据,可以考虑使用 json 格式;对于大规模数据分析,parquet 可能是更好的选择。

时间框架选择

时间框架的选择是量化交易策略开发中的关键决策之一,它直接影响策略的表现和交易频率。Freqtrade 支持多种时间框架,从 1 分钟(1m)到 1 天(1d)不等,甚至可以自定义时间框架。

不同的时间框架适用于不同类型的策略:

  • 短期时间框架(1m, 5m, 15m):适合高频交易策略,能够捕捉短期价格波动,但会产生大量交易信号,对策略的鲁棒性要求较高,交易成本也可能显著影响整体收益。
  • 中期时间框架(1h, 4h):平衡了信号数量和价格波动,是最常用的时间框架范围,适合大多数趋势跟踪和均值回归策略。
  • 长期时间框架(1d):适合波段交易和长期投资策略,信号数量较少,但每个信号的潜在收益空间较大,对交易成本不敏感。

在选择时间框架时,需要考虑以下几个因素:

  1. 策略类型:趋势跟踪策略通常在较长时间框架上表现更好,而均值回归策略可能在较短时间框架上更有效。
  2. 交易成本:高频交易策略(短时间框架)需要更低的交易成本,否则频繁交易的手续费会侵蚀利润。
  3. 市场特性:不同市场在不同时间框架上的行为可能有显著差异。例如,加密货币市场在短时间框架上可能表现出更多的噪音和波动。
  4. 计算资源:较短的时间框架意味着更多的数据点和更频繁的策略评估,需要更多的计算资源。

在 Freqtrade 中,策略通过 timeframe 属性指定所需的时间框架:

class MyStrategy(IStrategy):
    timeframe = '15m'  # 使用15分钟时间框架

需要注意的是,回测时使用的时间框架必须与已下载的数据时间框架匹配。如果策略使用 15 分钟时间框架,但只下载了 5 分钟数据,回测将无法进行。可以使用 list-data 命令查看已下载的数据:

freqtrade list-data --exchange binance

对于需要多时间框架分析的复杂策略,Freqtrade 也提供了相应的支持。可以在策略中访问不同时间框架的数据,进行更全面的市场分析。

选择时间框架后,还需要考虑数据的时间跨度。一般来说,回测需要足够长的时间跨度来确保策略在不同市场条件下的稳健性。同时,也要注意不要使用过于久远的数据,因为市场结构和特性可能已经发生变化。

一个常见的做法是使用至少 6 个月到 1 年的历史数据进行回测,同时定期更新数据以反映最新的市场状况。Freqtrade 的增量下载功能使得保持数据时效性变得非常简单,只需定期运行不带时间范围参数的 download-data 命令即可。

数据质量检查

获取数据后,进行质量检查是确保回测结果可靠的关键步骤。低质量的数据可能导致错误的策略评估,进而导致实盘交易损失。数据质量问题主要包括缺失数据、价格异常、成交量异常以及时间戳不一致等。

Freqtrade 提供了一些工具和方法来帮助检查和确保数据质量。首先,list-data 命令可以显示已下载数据的时间范围,帮助识别数据是否完整:

freqtrade list-data --show-timerange --exchange binance

这个命令会输出类似以下的结果:

Found 6 pair / timeframe combinations.
+----------+-------------+--------+---------------------+---------------------+
|     Pair |   Timeframe |   Type |                From |                  To |
|----------+-------------+--------+---------------------+---------------------|
| BTC/USDT |          5m |   spot | 2017-08-17 04:00:00 | 2023-09-13 19:25:00 |
| ETH/USDT |          1m |   spot | 2017-08-17 04:00:00 | 2023-09-13 19:26:00 |
...

通过检查每个交易对和时间框架的起始和结束时间,可以快速发现数据缺失的情况。

更深入的数据质量分析可以通过 Jupyter notebooks 进行。Freqtrade 提供了示例 notebook,位于 user_data/notebooks/ 目录下,可以帮助进行数据可视化和分析。要使用这些 notebook,首先需要初始化用户目录:

freqtrade create-userdir --userdir user_data

然后可以使用 Docker 快速启动 Jupyter lab 环境:

docker compose -f docker/docker-compose-jupyter.yml up

启动后,通过浏览器访问 https://127.0.0.1:8888/lab 即可打开 Jupyter lab 界面,开始数据分析。

在 notebook 中,可以加载数据并进行可视化检查。以下是一个简单的数据分析示例,检查数据的完整性和异常值:

import pandas as pd
import matplotlib.pyplot as plt
from freqtrade.data.history import load_pair_history

# 加载数据
pair = 'BTC/USDT'
timeframe = '1h'
dataframe = load_pair_history(datadir='user_data/data/binance',
                             pair=pair,
                             timeframe=timeframe)

# 检查数据量
print(f"数据总行数: {len(dataframe)}")
print(f"时间范围: {dataframe.index[0]} 至 {dataframe.index[-1]}")

# 检查缺失值
missing_values = dataframe.isnull().sum()
print("缺失值统计:")
print(missing_values)

# 可视化收盘价
plt.figure(figsize=(15, 7))
plt.plot(dataframe['close'])
plt.title(f'{pair} {timeframe} 收盘价')
plt.xlabel('时间')
plt.ylabel('价格')
plt.show()

# 检查成交量异常
plt.figure(figsize=(15, 7))
plt.plot(dataframe['volume'])
plt.title(f'{pair} {timeframe} 成交量')
plt.xlabel('时间')
plt.ylabel('成交量')
plt.show()

这段代码加载指定交易对和时间框架的数据,检查数据量、时间范围和缺失值,并可视化收盘价和成交量。通过观察价格和成交量的图表,可以发现潜在的异常点,如价格突然跳变或成交量异常放大/缩小。

另一个常见的数据质量问题是时间戳不一致,特别是在不同交易所的数据合并时。可以通过检查时间间隔是否均匀来发现这类问题:

# 检查时间间隔
dataframe['time_diff'] = dataframe.index.to_series().diff().dt.total_seconds()
print("时间间隔统计:")
print(dataframe['time_diff'].describe())

# 查找异常时间间隔
abnormal_intervals = dataframe[dataframe['time_diff'] != int(timeframe[:-1])*60]
print(f"异常时间间隔数量: {len(abnormal_intervals)}")
if len(abnormal_intervals) > 0:
    print(abnormal_intervals[['time_diff']].head())

这段代码计算相邻数据点之间的时间差,并检查是否符合时间框架的预期(如 1 小时数据应为 3600 秒)。异常的时间间隔可能表明数据缺失或时间戳错误。

对于发现的数据质量问题,常见的解决方法包括:

  1. 重新下载数据:对于少量缺失或异常的数据点,可以使用 Freqtrade 的增量下载功能重新下载受影响的时间段。
  2. 数据插值:对于少量缺失值,可以使用插值方法(如线性插值)填充,但需谨慎使用,避免引入偏差。
  3. 数据清洗:对于明显的异常值,可以考虑替换为合理值或删除,但需要记录这些修改,以便在回测结果中考虑。
  4. 更换数据源:如果某个交易所的数据质量持续存在问题,可以考虑从其他数据源获取数据。

数据质量检查应该成为策略开发流程中的常规步骤。在开始回测前,花时间确保数据质量,可以大大提高回测结果的可靠性,避免基于错误数据做出策略决策。

总结

市场数据的获取和管理是量化交易的基础工作,直接影响策略开发和回测的质量。本章详细介绍了 Freqtrade 的数据下载命令,包括如何指定交易对、时间范围和时间框架;讨论了不同数据格式的优缺点及转换方法;分析了时间框架选择的策略和考量因素;最后介绍了数据质量检查的重要性和具体方法。

通过掌握这些知识和工具,我们能够建立一个可靠的数据基础,为后续的策略开发、回测和优化打下坚实的基础。在实际应用中,建议定期更新数据,持续监控数据质量,并根据策略需求调整数据收集和存储策略。

高质量的数据加上稳健的策略,是量化交易成功的关键因素。在下一章中,我们将基于本章获取的高质量数据,开始开发第一个交易策略。