Last active
December 22, 2024 05:19
-
-
Save stalequant/13072bb78b9291cb4854f603071309cd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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