Chcesz przetestować strategię inwestycyjną w Pythonie? Oto jak to zrobić krok po kroku.
W artykule znajdziesz:
- Wyjaśnienie inwestowania wieloczynnikowego (value, momentum, quality, zmienność).
- Narzędzia w Pythonie, takie jak
pandas
,numpy
,backtrader
,yfinance
. - Przykłady kodów obliczających wskaźniki finansowe i tworzących portfel.
- Instrukcję konfiguracji środowiska (instalacja bibliotek, struktura projektu).
- Metody optymalizacji i analizy wyników strategii.
Kluczowe punkty:
- Czynniki inwestycyjne: Value (np. P/E), Momentum, Quality (np. ROE), Zmienność.
- Narzędzia:
pandas
,numpy
,backtrader
,yfinance
,TA-Lib
. - Kod strategii: Obliczanie wskaźników, punktacja czynników, reguły portfela.
- Backtesting: Testowanie strategii na danych historycznych, analiza wyników (CAGR, Sharpe Ratio).
- Zaawansowane techniki: Optymalizacja wag, analiza kosztów transakcyjnych, testy wielookresowe.
Szybkie porównanie narzędzi:
Narzędzie | Funkcja | Przykład użycia |
---|---|---|
pandas |
Analiza danych | Manipulacja szeregami czasowymi |
numpy |
Obliczenia numeryczne | Operacje na macierzach |
backtrader |
Framework do backtestingu | Testowanie strategii |
yfinance |
Pobieranie danych | Dane historyczne |
TA-Lib |
Wskaźniki analizy technicznej | Obliczenia wskaźników |
Dzięki tym narzędziom możesz efektywnie tworzyć i testować strategie wieloczynnikowe.
Backtesting.py – Full course in python
Python Setup Guide
Aby rozpocząć proces backtestingu, najpierw przygotuj środowisko Pythona.
Wymagana instalacja oprogramowania
Poniżej znajdziesz listę niezbędnych komponentów do konfiguracji środowiska:
Komponent | Wersja minimalna | Opis |
---|---|---|
Python | 3.8+ | Podstawowe środowisko programistyczne |
pandas | 1.3.0+ | Analiza danych finansowych |
numpy | 1.20.0+ | Operacje matematyczne i numeryczne |
TA-Lib | 0.4.24+ | Wskaźniki analizy technicznej |
backtrader | 1.9.76+ | Narzędzie do backtestingu |
Najpierw pobierz Python ze strony python.org, a następnie zainstaluj wymagane biblioteki za pomocą pip:
pip install pandas numpy backtrader yfinance
Instalacja TA-Lib na Windows
Dla użytkowników systemu Windows instalacja TA-Lib wymaga dodatkowego kroku:
- Pobierz skompilowaną wersję pliku
.whl
ze strony https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib. - Zainstaluj plik za pomocą poniższej komendy:
pip install TA_Lib‑0.4.24‑cp38‑cp38‑win_amd64.whl
Po zakończeniu instalacji wszystkich wymaganych bibliotek możesz przejść do konfiguracji środowiska programistycznego.
Konfiguracja środowiska programistycznego
Wybierz odpowiednie środowisko IDE w zależności od swoich potrzeb:
IDE | Mocne strony | Zastosowanie |
---|---|---|
PyCharm | Debugowanie i zaawansowane funkcje | Rozbudowane projekty i strategie |
VS Code | Lekkość i szybkość | Proste skrypty i mniejsze projekty |
Jupyter Lab | Interaktywność | Prototypy strategii i analiza danych |
Instalacja Jupyter Lab
Aby zainstalować i uruchomić Jupyter Lab, użyj poniższych komend:
pip install jupyterlab
jupyter lab
Konfiguracja pliku .env
Stwórz plik .env
i zdefiniuj w nim podstawowe zmienne środowiskowe:
DATA_PATH="./data"
RESULTS_PATH="./results"
LOG_LEVEL="INFO"
Struktura katalogów projektu
Dla lepszej organizacji kodu i danych, zastosuj poniższą strukturę katalogów:
project/
├── data/
│ ├── raw/
│ └── processed/
├── strategies/
├── results/
└── notebooks/
Po poprawnym skonfigurowaniu środowiska, możesz rozpocząć tworzenie i testowanie strategii opisanych w dalszych częściach artykułu.
Tworzenie Strategii Czynnikowych
Wybrane czynniki, omówione wcześniej, są teraz przedstawione w formie implementacji kodu.
Wybór Czynników
Dobór czynników to kluczowy element strategii. Oto przykład implementacji trzech podstawowych czynników:
import pandas as pd
import numpy as np
def calculate_value_factor(df):
# Obliczanie wskaźnika P/E (Price to Earnings)
df['PE'] = df['close'] / df['earnings_per_share']
# Normalizacja wskaźnika
df['value_score'] = -1 * (df['PE'] - df['PE'].mean()) / df['PE'].std()
return df
def calculate_momentum_factor(df):
# Momentum 12-miesięczny z pominięciem ostatniego miesiąca
df['momentum'] = df['close'].pct_change(periods=252) - df['close'].pct_change(periods=21)
df['momentum_score'] = (df['momentum'] - df['momentum'].mean()) / df['momentum'].std()
return df
def calculate_quality_factor(df):
# ROE jako wskaźnik jakości
df['quality_score'] = (df['net_income'] / df['equity']).rolling(window=252).mean()
df['quality_score'] = (df['quality_score'] - df['quality_score'].mean()) / df['quality_score'].std()
return df
System Punktacji Czynników
System punktacji wymaga odpowiedniego ważenia i normalizacji. Poniżej przykład implementacji:
def calculate_combined_score(df, weights={'value': 0.4, 'momentum': 0.3, 'quality': 0.3}):
df['combined_score'] = (
weights['value'] * df['value_score'] +
weights['momentum'] * df['momentum_score'] +
weights['quality'] * df['quality_score']
)
return df
Wagi czynników mogą być dostosowane w zależności od preferencji:
Czynnik | Waga konserwatywna | Waga zrównoważona | Waga agresywna |
---|---|---|---|
Value | 0,5 | 0,4 | 0,3 |
Momentum | 0,2 | 0,3 | 0,4 |
Quality | 0,3 | 0,3 | 0,3 |
Na podstawie punktacji łączonej definiowane są reguły portfela.
Reguły Portfelowe
Reguły portfelowe obejmują wybór akcji i zasady rebalancingu:
def create_portfolio(df, top_n=10, rebalance_freq='M'):
# Wybór top N akcji na podstawie combined_score
portfolio = df.groupby(pd.Grouper(freq=rebalance_freq)).apply(
lambda x: x.nlargest(top_n, 'combined_score')
)
# Równe ważenie pozycji
portfolio['weight'] = 1.0 / top_n
# Obliczanie zwrotów portfela
portfolio['portfolio_return'] = portfolio['returns'] * portfolio['weight']
return portfolio
Przykładowe parametry strategii portfelowej:
Parametr | Wartość | Opis |
---|---|---|
Liczba akcji | 10-30 | Liczba spółek w portfelu |
Częstotliwość rebalancingu | Miesięczna | – |
Minimalna płynność | 100 000 PLN | Minimalny dzienny obrót |
Stop-loss | -15% | Maksymalna akceptowalna strata |
Podczas implementacji strategii uwzględnij koszty transakcyjne oraz filtry płynności, takie jak minimalny dzienny obrót wynoszący 100 000 PLN.
Metody Backtestingu w Pythonie
Przy wdrażaniu strategii inwestycyjnych warto przetestować je za pomocą narzędzi backtestingu dostępnych w Pythonie.
Narzędzia Backtestingu
Biblioteka Backtesting.py oferuje możliwości testowania strategii opartych na wielu czynnikach. Przykład implementacji:
from backtesting import Backtest, Strategy
import pandas as pd
import numpy as np
class MultiFactorStrategy(Strategy):
def init(self):
# Inicjalizacja wskaźników
self.value = self.I(calculate_value_factor)
self.momentum = self.I(calculate_momentum_factor)
self.quality = self.I(calculate_quality_factor)
# Obliczanie combined_score
self.combined_score = self.I(lambda x: (
0.4 * self.value +
0.3 * self.momentum +
0.3 * self.quality
))
def next(self):
if self.data.combined_score[-1] > 0.5:
self.buy()
elif self.data.combined_score[-1] < -0.5:
self.sell()
Przykładowa Strategia
Poniżej znajduje się kompletny przykład kodu do uruchomienia testów:
def run_backtest(data, params):
# params musi zawierać 'top_n' i 'rebalance_freq'
bt = Backtest(
data,
MultiFactorStrategy,
cash=100000,
commission=0.001,
exclusive_orders=True
)
stats = bt.run(
top_n=params['top_n'],
rebalance_freq=params['rebalance_freq']
)
return stats
W tym przykładzie ustawiono kapitał początkowy na 100 000 PLN, prowizję na poziomie 0,1%, rebalancing co 21 dni oraz minimalną transakcję w wysokości 1 000 PLN.
Analiza Wyników
Do oceny skuteczności strategii można wykorzystać kluczowe wskaźniki:
def analyze_performance(stats):
metrics = {
'CAGR': stats['Return [%]'],
'Sharpe Ratio': stats['Sharpe Ratio'],
'Max Drawdown': stats['Max. Drawdown [%]'],
'Win Rate': stats['Win Rate [%]']
}
return pd.DataFrame(metrics)
Przykładowe wyniki strategii testowanej na danych WIG20 (2020-2024):
Metrika | Wartość |
---|---|
CAGR | 12,5% |
Sharpe Ratio | 1,45 |
Max Drawdown | -15,3% |
Information Ratio | 0,85 |
Strategia powinna być testowana w różnych okresach, aby sprawdzić jej działanie w zmiennych warunkach rynkowych.
Zaawansowane Techniki Backtestingu
Poniżej znajdziesz bardziej zaawansowane metody, które mogą pomóc w precyzyjnym testowaniu i doskonaleniu strategii inwestycyjnych.
Optymalizacja Strategii
Dostosowanie parametrów strategii wieloczynnikowej można przeprowadzić za pomocą modułu scipy.optimize
. Oto przykład optymalizacji wag portfela:
from scipy.optimize import minimize
def optimize_weights(data, initial_weights):
def objective(weights):
# Minimalizacja ujemnej wartości Sharpe Ratio
return -calculate_sharpe_ratio(data, weights)
constraints = {
'type': 'eq',
'fun': lambda w: np.sum(w) - 1.0
}
bounds = tuple((0, 1) for _ in range(len(initial_weights)))
result = minimize(
objective,
initial_weights,
method='SLSQP',
bounds=bounds,
constraints=constraints
)
return result.x
Testowanie na Wielu Przedziałach Czasowych
Aby ocenić skuteczność strategii w różnych warunkach rynkowych, warto przeprowadzić testy na kilku przedziałach czasowych:
def multi_period_test(data, periods):
results = {}
for start_date, end_date in periods:
period_data = data[start_date:end_date]
bt = Backtest(
period_data,
MultiFactorStrategy,
cash=100000,
commission=0.001
)
results[(start_date, end_date)] = bt.run()
return results
Przykład wyników dla indeksu WIG20 w różnych okresach:
Okres | CAGR | Sharpe Ratio | Max Drawdown |
---|---|---|---|
2020-2021 | 15,3% | 1,65 | -12,4% |
2022-2023 | 8,7% | 1,12 | -18,6% |
2024-2025 | 11,2% | 1,38 | -14,8% |
Analiza Kosztów Transakcyjnych
Koszty transakcyjne mogą znacząco wpłynąć na wyniki strategii. Warto je oszacować i uwzględnić w analizie:
def calculate_transaction_costs(price, volume, commission_rate=0.001,
min_commission=5.0):
base_commission = price * volume * commission_rate
return max(base_commission, min_commission)
def apply_slippage(price, volume, avg_daily_volume,
slippage_factor=0.1):
impact = (volume / avg_daily_volume) * slippage_factor
return price * (1 + impact)
Przykład wpływu kosztów na wyniki strategii dla portfela o wartości 100 000 PLN:
Składnik Kosztów | Wartość Roczna |
---|---|
Prowizje maklerskie | 1 250 PLN |
Spread bid-ask | 850 PLN |
Poślizg cenowy | 1 450 PLN |
Łączny wpływ na stopę zwrotu | -3,55% |
Podsumowanie i Materiały Dodatkowe
Kluczowe Wnioski
Przygotowanie do backtestingu strategii wieloczynnikowych wymaga solidnej wiedzy technicznej. Oto najważniejsze elementy:
Element |
---|
Optymalizacja |
Analiza wielookresowa |
Koszty transakcyjne |
Szczególnie istotne jest dokładne uwzględnienie kosztów transakcyjnych. Ich niedoszacowanie może prowadzić do błędnych wniosków o rentowności strategii.
Te podstawy są niezbędne dla dalszego doskonalenia strategii inwestycyjnych.
Kolejne Kroki
Aby rozwijać swoje umiejętności i strategie, warto skupić się na kilku kluczowych działaniach:
-
Rozwijanie umiejętności technicznych
Naucz się korzystać z zaawansowanych narzędzi analitycznych, w tym tych opartych na sztucznej inteligencji. Automatyzacja analiz historycznych pozwala na bardziej precyzyjne wnioski. -
Ulepszanie strategii
Zrozumienie różnic między ETF-ami a funduszami inwestycyjnymi może pomóc w wyborze odpowiednich metod testowania strategii. -
Unikanie typowych błędów
Przed wdrożeniem strategii w realnym środowisku, upewnij się, że:- Portfel jest odpowiednio zdywersyfikowany.
- Ryzyko jest pod kontrolą, a pozycje są właściwie zarządzane.
- Regularnie weryfikujesz założenia swojej strategii.
Dodatkowo, warto rozważyć zapisanie się na newsletter edukacyjny, który oferuje praktyczne przykłady tworzenia i testowania strategii inwestycyjnych, nawet dla osób bez doświadczenia w programowaniu.