forked from shawncavasos23/Data-Engineering-Project
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdatabase.py
100 lines (88 loc) · 3.26 KB
/
database.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import sqlite3
def create_connection():
"""Create or connect to the SQLite database with foreign keys enabled."""
conn = sqlite3.connect("trading_data.db")
conn.execute("PRAGMA foreign_keys = ON;") # Enforce foreign key constraints
return conn
def initialize_database():
"""Creates tables and ensures schema is correct."""
conn = create_connection()
cursor = conn.cursor()
# Drop and recreate tables if schema needs updates
cursor.executescript("""
CREATE TABLE IF NOT EXISTS fundamentals (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticker TEXT NOT NULL UNIQUE,
sector TEXT, -- Allows multiple sectors as comma-separated values
pe_ratio REAL,
market_cap REAL,
revenue REAL,
beta REAL,
roa REAL,
roe REAL,
cluster INTEGER DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS technicals (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticker TEXT NOT NULL,
date DATE NOT NULL,
ma50 REAL,
ma200 REAL,
macd REAL,
signal_line REAL,
rsi REAL,
upper_band REAL,
lower_band REAL,
volume INTEGER,
UNIQUE(ticker, date),
FOREIGN KEY (ticker) REFERENCES fundamentals(ticker) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS macroeconomic_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
indicator TEXT NOT NULL,
date DATE NOT NULL,
value REAL,
UNIQUE(indicator, date)
);
CREATE TABLE IF NOT EXISTS news (
id INTEGER PRIMARY KEY AUTOINCREMENT,
source TEXT,
title TEXT NOT NULL,
description TEXT,
url TEXT,
published_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE(title, published_at)
);
CREATE TABLE IF NOT EXISTS reddit_mentions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticker TEXT NOT NULL,
title TEXT NOT NULL,
upvotes INTEGER,
upvote_ratio REAL,
date DATE NOT NULL,
link TEXT,
UNIQUE(ticker, title, date),
FOREIGN KEY (ticker) REFERENCES fundamentals(ticker) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS trade_signals (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticker TEXT NOT NULL,
signal TEXT NOT NULL CHECK(signal IN ('BUY', 'SELL', 'HOLD')), -- Ensure only valid signals
buy_price REAL,
sell_price REAL,
stop_loss REAL,
date_generated DATE NOT NULL DEFAULT (DATE('now')),
FOREIGN KEY (ticker) REFERENCES fundamentals(ticker) ON DELETE CASCADE
);
-- **Indexes for performance optimization**
CREATE INDEX IF NOT EXISTS idx_technicals_ticker_date ON technicals (ticker, date);
CREATE INDEX IF NOT EXISTS idx_reddit_ticker_date ON reddit_mentions (ticker, date);
CREATE INDEX IF NOT EXISTS idx_signals_ticker ON trade_signals (ticker);
""")
# **Preload 10 Stocks**
tickers = ["AAPL", "MSFT", "GOOGL", "AMZN", "TSLA", "META", "NVDA", "NFLX", "JPM", "V"]
cursor.executemany("INSERT OR IGNORE INTO fundamentals (ticker) VALUES (?);", [(t,) for t in tickers])
conn.commit()
conn.close()
# Initialize database
initialize_database()