paperone/populate.py
2025-10-18 13:06:05 +01:00

91 lines
2.3 KiB
Python
Executable File

#!/usr/bin/env python
from sys import exit
from dotenv import load_dotenv
from typing import NoReturn
from paperone.utils import (
get_last_n_trading_days,
)
from paperone.database import TradingDataCRUD
from paperone.indicators import IndicatorService
from paperone.client import Fetcher
from paperone.metadata import TickerContextService
from rich.progress import track
from datetime import datetime
load_dotenv()
DB_FILE = "trading_data.db"
def main() -> NoReturn:
fetcher = Fetcher()
crud = TradingDataCRUD(f"sqlite:///{DB_FILE}")
ind = IndicatorService(crud)
meta = TickerContextService(crud)
date = datetime.now()
days_range = 360 * 10
tickers = [
"AAPL",
"ARM",
"AMD",
"GOOG",
"META",
"MNDY",
"MSFT",
"NVDA",
]
reference_tickers = [
"VOO", # US
"VT", # global
"GLD", # gold
"^VIX", # volatility
"VNQ", # real estate
"DBC", # commodities
"VGK", # EU
"VPL", # Asia
"VWO", # Emerging
"BND", # Global bonds
]
for ticker in tickers + reference_tickers:
trading_days = get_last_n_trading_days(date, days_range)
start_date = trading_days[0]
end_date = trading_days[-1]
all_ohlcv_data = fetcher.ticker_data_for(ticker, start_date, end_date)
ohlcv_dates = []
for ohlcv in track(all_ohlcv_data, description=f"{ticker} OHLCV"):
existing = crud.get_ohlcv(ticker, ohlcv.date)
if not existing:
crud.create_ohlcv(ohlcv)
ohlcv_dates.append(ohlcv.date)
for calc_date in track(ohlcv_dates, description=f"{ticker} Indicators"):
existing_indicator = crud.get_indicators(ticker, calc_date)
if existing_indicator:
continue
ind.calculate_and_save_indicators(ticker=ticker, target_date=calc_date)
for calc_date in track(ohlcv_dates, description=f"{ticker} Metadata"):
existing_metadata = crud.get_context(ticker, calc_date)
if existing_metadata:
continue
meta.calculate_and_save_metadata(ticker=ticker, target_date=calc_date)
exit(0)
if __name__ == "__main__":
main()