Оптимізація параметрів торгової стратегії
При розробці торгових алгоритмів для крипторинку ключова складність — не написати логіку, а підібрати параметри, стійкі до зміни режимів. Без системного підходу 70% стратегій на тестовій історії демонструють високу дохідність, але провалюються в реальній торгівлі через overfitting. Наша команда блокчейн-інженерів із багаторічним досвідом у криптотрейдингу та DeFi оптимізувала понад 50 стратегій — середній приріст Sharpe становив 0.8–1.2 після налаштування. Ми гарантуємо робастність параметрів і надаємо повну документацію.
Чому оптимізація параметрів критична для криптотрейдингу?
Крипторинок екстремально волатильний: денні рухи 5–10% — норма. Стратегія, яка працює на історії, може розоритися при зміні режиму (бичачий → ведмежий). Без коректної оптимізації та out-of-sample валідації ви ризикуєте прийняти шум за сигнал. Overfitting на крипті трапляється в 70% випадків при стандартному Grid Search — це втричі частіше, ніж на фондовому ринку.
Що таке overfitting і чому це критично
Стратегія з EMA(9, 21) дає Sharpe 1.2 на історії. Оптимізатор перебирає всі комбінації EMA(5–50) і знаходить EMA(13, 34) з Sharpe 2.8. Відмінний результат? Ні — це overfitting. Параметри підігнані під конкретний історичний період. На реальних даних стратегія покаже результат, близький до випадкового.
Правило: оптимізуй на train set, валідуй на hold-out (out-of-sample) test set. Якщо на test set результат значно гірший — overfitting. Наші інженери завжди перевіряють робастність через walk-forward, що підтверджено багаторічною практикою.
Що таке walk-forward оптимізація?
Найнадійніший метод для часових рядів:
def walk_forward_optimization(data: pd.DataFrame, strategy_class, param_grid: dict, train_periods: int = 180, # днів test_periods: int = 30) -> list: results = [] start = 0 while start + train_periods + test_periods <= len(data): train = data.iloc[start:start + train_periods] test = data.iloc[start + train_periods:start + train_periods + test_periods] # Оптимізація на train best_params = optimize_on_period(strategy_class, train, param_grid) # Валідація на test (OOS) oos_result = run_backtest(strategy_class, test, best_params) results.append({ 'period': test.index[0], 'params': best_params, 'oos_sharpe': oos_result.sharpe, 'oos_return': oos_result.total_return, }) start += test_periods # зсуваємо вікно return results Walk-forward: оптимізуєш на 6 місяцях, тестуєш на наступному місяці, зсуваєшся на місяць вперед, повторюєш. Фінальний результат — медіана OOS Sharpe за всіма вікнами.
Як ми оптимізуємо параметри: наш процес
- Збір даних: мінімум 3–5 років історії, різні ринкові режими (бичачий, ведмежий, боковик). Для крипти використовуємо дані з бірж Binance, Bybit — глибинна ліквідність важлива.
- Розбивка: 70% train, 30% test (хронологічно, не випадково).
- Оптимізація на train: використовуємо Bayesian (Optuna) для >4 параметрів, Grid для малого простору. 100–500 ітерацій.
- Валідація на test: якщо OOS Sharpe < 50% від IS Sharpe — ймовірно overfitting.
- Walk-forward check: 12–24 вікна для додаткової стійкості.
- Sensitivity analysis: перевірка робастності параметрів.
Що входить у нашу роботу
- Повний пайплайн оптимізації з використанням Foundry/Hardhat для DeFi-стратегій
- Документація з графіками sensitivity та walk-forward
- Доступ до коду та CI/CD пайплайну
- Навчання вашої команди підтримці стратегії
- Гарантія на робастність (перевірка на 3 незалежних періоди)
Зв'яжіться з нами, щоб отримати консультацію щодо вашої стратегії — ми оцінимо проект і запропонуємо оптимальний підхід. Замовте оптимізацію вашої стратегії — ми проведемо повний цикл у стислі терміни з гарантією робастності.
Порівняння методів пошуку:
| Метод | Швидкість | Точність | Застосовність |
|---|---|---|---|
| Grid Search | Швидко для <100 комбінацій | Низька | 2–3 параметри |
| Bayesian (Optuna) | Повільно, але ефективно | Висока | >3 параметрів |
| Random Search | Середньо | Середня | Дослідження простору |
Методи пошуку параметрів
Grid Search
Повний перебір усіх комбінацій. Простий, але експоненційно дорогий при великій кількості параметрів.
from itertools import product import vectorbt as vbt param_grid = { 'rsi_period': range(7, 21), # 14 значень 'rsi_lower': range(20, 40, 5), # 4 значення 'rsi_upper': range(65, 80, 5), # 3 значення } # Разом: 14 * 4 * 3 = 168 комбінацій — прийнятно # Vectorbt — векторизований backtesting, 168 комбінацій за секунди RSI = vbt.IndicatorFactory.from_pandas_ta("rsi") rsi = RSI.run(close, length=vbt.Param(param_grid['rsi_period'])) Bayesian Optimization
Розумніший за grid search: будує сурогатну модель функції якості і вибирає наступну точку для перевірки на основі exploration/exploitation balance. Потребує менше ітерацій для хорошого результату. Bayesian оптимізація в 3–5 разів ефективніша за Grid Search за кількістю ітерацій для досягнення тієї самої якості. Використовуємо бібліотеку Optuna.
from optuna import create_study def objective(trial): rsi_period = trial.suggest_int('rsi_period', 5, 30) rsi_lower = trial.suggest_int('rsi_lower', 20, 40) rsi_upper = trial.suggest_int('rsi_upper', 60, 85) result = backtest_strategy(data, rsi_period, rsi_lower, rsi_upper) return result.sharpe_ratio # максимізуємо study = create_study(direction='maximize', sampler=optuna.samplers.TPESampler()) study.optimize(objective, n_trials=200, n_jobs=4) print(f"Best params: {study.best_params}") print(f"Best Sharpe: {study.best_value:.3f}") Optuna — чудова бібліотека для Bayesian optimization. Паралельний пошук, pruning (рання зупинка поганих trials), візуалізація importance параметрів.
Метрики для оптимізації
Не оптимізуй під total return — це провокує високий ризик. Кращі targets:
| Метрика | Формула | Коментар |
|---|---|---|
| Sharpe Ratio | (Return - Rf) / Std | Золотий стандарт |
| Calmar Ratio | Annual Return / Max Drawdown | Хороший для трендових |
| Sortino Ratio | Return / Downside Std | Штрафує тільки збитки |
| Profit Factor | Gross Profit / Gross Loss | Простий, інтуїтивний |
Комбінуй метрики: score = sharpe * 0.5 + calmar * 0.3 + win_rate * 0.2. Це знижує шанс вибрати стратегію, хорошу за одним параметром і погану за іншими.
Параметрична робастність
Хороша стратегія працює при невеликих відхиленнях параметрів від оптимуму. Перевірка:
def check_robustness(best_params: dict, data: pd.DataFrame, delta_pct: float = 0.2): """Перевіряємо, чи працює стратегія при ±20% зміні параметрів""" results = [] for param, value in best_params.items(): for multiplier in [0.8, 0.9, 1.0, 1.1, 1.2]: test_params = best_params.copy() test_params[param] = int(value * multiplier) result = backtest_strategy(data, **test_params) results.append({'param': param, 'multiplier': multiplier, 'sharpe': result.sharpe}) return pd.DataFrame(results) Якщо Sharpe різко падає при зміні RSI з 14 на 13 або 15 — це ознака overfitting. Хороша стратегія показує плавну sensitivity криву.
Оптимізація параметрів — це процес, а не разова дія. Під ключ ми проводимо повний цикл у стислі терміни з гарантією на робастність. Отримайте консультацію: оцінимо вашу стратегію і запропонуємо план оптимізації. Зв'яжіться з нами, щоб почати.







