Add the ability to query OHLC data

This commit is contained in:
moshferatu 2023-09-28 09:32:35 -07:00
parent 867891dbe3
commit 36a592c628
4 changed files with 70 additions and 0 deletions

View File

@ -0,0 +1 @@
from .ohlc import ohlc

View File

@ -0,0 +1,12 @@
CREATE TABLE OHLC (
"Symbol" VARCHAR(10) NOT NULL,
"Date" DATE NOT NULL,
"Timeframe" VARCHAR(10) NOT NULL,
"Timestamp" TIMESTAMP WITHOUT TIME ZONE NOT NULL,
"Open" NUMERIC NOT NULL,
"High" NUMERIC NOT NULL,
"Low" NUMERIC NOT NULL,
"Close" NUMERIC NOT NULL,
"Volume" NUMERIC,
PRIMARY KEY ("Symbol", "Date", "Timeframe", "Timestamp")
);

52
database/ohlc/ohlc.py Normal file
View File

@ -0,0 +1,52 @@
import pandas as pd
from datetime import datetime
from dotenv import load_dotenv
from os import getenv
from sqlalchemy import create_engine
load_dotenv()
def ohlc(symbol: str, timeframe: str, date: datetime = datetime.now,
start_date: datetime = None, end_date: datetime = None):
"""
Retrieve OHLC data for the specified symbol, time frame, and date(s).
Example Usage:
data = ohlc('SPY', '5m', datetime(2023, 9, 20)) # For a single day.
data = ohlc('SPY', '5m', datetime(2023, 9, 20), datetime(2023, 9, 25)) # For a range of dates.
:param symbol: The stock, etf, etc. symbol.
:param timeframe: The timeframe (e.g., '5m', '1h', etc.).
:param date: The date for which data is being requested.
:param start_date: The start date (optional).
:param end_date: The end date (optional).
:return: A pandas DataFrame containing the OHLC data.
"""
database_url = (
f"postgresql+psycopg2://{getenv('DATABASE_USER')}:{getenv('DATABASE_PASSWORD')}"
f"@{getenv('DATABASE_HOST')}:{getenv('DATABASE_PORT')}/{getenv('DATABASE_NAME')}"
)
engine = create_engine(database_url)
if start_date and end_date:
query = f"""
SELECT "Timestamp", "Open", "High", "Low", "Close", "Volume"
FROM "OHLC"
WHERE "Symbol" = %s AND "Timeframe" = %s AND "Date" BETWEEN %s AND %s
ORDER BY "Timestamp";
"""
params = (symbol, timeframe, start_date, end_date)
else:
query = f"""
SELECT "Timestamp", "Open", "High", "Low", "Close", "Volume"
FROM "OHLC"
WHERE "Symbol" = %s AND "Timeframe" = %s AND "Date" = %s
ORDER BY "Timestamp";
"""
params = (symbol, timeframe, date)
return pd.read_sql_query(query, engine, params=params)

5
query_ohlc_example.py Normal file
View File

@ -0,0 +1,5 @@
from database.ohlc import ohlc
from datetime import datetime
data = ohlc('SPY', '5m', datetime(2023, 9, 22))
print(data)