49 lines
1.8 KiB
SQL
49 lines
1.8 KiB
SQL
CREATE TABLE IF NOT EXISTS underlyings (
|
|
id SERIAL PRIMARY KEY,
|
|
symbol TEXT UNIQUE NOT NULL,
|
|
exchange TEXT,
|
|
currency TEXT,
|
|
created_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS option_contracts (
|
|
id SERIAL PRIMARY KEY,
|
|
underlying_id INTEGER NOT NULL REFERENCES underlyings(id),
|
|
option_type TEXT NOT NULL CHECK (option_type IN ('call', 'put')),
|
|
strike NUMERIC NOT NULL,
|
|
expiration_date DATE NOT NULL,
|
|
style TEXT,
|
|
contract_symbol TEXT,
|
|
UNIQUE (underlying_id, option_type, strike, expiration_date)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS option_quotes (
|
|
id SERIAL PRIMARY KEY,
|
|
contract_id INTEGER NOT NULL REFERENCES option_contracts(id),
|
|
quote_timestamp TIMESTAMP NOT NULL,
|
|
bid NUMERIC,
|
|
ask NUMERIC,
|
|
mid NUMERIC,
|
|
last_price NUMERIC,
|
|
implied_vol NUMERIC,
|
|
volume INTEGER,
|
|
open_interest INTEGER,
|
|
UNIQUE (contract_id, quote_timestamp)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS underlying_prices (
|
|
id SERIAL PRIMARY KEY,
|
|
underlying_id INTEGER NOT NULL REFERENCES underlyings(id),
|
|
price_timestamp TIMESTAMP NOT NULL,
|
|
price NUMERIC NOT NULL,
|
|
UNIQUE (underlying_id, price_timestamp)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_option_quotes_timestamp
|
|
ON option_quotes(quote_timestamp);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_option_quotes_contract_id
|
|
ON option_quotes(contract_id);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_option_contracts_underlying_expiry
|
|
ON option_contracts(underlying_id, expiration_date); |