add etfs to options gex

This commit is contained in:
MuslemRahimi 2024-09-07 17:41:33 +02:00
parent 0586fd2501
commit b52331fb08
2 changed files with 39 additions and 19 deletions

View File

@ -46,21 +46,29 @@ def gamma(S, K, T, r, sigma):
return 0
def compute_gex(option_data, r=0.05, sigma=0.2):
S = float(option_data['underlying_price'])
K = float(option_data['strike_price'])
size = float(option_data['open_interest'])
expiration_date = datetime.strptime(option_data['date_expiration'], "%Y-%m-%d")
timestamp = datetime.strptime(option_data['date'], "%Y-%m-%d")
T = (expiration_date - timestamp).days / 365.0
if T <= 0:
try:
S = float(option_data['underlying_price'])
K = float(option_data['strike_price'])
size = float(option_data['open_interest'])
expiration_date = datetime.strptime(option_data['date_expiration'], "%Y-%m-%d")
T = (expiration_date - timestamp).days / 365.0
if T < 0:
return 0, timestamp.date()
elif T == 0:
T = 1 #Consider 0DTE options
option_type = option_data['put_call']
delta_value = delta(S, K, T, r, sigma, option_type)
gamma_value = gamma(S, K, T, r, sigma)
notional = size * S
gex = gamma_value * size * int(option_data['volume']) * S #gamma_value * notional * delta_value
return gex, timestamp.date()
except:
return 0, timestamp.date()
option_type = option_data['put_call']
delta_value = delta(S, K, T, r, sigma, option_type)
gamma_value = gamma(S, K, T, r, sigma)
notional = size * S
gex = gamma_value * notional * delta_value
return gex, timestamp.date()
def compute_daily_gex(option_data_list, volatility):
gex_data = []
@ -98,11 +106,20 @@ start_date_str = start_date.strftime('%Y-%m-%d')
# Connect to SQLite database
stock_con = sqlite3.connect('stocks.db')
etf_con = sqlite3.connect('etf.db')
stock_cursor = stock_con.cursor()
stock_cursor.execute("PRAGMA journal_mode = wal")
stock_cursor.execute("SELECT DISTINCT symbol FROM stocks WHERE symbol NOT LIKE '%.%' AND marketCap >= 1E9")
stock_cursor.execute("SELECT DISTINCT symbol FROM stocks WHERE symbol NOT LIKE '%.%' AND marketCap >= 500E6")
stock_symbols = [row[0] for row in stock_cursor.fetchall()]
etf_cursor = etf_con.cursor()
etf_cursor.execute("PRAGMA journal_mode = wal")
etf_cursor.execute("SELECT DISTINCT symbol FROM etfs")
etf_symbols = [row[0] for row in etf_cursor.fetchall()]
total_symbols = stock_symbols + etf_symbols
query_template = """
SELECT date, close
FROM "{ticker}"
@ -110,20 +127,22 @@ query_template = """
"""
# Process each symbol
for ticker in stock_symbols:
for ticker in total_symbols:
try:
query = query_template.format(ticker=ticker)
df_price = pd.read_sql_query(query, stock_con, params=(start_date_str, end_date_str)).round(2)
df_price = pd.read_sql_query(query, stock_con if ticker in stock_symbols else etf_con, params=(start_date_str, end_date_str)).round(2)
volatility = calculate_volatility(df_price)
ticker_data = get_data(ticker)
daily_gex = compute_daily_gex(ticker_data, volatility)
daily_gex = daily_gex.merge(df_price, on='date', how='inner')
if not daily_gex.empty:
save_json(ticker, daily_gex.to_dict('records'))
except:
except Exception as e:
print(e)
pass
# Close the database connection
stock_con.close()
etf_con.close()

View File

@ -2516,6 +2516,7 @@ async def get_options_flow_ticker(data:TickerData, api_key: str = Security(get_a
filtered_item = {key: value for key, value in item.items() if key in keys_to_keep}
filtered_item['type'] = filtered_item['option_activity_type'].capitalize()
filtered_item['sentiment'] = filtered_item['sentiment'].capitalize()
filtered_item['underlying_price'] = round(float(filtered_item['underlying_price']),2)
#filtered_item['time'] = (datetime.strptime(filtered_item['time'], '%H:%M:%S')-timedelta(hours=0)).strftime('%H:%M:%S')
filtered_item['put_call'] = 'Calls' if filtered_item['put_call'] == 'CALL' else 'Puts'
res_list.append(filtered_item)