Skip to content

使用 Python 和 Pandas 构建统计套利机器人

在本节中,我们将使用 Python 和 Pandas 库构建一个简单的统计套利机器人。该机器人将使用历史数据来识别币之间的mispricing,并执行交易操作。

所需库

  • Python 3.x
  • Pandas
  • NumPy
  • Matplotlib (optional)
  • CCXT (optional)

数据准备

首先,我们需要获取历史币数据。我们可以使用 CCXT 库来获取数据。

python
import pandas as pd
import ccxt

# 创建 CCXT 对象
exchange = ccxt.binance()

# 获取币数据
btc_data = exchange.fetch_ohlcv('BTC/USDT', timeframe='1d', since=1500000000)
eth_data = exchange.fetch_ohlcv('ETH/USDT', timeframe='1d', since=1500000000)

# 转换数据为 Pandas 数据帧
btc_df = pd.DataFrame(btc_data, columns=['date', 'open', 'high', 'low', 'close', 'volume'])
eth_df = pd.DataFrame(eth_data, columns=['date', 'open', 'high', 'low', 'close', 'volume'])

# 合并数据
data = pd.concat([btc_df, eth_df], axis=1)
data.columns = ['BTC_Open', 'BTC_High', 'BTC_Low', 'BTC_Close', 'BTC_Volume',
                'ETH_Open', 'ETH_High', 'ETH_Low', 'ETH_Close', 'ETH_Volume']

数据处理

接下来,我们需要处理数据以便于分析。我们将计算币之间的相关系数和价差。

python
# 计算相关系数
corr_coef = data['BTC_Close'].rolling(window=20).corr(data['ETH_Close'])

# 计算价差
spread = data['BTC_Close'] - data['ETH_Close']

交易策略

现在,我们可以定义交易策略。我们将使用简单的均值回归策略,即当价差超过一定阈值时,执行交易操作。

python
# 定义阈值
threshold = 2

# 生成交易信号
signals = np.where(spread > threshold, 1, 0)

# 执行交易操作
positions = np.where(signals == 1, 1, -1)

性能评估

最后,我们可以评估机器人的性能。我们将使用回测来评估机器人的表现。

python
# 回测
backtest = zipline.run_algorithm(start='2010-01-01', end='2020-12-31', 
                                 capital_base=10000, 
                                 data_frequency='daily', 
                                 positions=positions)

# 评估性能
print(backtest.stats)

完整代码

python
import pandas as pd
import ccxt
import numpy as np
import matplotlib.pyplot as plt
from zipline.algorithm import TradingEnvironment
from zipline.api import order, symbol

# 创建 CCXT 对象
exchange = ccxt.binance()

# 获取币数据
btc_data = exchange.fetch_ohlcv('BTC/USDT', timeframe='1d', since=1500000000)
eth_data = exchange.fetch_ohlcv('ETH/USDT', timeframe='1d', since=1500000000)

# 转换数据为 Pandas 数据帧
btc_df = pd.DataFrame(btc_data, columns=['date', 'open', 'high', 'low', 'close', 'volume'])
eth_df = pd.DataFrame(eth_data, columns=['date', 'open', 'high', 'low', 'close', 'volume'])

# 合并数据
data = pd.concat([btc_df, eth_df], axis=1)
data.columns = ['BTC_Open', 'BTC_High', 'BTC_Low', 'BTC_Close', 'BTC_Volume',
                'ETH_Open', 'ETH_High', 'ETH_Low', 'ETH_Close', 'ETH_Volume']

# 计算相关系数
corr_coef = data['BTC_Close'].rolling(window=20).corr(data['ETH_Close'])

# 计算价差
spread = data['BTC_Close'] - data['ETH_Close']

# 定义阈值
threshold = 2

# 生成交易信号
signals = np.where(spread > threshold, 1, 0)

# 执行交易操作
positions = np.where(signals == 1, 1, -1)

# 回测
backtest = zipline.run_algorithm(start='2010-01-01', end='2020-12-31', 
                                 capital_base=10000, 
                                 data_frequency='daily', 
                                 positions=positions)

# 评估性能
print(backtest.stats)

# 可视化结果
plt.plot(backtest.stats['cumulative_returns'])
plt.show()

请注意,这只是一个简单的示例代码,实际上还需要考虑许多其他因素,例如风险管理、交易成本、市场情绪等。