Skip to content

ghostGDR/quant_trading_framework

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

1. 安装依赖

首先,确保安装了所需的库:

pip install yfinance pandas numpy statsmodels matplotlib

2. 策略框架结构

我们将创建一个策略框架,允许用户定义不同的策略,并使用 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()

3. 说明

  • Strategy 类: 这是一个基类,负责获取数据和计算收益。
  • MeanReversionStrategy 类: 继承自 Strategy,实现了均值回归策略的回测。
  • MomentumStrategy 类: 继承自 Strategy,实现了动量策略的回测。
  • 数据获取: 使用 yfinance 获取指定资产的历史数据。
  • 回测: 每个策略都有自己的 backtest 方法,计算策略的累积收益。

4. 扩展

您可以根据需要扩展更多策略,只需继承 Strategy 类并实现 backtest 方法。此框架为不同的资产和策略提供了灵活的回测能力。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages