Skip to content
Testing AutoARIMA on Sector ETFs
Install Libraries
!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 = 'Percent_Diff', 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