首先,确保安装了所需的库:
pip install yfinance pandas numpy statsmodels matplotlib我们将创建一个策略框架,允许用户定义不同的策略,并使用 yfinance 获取数据。以下是一个简单的实现:
import yfinance as yf
import pandas as pd
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
class Strategy:
def __init__(self, tickers, start_date, end_date):
self.tickers = tickers
self.start_date = start_date
self.end_date = end_date
self.data = self.get_data()
def get_data(self):
"""Fetch historical data from Yahoo Finance."""
data = yf.download(self.tickers, start=self.start_date, end=self.end_date)
return data['Close']
def calculate_returns(self):
"""Calculate daily returns."""
returns = self.data.pct_change().dropna()
return returns
def backtest(self):
"""Run the backtest for the defined strategy."""
raise NotImplementedError("Backtest method not implemented.")
class MeanReversionStrategy(Strategy):
def __init__(self, tickers, start_date, end_date, lookback=20, entry_zscore=1):
super().__init__(tickers, start_date, end_date)
self.lookback = lookback
self.entry_zscore = entry_zscore
def backtest(self):
returns = self.calculate_returns()
signals = (returns.rolling(self.lookback).mean() - returns) / returns.rolling(self.lookback).std()
long_positions = signals < -self.entry_zscore
short_positions = signals > self.entry_zscore
positions = pd.DataFrame(index=returns.index, columns=returns.columns).fillna(0)
positions[long_positions] = 1
positions[short_positions] = -1
daily_returns = (positions.shift() * returns).sum(axis=1)
cumulative_returns = (1 + daily_returns).cumprod() - 1
return cumulative_returns
class MomentumStrategy(Strategy):
def __init__(self, tickers, start_date, end_date, lookback=20):
super().__init__(tickers, start_date, end_date)
self.lookback = lookback
def backtest(self):
returns = self.calculate_returns()
signals = returns.rolling(self.lookback).mean()
positions = pd.DataFrame(index=returns.index, columns=returns.columns).fillna(0)
positions[signals > 0] = 1 # Long positions
daily_returns = (positions.shift() * returns).sum(axis=1)
cumulative_returns = (1 + daily_returns).cumprod() - 1
return cumulative_returns
# Example usage
if __name__ == "__main__":
tickers = ['AAPL', 'MSFT', 'GOOGL'] # Example tickers
start_date = '2020-01-01'
end_date = '2023-01-01'
# Mean Reversion Strategy
mean_reversion = MeanReversionStrategy(tickers, start_date, end_date)
mean_reversion_returns = mean_reversion.backtest()
# Momentum Strategy
momentum = MomentumStrategy(tickers, start_date, end_date)
momentum_returns = momentum.backtest()
# Plotting results
plt.figure(figsize=(12, 6))
plt.plot(mean_reversion_returns, label='Mean Reversion Strategy')
plt.plot(momentum_returns, label='Momentum Strategy')
plt.title('Strategy Backtest Results')
plt.xlabel('Date')
plt.ylabel('Cumulative Returns')
plt.legend()
plt.show()- Strategy 类: 这是一个基类,负责获取数据和计算收益。
- MeanReversionStrategy 类: 继承自
Strategy,实现了均值回归策略的回测。 - MomentumStrategy 类: 继承自
Strategy,实现了动量策略的回测。 - 数据获取: 使用
yfinance获取指定资产的历史数据。 - 回测: 每个策略都有自己的
backtest方法,计算策略的累积收益。
您可以根据需要扩展更多策略,只需继承 Strategy 类并实现 backtest 方法。此框架为不同的资产和策略提供了灵活的回测能力。