From af7f1927e1836f15cc326852af97bc8590bbf321 Mon Sep 17 00:00:00 2001 From: Derek Holloway Date: Mon, 9 Feb 2026 20:15:00 -0800 Subject: [PATCH] Add in my working data source --- Data/datapuller.py | 49 ++++++++++++++++++++++++++++++++++++++++ Data/stock_symbols.xlsx | Bin 0 -> 20120 bytes 2 files changed, 49 insertions(+) create mode 100644 Data/datapuller.py create mode 100644 Data/stock_symbols.xlsx diff --git a/Data/datapuller.py b/Data/datapuller.py new file mode 100644 index 00000000..68e0efa3 --- /dev/null +++ b/Data/datapuller.py @@ -0,0 +1,49 @@ +import yfinance as yf +import pandas as pd + +# Import the S&P 500 symbols +symbols = pd.read_excel("./Data/stock_symbols.xlsx") +symbols.columns = symbols.columns.str.strip() +tickers = symbols['Symbol'].tolist() + +# Scrape the data +all_data = [] +for i, symbol in enumerate(tickers[:2]): # Try first 20 + print(f"Processing: {i} of {len(tickers)}") + df = yf.download(symbol, period="max") + if not df.empty: + # Remove the ticker column + df.columns = df.columns.get_level_values(0) + + # Make sure Date is actually a Date Object + df = df.reset_index() + df['Date'] = pd.to_datetime(df['Date'], format="%Y-%m-%d") + df.set_index('Date', inplace=True) + + # Add the Symbol column for tracking + df['Symbol'] = symbol + + # Add feature Spread + df['Spread'] = abs( df['High'] - df['Low'] ) + + # Add feature for Returns + df['Return'] = df['Close'].pct_change() + + # Add feature for volitility last 5 + df['Volatility_5'] = df['Return'].transform(lambda x: x.rolling(5).std()) + + # Add feature for volitility last 20 + df['Volatility_20'] = df['Return'].transform(lambda x: x.rolling(20).std()) + + all_data.append(df) + +# Concatinate into a combined list and cache +print("Processing data") +final_df = pd.concat(all_data) + +# Drop rows with null values +final_df.dropna(inplace=True) + +print("Writing data to file") +final_df.to_parquet("./Data/stocks.parquet") +final_df.head(200).to_csv("./Data/stocks_preview.csv") \ No newline at end of file diff --git a/Data/stock_symbols.xlsx b/Data/stock_symbols.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f65b062dabda26dab2ca19b5c3816840525988ea GIT binary patch literal 20120 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