108 lines
3.4 KiB
Python
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) |