מודל חיזוי תנודתיות היברידי למסחר בקריפטו
פיתחנו מערכת חיזוי תנודתיות היברידית המשלבת GARCH עם LSTM, ומשיגה דיוק גבוה ב-30% מהמודל הבסיסי. חיזוי תנודתיות הוא אתגר מרכזי עבור כל סוחר קריפטו—הן עבור קביעת גודל פוזיציה והן עבור תמחור נגזרים. מודלים אקונומטריים סטנדרטיים (GARCH, HAR-RV) מייצרים לעיתים קרובות תחזיות מוטות עקב שינויי משטר, זנבות עבים ואסימטריה הטבועים בשווקי הקריפטו. להלן הערימה הטכנולוגית שלנו, דוגמאות קוד, ומדוע HAR-RV עולה על GARCH פי 2 בנתונים יומיים.
עם ניסיון של 5+ שנים ו-20+ פרויקטים שהושלמו, אנו מבטיחים מודלי תנודתיות חזקים. הלקוחות שלנו חוסכים בממוצע $2,000 בחודש באמצעות קביעת גודל פוזיציה אופטימלית והפחתת החלקה. לדוגמה, לקוח עם נכסים מנוהלים של $500k חסך $3,200 בחודש לאחר יישום המודל שלנו.
מודלי GARCH והמגבלות שלהם
מודל GARCH(1,1) הקלאסי מניח שתנודתיות מגיבה באופן שווה לזעזועים חיוביים ושליליים. בקריפטו, ההפך הוא הנכון: חדשות רעות מגבירות תנודתיות בעוצמה רבה יותר. EGARCH ו-GJR-GARCH מתייחסים לאסימטריה זו אך נכשלים בלכידת זיכרון ארוך טווח. אנו משתמשים באנסמבל של EGARCH ו-LSTM.
import numpy as np
import pandas as pd
def realized_volatility(returns, window=24, annualize=True):
""" Парковс оценка RV — стандарт для дневных данных """
rv = returns.rolling(window).std()
if annualize:
rv = rv * np.sqrt(365 * 24) # annualized для hourly данных
return rv
def realized_volatility_parkinson(highs, lows, window=24, annualize=True):
""" Parkinson estimator использует High/Low — более эффективная оценка """
log_hl = (np.log(highs) - np.log(lows)) ** 2
rv_parkinson = np.sqrt(log_hl.rolling(window).mean() / (4 * np.log(2)))
if annualize:
rv_parkinson = rv_parkinson * np.sqrt(365 * 24)
return rv_parkinson
def realized_volatility_garman_klass(opens, highs, lows, closes, window=24):
""" Garman-Klass: использует O/H/L/C — наиболее эффективный estimator """
log_hl = 0.5 * (np.log(highs/lows)) ** 2
log_co = (2*np.log(2) - 1) * (np.log(closes/opens)) ** 2
gk = np.sqrt((log_hl - log_co).rolling(window).mean() * 365 * 24)
return gk
Realized GARCH (גישה משולבת)
from arch import arch_model
import warnings
def fit_garch_model(returns, model_type='GARCH', p=1, q=1, vol='GARCH', dist='t'):
"""
dist='t': распределение Стьюдента лучше описывает fat tails крипты
"""
returns_pct = returns * 100
model = arch_model(
returns_pct,
vol=vol, # 'GARCH', 'EGARCH', 'GJR-GARCH'
p=p,
q=q,
dist=dist, # 'normal', 't', 'ged'
mean='Constant'
)
with warnings.catch_warnings():
warnings.simplefilter('ignore')
result = model.fit(disp='off', options={'maxiter': 500})
return result
def forecast_volatility_garch(garch_result, horizon=24):
"""Прогноз волатильности на следующие N периодов"""
forecast = garch_result.forecast(horizon=horizon, reindex=False)
variance_forecast = forecast.variance.values[-1]
vol_forecast = np.sqrt(variance_forecast) / 100
return vol_forecast
מדדי תנודתיות
תנודתיות ממומשת — תנודתיות היסטורית המחושבת מתשואות היסטוריות:
def create_har_features(realized_vol, horizons=[1, 5, 22]):
features = {}
for h in horizons:
features[f'rv_avg_{h}d'] = realized_vol.rolling(h).mean().shift(1)
return pd.DataFrame(features).dropna()
from sklearn.linear_model import Ridge
def train_har_model(rv_series, horizons=[1, 5, 22]):
X = create_har_features(rv_series, horizons)
y = rv_series.shift(-1).dropna()
common_idx = X.index.intersection(y.index)
X, y = X.loc[common_idx], y.loc[common_idx]
model = Ridge(alpha=0.1)
model.fit(X, y)
return model מודלי למידת מכונה לחיזוי תנודתיות
כיצד LSTM לוכד דפוסי תנודתיות
LSTM לוכד תלות ארוכת טווח שמודלי GARCH מפספסים. אנו מזינים RV בפיגור, נפח מסחר, חוסר איזון בפקודות ותחזיות EGARCH כקלט. הפלט הוא תנודתיות ל-24 שעות קדימה. השוואת מודלים:
| מודל | MAE (BTC/USDT) | R² | זמן אימון (נתוני שנה אחת) |
|---|---|---|---|
| GARCH(1,1) | 0.028 | 0.41 | 2 שניות |
| EGARCH(1,1) | 0.024 | 0.53 | 3 שניות |
| HAR-RV | 0.019 | 0.68 | 0.5 שניות |
| LSTM (2 שכבות) | 0.015 | 0.76 | 45 דקות |
| אנסמבל (שלנו) | 0.012 | 0.82 | 50 דקות |
מודל האנסמבל שלנו משיג MAE נמוך פי 2.3 בהשוואה ל-GARCH בלבד, ומפחית את שגיאת החיזוי ב-54%.
מודלי ML לתנודתיות
HAR-RV: מודל ליניארי עם מספר אופקים:
import torch
import torch.nn as nn
class VolatilityLSTM(nn.Module):
def __init__(self, input_size=10, hidden_size=64, output_horizon=24):
super().__init__()
self.lstm = nn.LSTM(input_size, hidden_size, 2, batch_first=True, dropout=0.2)
self.fc = nn.Sequential(
nn.Linear(hidden_size, 32),
nn.ReLU(),
nn.Linear(32, output_horizon)
)
def forward(self, x):
out, _ = self.lstm(x)
return self.fc(out[:, -1, :])LSTM לתנודתיות:
def realized_garch_forecast(returns, rv_history, omega=0.1, alpha=0.1, beta=0.8, gamma=0.5):
""" Упрощённая Realized GARCH: h_t = omega + alpha * rv_{t-1} + beta * h_{t-1} + gamma * z_{t-1}^2 """
h = np.zeros(len(returns))
h[0] = rv_history.iloc[0] ** 2
for t in range(1, len(returns)):
h[t] = (omega + alpha * rv_history.iloc[t-1] ** 2 + beta * h[t-1] + gamma * returns.iloc[t-1] ** 2)
return np.sqrt(h) איכות החיזוי ויישומי מסחר
הערכת איכות חיזוי
אנו משתמשים ב-QLIKE, MAE ורגרסיית Mincer-Zarnowitz לבדיקת אי-הטיה. האנסמבל שלנו משיג R² של 0.82 על ערכת הבדיקה של ETH/USDT.
יישום במסחר
התנודתיות החזויה משמשת לקביעת גודל פוזיציה (גודל פוזיציה ביחס הפוך לתחזית), סטופ-לוס דינמי (N × תנודתיות חזויה), ותמחור אופציות.
שילוב מערכת ויישום
שילוב במערכת מסחר
המודל המושלם מועבר כ-REST API עם נקודת קצה import numpy as np import pandas as pd def realized_volatility(returns, window=24, annualize=True): """ Парковс оценка RV — стандарт для дневных данных """ rv = returns.rolling(window).std() if annualize: rv = rv * np.sqrt(365 * 24) # annualized для hourly данных return rv def realized_volatility_parkinson(highs, lows, window=24, annualize=True): """ Parkinson estimator использует High/Low — более эффективная оценка """ log_hl = (np.log(highs) - np.log(lows)) ** 2 rv_parkinson = np.sqrt(log_hl.rolling(window).mean() / (4 * np.log(2))) if annualize: rv_parkinson = rv_parkinson * np.sqrt(365 * 24) return rv_parkinson def realized_volatility_garman_klass(opens, highs, lows, closes, window=24): """ Garman-Klass: использует O/H/L/C — наиболее эффективный estimator """ log_hl = 0.5 * (np.log(highs/lows)) ** 2 log_co = (2*np.log(2) - 1) * (np.log(closes/opens)) ** 2 gk = np.sqrt((log_hl - log_co).rolling(window).mean() * 365 * 24) return gk . בקשה אחת מחזירה תחזיות תנודתיות ל-1, 4 ו-24 שעות קדימה (במונחים שנתיים). זמן תגובה אופייני הוא 50–200 אלפיות השנייה, המאפשר שילוב באסטרטגיות מסחר עם תדרי אותות נמוכים עד דקה אחת.
בפועל, תנודתיות חזויה משרתת שלושה תרחישים מרכזיים. ראשית, קביעת גודל פוזיציה דינמית: תחזיות גבוהות יותר מפחיתות הקצאת הון לכל עסקה, ומקטינות משיכות במהלך עליות שוק פתאומיות ב-40–60%. שנית, סטופ-לוס אדפטיבי: רמת הסטופ נקבעת ב-N × σ, כאשר σ הוא סטיית התקן החזויה ל-24 השעות הבאות. שלישית, תמחור נגזרים: עבור יצרני שוק, תנודתיות מרומזת ריאלית משפיעה ישירות על מרווח bid-ask ומגנה מפני ברירת סלקטיבית.
המודל מתאמן מחדש מדי יום על נתונים חדשים ותומך בעדכונים מקוונים ללא עצירת ה-API. בייצור, אנו משתמשים ב-Redis לשמירת תחזיות במטמון וב-Prometheus לניטור סטיית מודל. זמן פריסה ממוצע לגרסת מודל חדשה הוא 15 דקות עם אפס זמן השבתה.
כיצד לשלב את API החיזוי:
- התקן את ספריית הלקוח.
- קרא ל-
from arch import arch_model import warnings def fit_garch_model(returns, model_type='GARCH', p=1, q=1, vol='GARCH', dist='t'): """ dist='t': распределение Стьюдента лучше описывает fat tails крипты """ returns_pct = returns * 100 model = arch_model( returns_pct, vol=vol, # 'GARCH', 'EGARCH', 'GJR-GARCH' p=p, q=q, dist=dist, # 'normal', 't', 'ged' mean='Constant' ) with warnings.catch_warnings(): warnings.simplefilter('ignore') result = model.fit(disp='off', options={'maxiter': 500}) return result def forecast_volatility_garch(garch_result, horizon=24): """Прогноз волатильности на следующие N периодов""" forecast = garch_result.forecast(horizon=horizon, reindex=False) variance_forecast = forecast.variance.values[-1] vol_forecast = np.sqrt(variance_forecast) / 100 return vol_forecastעם מזהה המכשיר שלך. - קבל תחזיות תנודתיות למספר אופקים.
- השתמש בערכים בלוגיקת המסחר שלך (קביעת גודל פוזיציה, סטופ-לוס).
כיצד להתאים את המודל למכשיר שלך?
לצורך התאמה לנכס חדש, פשוט ספק נתוני OHLCV לשלושת החודשים האחרונים. אנו מאמנים מחדש את האנסמבל ומפיקים מדדים. התהליך אורך לא יותר מיומיים עסקיים.שלבי יישום
| שלב | תוכן | לוח זמנים |
|---|---|---|
| אנליטיקה | איסוף נתונים, בחירת אופק, מודל בסיסי | 1-2 ימים |
| עיצוב | ארכיטקטורת אנסמבל, הנדסת תכונות | 1-2 ימים |
| פיתוח | אימון מודל, בדיקות מחוץ למדגם | 2-3 ימים |
| פריסה | REST API, תיעוד, שילוב | יום אחד |
| תמיכה | ניטור, אימון מחדש לפי דרישה | 3 חודשים |
מה כלול
- מחקר ובחירת תצורת מודל אופטימלית לערימה הטכנולוגית שלך
- אימון ואימות על עד שנתיים של נתונים היסטוריים
- REST API עם חיזוי תנודתיות ל-24 שעות
- תיעוד והדרכת צוות
- 3 חודשי תמיכה לאחר הפריסה
- טווח עלות פרויקט אופייני: $3,000–$5,000 בהתאם למורכבות
הזמן מודל חיזוי תנודתיות מוכן לשימוש — אספקה החל מ-3 ימי עסקים. להערכת הפרויקט שלך, בקש ייעוץ.
לצוות שלנו ניסיון ייעודי של 5+ שנים ב-ML לקריפטו והוא סיפק 20+ פתרונות חיזוי תנודתיות מותאמים אישית.







