Skip to content
Testing Kalman Forecaster on Sector ETFs
Install Libraries
More on Darts library forecasting models can be found: https://unit8co.github.io/darts/generated_api/darts.models.forecasting.html
!pip install yfinance
!pip install darts
Hidden output
Import libraries
import yfinance as yf
import numpy as np
import pandas as pd
from datetime import datetime
Create sector dataframe
#Vanguard Sector ETF List for Trend Rotation
sectors = ['SPY', 'VGLT', 'VGIT', 'VGSH', 'VCSH', 'VCIT', 'VCLT', 'BND', 'VTI', 'VOO', 'VV', 'VIG', 'VFH', 'VGT', 'VCR', 'VHT', 'VIS', 'VAW', 'VDC', 'VPU', 'VOX', 'VDE', 'VNQ']
# Function to fetch and process data for all ETFs
def fetch_process_data(tickers):
# Use yfinance to download data for all tickers at once
data = yf.download(tickers, end=datetime.now().strftime('%Y-%m-%d'), period='max',
progress=False, interval='1wk', auto_adjust=False, group_by='ticker')
# Initialize an empty list to store processed data
processed_data = []
# Process data for each ticker
for ticker in tickers:
# Extract individual ticker data
df = data[ticker].dropna() # Drop NaN value rows that might appear during download
df['Ticker'] = ticker # Add ticker column
# Append processed data to the list
processed_data.append(df)
# Concatenate all dataframes into a single dataframe
final_data = pd.concat(processed_data)
return final_data
# Function call
etf_data = fetch_process_data(sectors)
import plotly for quick EDA checks
import pyplot for more analysis
import darts for timeseries objects
import plotly.express as ple
import matplotlib.pyplot as plt
import darts
quick check of etf_data
display(etf_data.tail(100))
Choice of ETF to test along with log & percent change normalizations
sector_choice = 'SPY'
etf = etf_data[etf_data['Ticker']==sector_choice][['Adj Close']]
etf.index = pd.to_datetime(etf.index)
etf['Log_Price'] = np.log(etf['Adj Close'])
etf['Percent_Diff'] = etf['Adj Close'].pct_change() * 100
print(len(etf))
display(etf.tail(100))
etf_series = darts.TimeSeries.from_dataframe(etf, value_cols = 'Log_Price', fill_missing_dates=True, freq=None)
etf_series.plot()
Simple seasonality check
from darts.utils.statistics import check_seasonality
is_monthly_seasonal, monthly_period = darts.utils.statistics.check_seasonality(etf_series, m=4, max_lag=400, alpha=0.05)
is_quarterly_seasonal, quarter_period = darts.utils.statistics.check_seasonality(etf_series, m=12, max_lag=400, alpha=0.05)
is_annually_seasonal, annual_period = darts.utils.statistics.check_seasonality(etf_series, m=52, max_lag=400, alpha=0.05)
print(f'Montly seasonality: {is_monthly_seasonal} - period = {monthly_period}')
print(f'Quarterly seasonality: {is_quarterly_seasonal} - period = {quarter_period}')
print(f'Annually seasonality: {is_annually_seasonal} - period = {annual_period}')
Visualization of Train and Test datasets