update screener
This commit is contained in:
parent
193edad586
commit
eff1428d1d
@ -523,8 +523,11 @@ data = {
|
|||||||
"evFCF": {
|
"evFCF": {
|
||||||
"text": "The enterprise value to free cash flow (EV/FCF) ratio is similar to the price to free cash flow ratio, except the price is adjusted for the company's cash and debt.",
|
"text": "The enterprise value to free cash flow (EV/FCF) ratio is similar to the price to free cash flow ratio, except the price is adjusted for the company's cash and debt.",
|
||||||
"equation": "EV/FCF Ratio = Enterprise Value / Free Cash Flow",
|
"equation": "EV/FCF Ratio = Enterprise Value / Free Cash Flow",
|
||||||
}
|
},
|
||||||
|
"inventoryTurnover": {
|
||||||
|
"text": "The inventory turnover ratio measures how many times inventory has been sold and replaced during a time period.",
|
||||||
|
"equation": "Inventory Turnover Ratio = Cost of Revenue / Average Inventory",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -28,6 +28,47 @@ benzinga_api_key = os.getenv('benzinga_api_key')
|
|||||||
berlin_tz = pytz.timezone('Europe/Berlin')
|
berlin_tz = pytz.timezone('Europe/Berlin')
|
||||||
|
|
||||||
|
|
||||||
|
query_price = """
|
||||||
|
SELECT
|
||||||
|
close
|
||||||
|
FROM
|
||||||
|
"{symbol}"
|
||||||
|
WHERE
|
||||||
|
date <= ?
|
||||||
|
ORDER BY
|
||||||
|
date DESC
|
||||||
|
LIMIT 1
|
||||||
|
"""
|
||||||
|
|
||||||
|
time_frames = {
|
||||||
|
'change1W': (datetime.now() - timedelta(days=7)).strftime('%Y-%m-%d'),
|
||||||
|
'change1M': (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d'),
|
||||||
|
'change3M': (datetime.now() - timedelta(days=90)).strftime('%Y-%m-%d'),
|
||||||
|
'change6M': (datetime.now() - timedelta(days=180)).strftime('%Y-%m-%d'),
|
||||||
|
'change1Y': (datetime.now() - timedelta(days=365)).strftime('%Y-%m-%d'),
|
||||||
|
'change3Y': (datetime.now() - timedelta(days=365 * 3)).strftime('%Y-%m-%d'),
|
||||||
|
}
|
||||||
|
|
||||||
|
def calculate_price_changes(symbol, item, con):
|
||||||
|
try:
|
||||||
|
# Loop through each time frame to calculate the change
|
||||||
|
for name, date in time_frames.items():
|
||||||
|
item[name] = None # Initialize to None
|
||||||
|
|
||||||
|
query = query_price.format(symbol=symbol)
|
||||||
|
data = pd.read_sql_query(query, con, params=(date,))
|
||||||
|
|
||||||
|
# Check if data was retrieved and calculate the percentage change
|
||||||
|
if not data.empty:
|
||||||
|
past_price = data.iloc[0]['close']
|
||||||
|
current_price = item['price']
|
||||||
|
item[name] = round(((current_price - past_price) / past_price) * 100, 2)
|
||||||
|
|
||||||
|
except:
|
||||||
|
# Handle exceptions by setting all fields to None
|
||||||
|
for name in time_frames.keys():
|
||||||
|
item[name] = None
|
||||||
|
|
||||||
# Replace NaN values with None in the resulting JSON object
|
# Replace NaN values with None in the resulting JSON object
|
||||||
def replace_nan_inf_with_none(obj):
|
def replace_nan_inf_with_none(obj):
|
||||||
if isinstance(obj, list):
|
if isinstance(obj, list):
|
||||||
@ -403,17 +444,11 @@ async def get_stock_screener(con):
|
|||||||
|
|
||||||
#Stock Screener Data
|
#Stock Screener Data
|
||||||
|
|
||||||
cursor.execute("SELECT symbol, name, change_1W, change_1M, change_3M, change_6M, change_1Y, change_3Y, sma_20, sma_50, sma_100, sma_200, ema_20, ema_50, ema_100, ema_200, rsi, atr, stoch_rsi, mfi, cci, beta FROM stocks WHERE symbol NOT LIKE '%.%' AND eps IS NOT NULL AND marketCap IS NOT NULL AND beta IS NOT NULL")
|
cursor.execute("SELECT symbol, name, sma_20, sma_50, sma_100, sma_200, ema_20, ema_50, ema_100, ema_200, rsi, atr, stoch_rsi, mfi, cci, beta FROM stocks WHERE symbol NOT LIKE '%.%' AND eps IS NOT NULL AND marketCap IS NOT NULL AND beta IS NOT NULL")
|
||||||
raw_data = cursor.fetchall()
|
raw_data = cursor.fetchall()
|
||||||
stock_screener_data = [{
|
stock_screener_data = [{
|
||||||
'symbol': symbol,
|
'symbol': symbol,
|
||||||
'name': name,
|
'name': name,
|
||||||
'change1W': change_1W,
|
|
||||||
'change1M': change_1M,
|
|
||||||
'change3M': change_3M,
|
|
||||||
'change6M': change_6M,
|
|
||||||
'change1Y': change_1Y,
|
|
||||||
'change3Y': change_3Y,
|
|
||||||
'sma20': sma_20,
|
'sma20': sma_20,
|
||||||
'sma50': sma_50,
|
'sma50': sma_50,
|
||||||
'sma100': sma_100,
|
'sma100': sma_100,
|
||||||
@ -428,7 +463,7 @@ async def get_stock_screener(con):
|
|||||||
'mfi': mfi,
|
'mfi': mfi,
|
||||||
'cci': cci,
|
'cci': cci,
|
||||||
'beta': beta,
|
'beta': beta,
|
||||||
} for (symbol, name, change_1W, change_1M, change_3M, change_6M, change_1Y, change_3Y, sma_20, sma_50, sma_100, sma_200, ema_20, ema_50, ema_100, ema_200, rsi, atr, stoch_rsi, mfi, cci, beta) in raw_data]
|
} for (symbol, name, sma_20, sma_50, sma_100, sma_200, ema_20, ema_50, ema_100, ema_200, rsi, atr, stoch_rsi, mfi, cci, beta) in raw_data]
|
||||||
|
|
||||||
stock_screener_data = [{k: round(v, 2) if isinstance(v, (int, float)) else v for k, v in entry.items()} for entry in stock_screener_data]
|
stock_screener_data = [{k: round(v, 2) if isinstance(v, (int, float)) else v for k, v in entry.items()} for entry in stock_screener_data]
|
||||||
|
|
||||||
@ -460,6 +495,9 @@ async def get_stock_screener(con):
|
|||||||
item['pe'] = None
|
item['pe'] = None
|
||||||
item['marketCap'] = None
|
item['marketCap'] = None
|
||||||
|
|
||||||
|
calculate_price_changes(symbol, item, con)
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(f"json/stockdeck/{symbol}.json", 'r') as file:
|
with open(f"json/stockdeck/{symbol}.json", 'r') as file:
|
||||||
res = orjson.loads(file.read())[0]
|
res = orjson.loads(file.read())[0]
|
||||||
|
|||||||
@ -39,24 +39,7 @@ class TASignals:
|
|||||||
ta_df['atr'] = AverageTrueRange(self.data['High'], self.data['Low'], self.data['Close'], window=14).average_true_range()
|
ta_df['atr'] = AverageTrueRange(self.data['High'], self.data['Low'], self.data['Close'], window=14).average_true_range()
|
||||||
ta_df['cci'] = CCIIndicator(high=self.data['High'], low=self.data['Low'], close=self.data['Close']).cci()
|
ta_df['cci'] = CCIIndicator(high=self.data['High'], low=self.data['Low'], close=self.data['Close']).cci()
|
||||||
ta_df['mfi'] = MFIIndicator(high=self.data['High'], low=self.data['Low'], close=self.data['Close'], volume=self.data['Volume']).money_flow_index()
|
ta_df['mfi'] = MFIIndicator(high=self.data['High'], low=self.data['Low'], close=self.data['Close'], volume=self.data['Volume']).money_flow_index()
|
||||||
# Calculate 52-week change
|
|
||||||
# Define periods for different time frames
|
|
||||||
periods = {
|
|
||||||
'1W': 5,
|
|
||||||
'1M': 21,
|
|
||||||
'3M': 63,
|
|
||||||
'6M': 126,
|
|
||||||
'1Y': 252,
|
|
||||||
'3Y': 756
|
|
||||||
}
|
|
||||||
|
|
||||||
# Calculate percentage change for each period
|
|
||||||
for period_name, period_days in periods.items():
|
|
||||||
if len(self.data['Close']) >= period_days:
|
|
||||||
change = ((self.data['Close'].iloc[-1] - self.data['Close'].iloc[-period_days]) / self.data['Close'].iloc[-period_days]) * 100
|
|
||||||
ta_df[f'change_{period_name}'] = change
|
|
||||||
else:
|
|
||||||
ta_df[f'change_{period_name}'] = np.nan # Not enough data for the period
|
|
||||||
|
|
||||||
last_values = {col: [round(ta_df[col].iloc[-1],2)] for col in ta_df.columns} if not ta_df.empty else None
|
last_values = {col: [round(ta_df[col].iloc[-1],2)] for col in ta_df.columns} if not ta_df.empty else None
|
||||||
last_values_df = pd.DataFrame(last_values)
|
last_values_df = pd.DataFrame(last_values)
|
||||||
@ -121,8 +104,9 @@ def process_symbol(ticker):
|
|||||||
create_columns(con, ta_df)
|
create_columns(con, ta_df)
|
||||||
update_database(ta_df, ticker, con)
|
update_database(ta_df, ticker, con)
|
||||||
|
|
||||||
except Exception as e:
|
except:
|
||||||
print(f"Failed create ta signals for {ticker}: {e}")
|
pass
|
||||||
|
#print(f"Failed create ta signals for {ticker}: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user