COVARIANZA VOLATILIDAD ENTRE BITCOIN Y OTRAS ALTCOINS

スナップショット

En este gráfico se puede observar claramente la covarianza entre BTC y otras altcoins como: 'ETH-USD', 'BNB-USD', 'ADA-USD', 'XRP-USD', 'SOL-USD', 'DOT-USD', 'LTC-USD', 'AVAX-USD', 'LINK-USD', 'ICP-USD'. Es claro cómo BTC marca siempre la tendencia y las demás le siguen.

Para quienes estén interesados en correr el código en su propio entorno, acá está el código:

import pandas as pd
import numpy as np
import yfinance as yf
from datetime import datetime
import matplotlib.pyplot as plt

def get_historical_data_yahoo(days=5*365):
"""
Obtiene la capitalización de mercado histórica de BTC y varias criptomonedas usando Yahoo Finance.

Args:
days (int): Número de días hacia atrás desde hoy para obtener los datos.

Returns:
DataFrame: Contiene fechas, precio de cierre de BTC y la media de las criptomonedas seleccionadas.
"""
# Fechas de inicio y finalización
end_date = datetime.now()
start_date = end_date - pd.Timedelta(days=days)

try:
# Obtener datos históricos de BTC
btc_data = yf.download('BTC-USD', start=start_date, end=end_date)
btc_data.reset_index(inplace=True)
btc_data['date'] = btc_data['Date'].dt.date
btc_data = btc_data[['date', 'Close']]
btc_data.rename(columns={'Close': 'btc_price'}, inplace=True)
except Exception as e:
print(f"Error obteniendo datos históricos de BTC: {e}")
return pd.DataFrame()

try:
# Lista de criptomonedas seleccionadas (incluye más que el top 10)
crypto_symbols = ['ETH-USD', 'BNB-USD', 'ADA-USD', 'XRP-USD',
'SOL-USD', 'DOT-USD',
'LTC-USD', 'AVAX-USD', 'LINK-USD', 'ICP-USD']

# Descargar los datos históricos de cada criptomoneda
market_data = []
for symbol in crypto_symbols:
data = yf.download(symbol, start=start_date, end=end_date)
data.reset_index(inplace=True)
data['date'] = data['Date'].dt.date
data = data[['date', 'Close']]
data.rename(columns={'Close': f'{symbol.lower()}_price'}, inplace=True)
market_data.append(data)

# Unir todos los datos en un solo DataFrame
combined_data = market_data[0]
for data in market_data[1:]:
combined_data = pd.merge(combined_data, data, on='date', how='inner')

# Calcular la media de las criptomonedas seleccionadas para representar el mercado
price_columns = [f'{symbol.lower()}_price' for symbol in crypto_symbols]
combined_data['market_price'] = combined_data[price_columns].mean(axis=1)
combined_data = combined_data[['date', 'market_price']]
except Exception as e:
print(f"Error obteniendo datos del mercado total: {e}")
return pd.DataFrame()

# Unir BTC con el proxy del mercado
merged_data = pd.merge(combined_data, btc_data, on='date', how='inner')

return merged_data

def calculate_volatility(df, price_column):
"""
Calcula la volatilidad diaria a partir del precio.

Args:
df (DataFrame): DataFrame que contiene los precios.
price_column (str): Nombre de la columna de precios.

Returns:
Series: Volatilidad diaria.
"""
returns = df[price_column].pct_change().dropna()
volatility = returns.rolling(window=7).std() # Volatilidad en base a una ventana de 7 días
return volatility

def main():
# Ajustar el periodo de análisis a 5 años (5 * 365 días)
DAYS = 5 * 365 # Cambiado de 1095 días (3 años) a 5 años

# Obtener datos históricos usando Yahoo Finance
print("Obteniendo datos históricos...")
data = get_historical_data_yahoo(days=DAYS)

if data.empty:
print("No se pudieron obtener datos históricos.")
return

# Calcular la volatilidad diaria
print("Calculando volatilidad diaria...")
data['btc_volatility'] = calculate_volatility(data, 'btc_price')
data['market_volatility'] = calculate_volatility(data, 'market_price')

# Alinear los datos de volatilidades
data = data.drop_duplicates(subset='date') # Asegurarse de que las fechas sean únicas
volatility_df = data[['date', 'btc_volatility', 'market_volatility']].dropna().set_index('date')

# Calcular la correlación entre las volatilidades
print("Calculando la correlación entre volatilidades...")
correlation_volatility = volatility_df['btc_volatility'].corr(volatility_df['market_volatility'])

print(f"Correlación entre la volatilidad de BTC y el mercado de criptomonedas (últimos {DAYS} días): {correlation_volatility}")

# Graficar las volatilidades
plt.figure(figsize=(14, 7))
plt.plot(volatility_df.index, volatility_df['btc_volatility'], label='Volatilidad BTC', alpha=0.7)
plt.plot(volatility_df.index, volatility_df['market_volatility'], label='Volatilidad del Mercado Cripto', alpha=0.7)
plt.title('Volatilidad Diaria: BTC vs Mercado de Criptomonedas (Varios Tokens)')
plt.xlabel('Fecha')
plt.ylabel('Volatilidad (Desviación Estándar)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

if __name__ == "__main__":
main()
Fundamental Analysis

免責事項