Skip to content

Instantly share code, notes, and snippets.

@stalequant
Last active December 22, 2024 05:19
Show Gist options
  • Save stalequant/13072bb78b9291cb4854f603071309cd to your computer and use it in GitHub Desktop.
Save stalequant/13072bb78b9291cb4854f603071309cd to your computer and use it in GitHub Desktop.
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import ccxt
import statsmodels.api as sm
def test_beta_similarity_textbook(beta_i, beta_j, std_error_i, std_error_j, n_i, n_j):
delta_beta = beta_i - beta_j
se_delta_beta = np.sqrt(std_error_i**2 + std_error_j**2 )
t_statistic = delta_beta / se_delta_beta
df = min(n_i - 1, n_j - 1)
critical_value = stats.t.ppf(0.8413, df)
return abs(t_statistic) <= critical_value
def calculate_beta(asset_returns, market_returns):
X = sm.add_constant(market_returns)
model = sm.OLS(asset_returns, X).fit()
return model.params.iloc[-1], model.bse.iloc[-1]
def test_beta_similarity_gooder(asset_A_returns,
asset_B_returns,
market_returns,
threshold=.01,
):
delta_asset_returns = asset_A_returns - asset_B_returns
X = sm.add_constant(market_returns/market_returns.std())
model = sm.OLS(delta_asset_returns, X).fit()
return abs(model.params.iloc[-1])<threshold
def calculate_beta(asset_returns, market_returns):
X = sm.add_constant(market_returns)
model = sm.OLS(asset_returns, X).fit()
return model.params.iloc[-1], model.bse.iloc[-1]
#%%
SYMBOL_A = '1000PEPE/USDT:USDT'
SYMBOL_B = 'ETH/USDT:USDT'
MARKET = 'BTC/USDT:USDT'
NN = 10
THRESHOLD = 0.001
raw_candles = {coin:ccxt.binance().fetch_ohlcv(coin,'1d',limit=NN)
for coin in [SYMBOL_A, SYMBOL_B, MARKET]}
merged_candles = pd.concat({coin:pd.DataFrame(df).set_index(0)[4]
for coin, df in raw_candles.items()},
axis=1)
returns = np.log(merged_candles).diff().dropna()
# Calculate betas
beta1, se1 = calculate_beta(returns[SYMBOL_A], returns[MARKET])
beta2, se2 = calculate_beta(returns[SYMBOL_B], returns[MARKET])
print(f"Beta of {SYMBOL_A} wrt {MARKET}: {beta1:.4f} (SE: {se1:.4f})")
print(f"Beta of {SYMBOL_B} wrt {MARKET}: {beta2:.4f} (SE: {se2:.4f})")
# Test beta similarity
n = len(returns)
are_similar = test_beta_similarity_textbook(beta1, beta2, se1, se2, n, n)
print(f"The betas are statistically similar based {NN} days using random textbook formula: {are_similar}")
are_similar_gooder = test_beta_similarity_gooder(returns[SYMBOL_A],
returns[SYMBOL_B],
returns[MARKET],
threshold=THRESHOLD)
print(f"The betas are economically similar at threshold {THRESHOLD} based {NN} days using formula stalequant made up that is probably in a different textbook': {are_similar_gooder}")
# Visualize the data
plt.figure(figsize=(10, 6))
plt.scatter(returns[MARKET], returns[SYMBOL_A], alpha=0.5, label=SYMBOL_A)
plt.scatter(returns[MARKET], returns[SYMBOL_B], alpha=0.5, label=SYMBOL_B)
plt.xlabel('Market Returns')
plt.ylabel('Asset Returns')
plt.legend()
plt.title('Asset Returns vs Market Returns')
plt.show()
'''
Beta of BTC/USDT:USDT wrt BTC/USDT: 1.0012 (SE: 0.0005)
Beta of BTC/USD:BTC wrt BTC/USDT: 1.0056 (SE: 0.0010)
The betas are statistically similar based 365 days using random textbook formula: False
The betas are economically similar at threshold 0.001 based 365 days using formula stalequant made up that is probably in a different textbook': True
Beta of 1000PEPE/USDT:USDT wrt BTC/USDT:USDT: 1.2370 (SE: 0.6083)
Beta of ETH/USDT:USDT wrt BTC/USDT:USDT: 0.7194 (SE: 0.1562)
The betas are statistically similar based 10 days using random textbook formula: True
The betas are economically similar at threshold 0.001 based 10 days using formula stalequant made up that is probably in a different textbook': False
'''
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment