Files
docker-configs/backtest/download_qqq_data.py
2025-07-18 00:00:01 -05:00

108 lines
3.4 KiB
Python

#!/usr/bin/env python3
import yfinance as yf
import pandas as pd
import sqlite3
import sys
from datetime import datetime
def download_qqq_data():
"""Download QQQ historical data and add to database"""
print("Downloading QQQ historical data...")
try:
# Try multiple ticker symbols for QQQ
symbols_to_try = ["QQQ", "QQQM", "^NDX"]
hist = None
for symbol in symbols_to_try:
print(f"Trying symbol: {symbol}")
try:
ticker = yf.Ticker(symbol)
hist = ticker.history(start="2007-01-01", end=datetime.now().strftime('%Y-%m-%d'))
if not hist.empty:
print(f"Successfully downloaded data for {symbol}")
break
except Exception as e:
print(f"Failed to download {symbol}: {e}")
continue
if hist is None or hist.empty:
print("Failed to download QQQ data from all sources")
return False
print(f"Downloaded QQQ data from {hist.index[0].strftime('%Y-%m-%d')} to {hist.index[-1].strftime('%Y-%m-%d')}")
print(f"Total records: {len(hist)}")
# Prepare data for database
hist.reset_index(inplace=True)
hist['Date'] = hist['Date'].dt.strftime('%Y-%m-%d')
# Rename columns to match our database schema
hist = hist.rename(columns={
'Date': 'date',
'Open': 'open',
'High': 'high',
'Low': 'low',
'Close': 'close',
'Volume': 'volume'
})
# Select only the columns we need
qqq_data = hist[['date', 'open', 'high', 'low', 'close', 'volume']].copy()
# Connect to database
conn = sqlite3.connect('data/stock_data.db')
# Drop existing QQQ table if it exists
conn.execute("DROP TABLE IF EXISTS qqq")
# Create QQQ table with same structure as individual stocks
conn.execute('''
CREATE TABLE qqq (
date DATE PRIMARY KEY,
open REAL,
high REAL,
low REAL,
close REAL,
volume INTEGER,
sma_5 REAL,
sma_20 REAL,
sma_200 REAL,
rsi REAL,
bb_upper REAL,
bb_middle REAL,
bb_lower REAL,
macd REAL,
macd_signal REAL,
macd_histogram REAL,
volatility REAL
)
''')
# Insert QQQ data
qqq_data.to_sql('qqq', conn, if_exists='append', index=False)
print(f"Successfully added {len(qqq_data)} QQQ records to database")
# Verify the data
result = conn.execute("SELECT COUNT(*) FROM qqq").fetchone()
print(f"QQQ table now has {result[0]} records")
# Show sample data
sample = conn.execute("SELECT date, close FROM qqq ORDER BY date LIMIT 5").fetchall()
print("\nSample QQQ data:")
for row in sample:
print(f" {row[0]}: ${row[1]:.2f}")
conn.close()
return True
except Exception as e:
print(f"Error downloading QQQ data: {e}")
return False
if __name__ == "__main__":
success = download_qqq_data()
sys.exit(0 if success else 1)