#!/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 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) 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) exit(0) if __name__ == "__main__": main()