import pandas as pd import json import yfinance as yf import numpy as np import psycopg2 from psycopg2.extras import execute_values from tqdm import tqdm import datetime import schedule import time from config import SQL_CONFIG #SQL setting def update_data(): # Connect to the database conn = psycopg2.connect(**SQL_CONFIG) cursor = conn.cursor() print("Stock prices US updating") # Get the list of tickers cursor.execute("SELECT DISTINCT ticker FROM stock_price") tickers = [row[0] for row in cursor.fetchall()] for ticker in tqdm(tickers): # Get the latest date for this ticker cursor.execute(f"SELECT MAX(date) FROM stock_price WHERE ticker = '{ticker}'") latest_date = cursor.fetchone()[0] # If the latest date is not today, update the data if latest_date < datetime.date.today(): df = yf.download(ticker, start=latest_date.strftime('%Y-%m-%d'), end=datetime.date.today().strftime('%Y-%m-%d'), progress=False) value = [(ticker, df.index[i], df['Close'][i]) for i in range(len(df))] with conn: with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: sql = "insert into stock_price (ticker, date, price) values %s" execute_values(curs, sql, value) print("Stock prices US updated") def update_data_tw(): # Connect to the database conn = psycopg2.connect(**SQL_CONFIG) cursor = conn.cursor() print("Stock prices US updating") # Get the list of tickers cursor.execute("SELECT DISTINCT ticker FROM stock_price_tw") tickers = [row[0] for row in cursor.fetchall()] for ticker in tqdm(tickers): # Get the latest date for this ticker cursor.execute(f"SELECT MAX(date) FROM stock_price_tw WHERE ticker = '{ticker}'") latest_date = cursor.fetchone()[0] # If the latest date is not today, update the data if latest_date < datetime.date.today(): df = yf.download(ticker, start=latest_date.strftime('%Y-%m-%d'), end=datetime.date.today().strftime('%Y-%m-%d'), progress=False) value = [(ticker, df.index[i], df['Close'][i]) for i in range(len(df))] with conn: with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: sql = "insert into stock_price_tw (ticker, date, price) values %s" execute_values(curs, sql, value) print("Stock prices TW updated") # Schedule the task schedule.every().day.at("17:00").do(update_data) schedule.every().day.at("18:00").do(update_data_tw) # Keep the script running while True: schedule.run_pending() time.sleep(1)