From 7669f2ac4bd4b61b57dd33a900c80b558a20553d Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Tue, 27 Aug 2024 10:34:51 +0200 Subject: [PATCH] update cron job --- app/cron_var.py | 67 ++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/app/cron_var.py b/app/cron_var.py index fcac73a..2f49348 100755 --- a/app/cron_var.py +++ b/app/cron_var.py @@ -4,9 +4,11 @@ import numpy as np import ujson import asyncio import sqlite3 +import os from tqdm import tqdm async def save_json(symbol, data): + os.makedirs("json/var", exist_ok=True) # Ensure directory exists with open(f"json/var/{symbol}.json", 'w') as file: ujson.dump(data, file) @@ -39,10 +41,10 @@ def compute_var(df): df = df.dropna() # Calculate VaR at 95% confidence level confidence_level = 0.95 - var = abs(np.percentile(df['Returns'], 100 * (1 - confidence_level))) - var_N_days = round(var * np.sqrt(5)*100,2) # N days + var = np.percentile(df['Returns'], 100 * (1 - confidence_level)) + var_N_days = round(var * np.sqrt(len(df)) * 100, 2) # N days: the length of df represents the N days - return -var_N_days #{'rating': risk_rating, 'var': -var_N_days, 'outlook': outlook} + return var_N_days # Positive value represents a loss async def run(): start_date = "2015-01-01" @@ -70,36 +72,39 @@ async def run(): total_symbols = stocks_symbols + etf_symbols + crypto_symbols for symbol in tqdm(total_symbols): - if symbol in etf_symbols: - query_con = etf_con - elif symbol in crypto_symbols: - query_con = crypto_con - elif symbol in stocks_symbols: - query_con = con - - query_template = """ - SELECT - date, open, high, low, close, volume - FROM - "{symbol}" - WHERE - date BETWEEN ? AND ? - """ - query = query_template.format(symbol=symbol) - df = pd.read_sql_query(query, query_con, params=(start_date, end_date)) - - # Convert date to datetime - df['date'] = pd.to_datetime(df['date']) - - # Group by year and month - monthly_groups = df.groupby(df['date'].dt.to_period('M')) - - history = [] try: + if symbol in etf_symbols: + query_con = etf_con + elif symbol in crypto_symbols: + query_con = crypto_con + elif symbol in stocks_symbols: + query_con = con + else: + continue + + query_template = """ + SELECT + date, open, high, low, close, volume + FROM + "{symbol}" + WHERE + date BETWEEN ? AND ? + """ + query = query_template.format(symbol=symbol) + df = pd.read_sql_query(query, query_con, params=(start_date, end_date)) + + # Convert date to datetime + df['date'] = pd.to_datetime(df['date']) + + # Group by year and month + monthly_groups = df.groupby(df['date'].dt.to_period('M')) + history = [] + for period, group in monthly_groups: - var_data = compute_var(group) - history.append({'date': str(period), 'var': var_data}) - + if len(group) >=19: # Check if the month has at least 19 data points + var_data = compute_var(group) + history.append({'date': str(period), 'var': var_data}) + risk_rating = assign_risk_rating(abs(history[-1]['var'])) outlook = 'Neutral' if risk_rating < 5: