מערכת חיפוש רשת לאופטימיזציית פרמטרים של אסטרטגיה
פיתחתם אסטרטגיה המבוססת על ממוצעים נעים. תקופות 5/15 מניבות תשואה אחת, 7/21 אחרת. באיזה לבחור? ניסוי וטעייה ידני — 50 שילובים, כל בדיקה לאחור דקה — יותר משעה. מה אם יש לכם חמישה פרמטרים? 10^5 שילובים — שנה של עבודה. אנו פותרים זאת עם חיפוש רשת ב-10 דקות, מבטיחים את האופטימום הגלובלי במרחב הפרמטרים וחוסכים עד 80% זמן.
כיצד חיפוש רשת פותר את בחירת הפרמטרים
המערכת סורקת באופן מקיף את כל השילובים של פרמטרים בטווחים שציינתם. עבור כל שילוב, היא מריצה בדיקה לאחור ומדרגת תוצאות לפי המדד שבחרתם — לדוגמה, יחס שארפ או תשואה שנתית. אתם מקבלים לא רק את הפרמטרים הטובים ביותר, אלא טבלה מלאה של כל השילובים לניתוח מעמיק יותר. זה עוזר להעריך יציבות ולהימנע מהתאמת יתר.
יישום בסיסי ודוגמה
import itertools from multiprocessing import Pool import pandas as pd from typing import Callable, Any def grid_search( backtest_fn: Callable[[dict], dict], param_grid: dict[str, list], n_jobs: int = -1, metric: str = 'sharpe_ratio', ) -> pd.DataFrame: param_names = list(param_grid.keys()) param_values = list(param_grid.values()) all_combinations = list(itertools.product(*param_values)) print(f"Total combinations: {len(all_combinations)}") print(f"Estimated time: ~{len(all_combinations) * 0.5:.0f} seconds") def run_single(params_tuple) -> dict: params = dict(zip(param_names, params_tuple)) try: metrics = backtest_fn(params) return {**params, **metrics} except Exception as e: return {**params, 'error': str(e), metric: float('-inf')} if n_jobs == 1: results = [run_single(combo) for combo in all_combinations] else: with Pool(processes=n_jobs if n_jobs > 0 else None) as pool: results = pool.map(run_single, all_combinations) df = pd.DataFrame(results) df = df[df.get('error').isna()] if 'error' in df.columns else df return df.sort_values(metric, ascending=False) import pandas as pd from functools import partial ohlcv = load_historical_data('BTC/USDT', '2023-01-01', '2024-01-01') def backtest_ema_crossover(params: dict) -> dict: backtester = Backtester(commission=0.001, slippage=0.0005) result = backtester.run( strategy_class=EMACrossoverStrategy, params=params, data=ohlcv, initial_cash=100_000, ) return { 'sharpe_ratio': result.metrics.sharpe_ratio, 'annual_return': result.metrics.annual_return_pct, 'max_drawdown': result.metrics.max_drawdown_pct, 'win_rate': result.metrics.win_rate, 'total_trades': result.metrics.total_trades, } param_grid = { 'fast_period': [5, 7, 9, 12], 'slow_period': [15, 21, 30, 50], 'rsi_threshold': [25, 30, 35, 40], 'stop_loss_pct': [0.02, 0.03, 0.05], } results = grid_search(backtest_ema_crossover, param_grid, n_jobs=8, metric='sharpe_ratio') print(results.head(10)[['fast_period', 'slow_period', 'rsi_threshold', 'stop_loss_pct', 'sharpe_ratio', 'annual_return']]) ניתוח תוצאות והדמיה
ניתן לנתח תוצאות חיפוש רשת עם מפות חום. להלן פונקציה להדמיית התלות של מדד בשני פרמטרים.
import matplotlib.pyplot as plt import seaborn as sns def plot_parameter_heatmap(results: pd.DataFrame, param1: str, param2: str, metric: str): pivot = results.pivot_table( values=metric, index=param1, columns=param2, aggfunc='max', ) plt.figure(figsize=(10, 8)) sns.heatmap(pivot, annot=True, fmt='.2f', cmap='RdYlGn', center=0) plt.title(f'{metric} by {param1} and {param2}') plt.tight_layout() plt.savefig(f'heatmap_{param1}_{param2}.png', dpi=150) מפות חום עוזרות לזהות במהירות אזורים של ערכים אופטימליים. אם יחס שארפ גבוה מופיע רק באזור צר, זה מאותת על התאמת יתר אפשרית. אנו ממליצים לבחון את 5 השילובים המובילים ולבדוק את יציבותם על קבוצת דגימה מחוץ למדגם.
מה כלול בפיתוח חיפוש הרשת
| שלב | תוצאה |
|---|---|
| ניתוח אסטרטגיה | הגדרת פרמטרים, טווחים ומדד מטרה. זיהוי היפרפרמטרים הדורשים כוונון. |
| עיצוב ארכיטקטורה | עיצוב המערכת תוך התחשבות בבודק האחורי שלכם ובמחסן הטכנולוגי (Python, NumPy, Foundry וכו'). |
| יישום | כתיבת קוד עם מחשוב מקבילי, רישום לוג, הדמיה. שילוב הגנות סטנדרטיות נגד התאמת יתר. |
| בדיקות | אימות על נתונים היסטוריים, השוואה לקו בסיס, הרצת מבחני עמידות. |
| תיעוד והדרכה | מסירת קוד מקור, הוראות התקנה, מפגש צוות בן שעתיים. מתן שבועיים של תמיכה. |
הגנה מפני התאמת יתר
התאמת יתר היא הסכנה העיקרית בעת אופטימיזציית פרמטרים. אנו מיישמים מספר טכניקות:
- חלוקת נתונים: 70% לאימון לאופטימיזציה, 15% לאימות לבדיקת 5 השילובים המובילים, 15% לבדיקה לאישור סופי.
- מספר מינימלי של עסקאות: פסילת שילובים עם פחות מ-30 עסקאות — חוסר מובהקות סטטיסטית.
- בדיקת יציבות: הבטחה ששינויים קטנים בפרמטרים (לדוגמה, fast_period מ-9 ל-10) אינם גורמים לירידות חדות במדד.
def split_data_temporal(data: pd.DataFrame, train_pct=0.7, val_pct=0.15): n = len(data) train_end = int(n * train_pct) val_end = int(n * (train_pct + val_pct)) return data[:train_end], data[train_end:val_end], data[val_end:] train, validation, test = split_data_temporal(ohlcv) results = grid_search(lambda p: backtest_fn(p, train), param_grid) # Топ-5 параметров тестируем на validation top_params = results.head(5) for _, row in top_params.iterrows(): val_result = backtest_fn(row.to_dict(), validation) print(f"Params: {row.to_dict()}, Val Sharpe: {val_result['sharpe_ratio']:.2f}") # Финальный тест на test set — один раз, выбранными параметрами אנו כוללים גם אימות צולב ליציבות: חלוקת ההיסטוריה למספר תקופות ואימות שהפרמטרים האופטימליים עובדים בתנאי שוק שונים. זה מפחית את הסיכון לירידות ביצועים בלתי צפויות במסחר חי.
מדוע חיפוש רשת על פני שיטות אחרות?
| שיטה | הבטחת אופטימום גלובלי | מהירות עם 3–4 פרמטרים | מהירות עם 5+ פרמטרים | פשטות יישום |
|---|---|---|---|---|
| חיפוש רשת | כן (בתוך הרשת) | גבוהה | נמוכה | גבוהה |
| אופטימיזציה בייסיאנית | לא | בינונית | גבוהה | בינונית |
| אלגוריתם גנטי | לא | בינונית | גבוהה | נמוכה |
חיפוש רשת הוא פשוט ואמין יותר מאופטימיזציה בייסיאנית כאשר מספר הפרמטרים הוא עד 4. עבור אסטרטגיות עם 2–4 פרמטרים, זו הבחירה האופטימלית. עבור 5+ פרמטרים, אנו ממליצים לעבור לאופטימיזציה בייסיאנית. כפי ש-ויקיפדיה מציינת, חיפוש רשת הוא שיטה מקיפה המבטיחה את השילוב הטוב ביותר בתוך הרשת המוגדרת.
תהליך, לוח זמנים ומחיר
- אנליטיקה — אנו לומדים את האסטרטגיה שלכם, מגדירים פרמטרים, טווחים ומדד אופטימיזציה. מזהים היפרפרמטרים הדורשים כוונון.
- עיצוב — פיתוח ארכיטקטורת חיפוש הרשת, מותאמת לבודק האחורי ולמחסן הטכנולוגי שלכם (Python, Foundry וכו').
- יישום — כתיבת קוד עם מחשוב מקבילי, רישום לוג והדמיה.
- בדיקות — אימות על נתונים היסטוריים, השוואה לקו בסיס, יישום הגנה מפני התאמת יתר.
- פריסה — מסירת המערכת, תיעוד והדרכת צוות (1–2 שעות).
לוח זמנים: 3 עד 10 ימים בהתאם למורכבות האסטרטגיה ומספר הפרמטרים. מחיר: מחושב באופן אישי — העלות המדויקת נקבעת לאחר ניתוח המשימה שלכם.
הזמינו מערכת חיפוש רשת מותאמת אישית — ניישם אותה בהתאמה לאסטרטגיה שלכם. קבלו ייעוץ: צרו קשר כדי להעריך את המשימה שלכם.







