Me cuesta entender cómo funciona la cointegración. Básicamente estoy tratando de encontrar pares cointegrados en el mercado de criptomonedas, así que hago lo siguiente:
- Obtenga los datos OHLC para los dos mercados (estoy obteniendo 5k velas en el marco temporal de 5m)
- Obtenga los rendimientos del registro para los dos mercados
- Compruebe el valor p cuando busque la cointegración entre los retornos logarítmicos
El problema con mi código es que siempre obtengo valores p muy bajos, sin importar el mercado que pruebe, y en algunos mercados el valor p es 0.
Aquí está mi código:
import pandas as pd
import json
import numpy as np
import requests
import time
import json
import mplfinance as mpf
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import statsmodels.tsa.stattools as ts
import threading
import scipy
import pandas_ta as ta
import ccxt
from pykalman import KalmanFilter
ftx = ccxt.ftx()
def get_ohlc_ccxt(market, timeframe):
data = ftx.fetch_ohlcv(market, timeframe, limit=5000)
ohlcv = pd.DataFrame(data, columns=['time', 'open', 'high', 'low', 'close', 'volume'])
ohlcv = ohlcv.drop_duplicates(subset=['time', 'open', 'high', 'low', 'close', 'volume'], keep='first')
ohlcv['time'] = ohlcv['time'].astype('int64')
ohlcv['time'] = ohlcv['time']/1000
ohlcv['date'] = pd.to_datetime(ohlcv['time'], unit='s')
ohlcv = ohlcv.set_index(pd.DatetimeIndex(ohlcv['date']))
return ohlcv
def check_pair(first_market, second_market, timeframe):
first = get_ohlc_ccxt(first_market, timeframe)
second = get_ohlc_ccxt(second_market, timeframe)
if len(first) != len(second):
length = min(len(first), len(second))
first = first.iloc[-length:]
second = second.iloc[-length:]
x = first['close'].to_numpy()
y = second['close'].to_numpy()
first['logret'] = first.ta.log_return()
second['logret'] = second.ta.log_return()
xr = first['logret'].fillna(0)
yr = second['logret'].fillna(0)
coint = ts.coint(xr.to_numpy(), yr.to_numpy())
p_value = coint[1]
print('Cointegration:', first_market, second_market, p_value)
spread = xr-yr
return first, second
data = check_pair('BTC-PERP', 'ETH-PERP', '5m')
En este caso el valor p es 8.94059749424772e-29
. Si pruebo otros mercados (como BTC-LINK, o BTC-LTC y así sucesivamente) el valor p siempre será increíblemente bajo. ¿Puede alguien ayudarme a encontrar lo que estoy haciendo mal?