Розробка кількісних стратегій — від гіпотези до виробництва

Створення прибуткової торгової стратегії вимагає більше, ніж інтуїції. Потрібні перевірені гіпотези, ретельний бектестинг та обережна оптимізація, щоб уникнути підгонки під дані. Цей посібник проведе вас через створення кількісної стратегії з перших принципів — тієї ж методології, яка лежить в основі алгоритмів Smart Money API.

Критичний принцип: 95% трейдерів зазнають невдачі, тому що оптимізують на вхідних даних. Стратегія, яка повертає 200% на історичних даних, швидше за все, буде збитковою в реальному часі. Навчіться уникати цієї пастки.

Етап гіпотези

Почніть з перевірного твердження

Кожна стратегія починається з конкретної, перевірної гіпотези. Не "BTC іноді росте", а "Коли фандінг-рейти позитивні І консенсус китов на лонг перевищує 65%, наступна 4-годинна свічка закривається вище з ймовірністю 56%."

Хороші гіпотези:

Погані гіпотези:

Визначте свою перевагу

Що ви знаєте, що ринок ще не враховує? Для Smart Money API це: "Консенсус китів змінюється за 2-4 години до реакції ринку. Якщо ми відстежуємо топ-250 гаманців у реальному часі, ми можемо передбачити рух."

Фреймворк стратегії

1. Умови входу

Коли ви входите? Будьте конкретні:

Python — Логіка входу
# Стратегія: Консенсус китів + Конфлюенс деривативів
def should_enter_long(symbol, bar):
# Умова 1: Консенсус китів > 65% лонг
whale_long_pct = get_whale_consensus(symbol)
cond_whale = whale_long_pct > 0.65
# Умова 2: Фандінг-рейт позитивний і зростає
fr_current = get_funding_rate(symbol)
fr_previous = get_funding_rate(symbol, offset=1)
cond_fr = (fr_current > 0) and (fr_current > fr_previous)
# Умова 3: LSR > 1.25 (більше лонгів, ніж шортів)
lsr = get_long_short_ratio(symbol)
cond_lsr = lsr > 1.25
# Умова 4: Ціна вище 50-денної MA (контекст аптренду)
ma_50 = get_sma(symbol, 50)
cond_trend = bar.close > ma_50
return cond_whale and cond_fr and cond_lsr and cond_trend

2. Умови виходу

Коли ви закриваєте? Визначте цілі прибутку та стопи:

Python — Логіка виходу
def should_exit_long(entry_price, current_price, time_in_trade):
pnl_pct = (current_price - entry_price) / entry_price
# Фіксувати прибуток на +2%
if pnl_pct > 0.02:
return True, "profit_target"
# Стоп-лос на -1%
if pnl_pct < -0.01:
return True, "stop_loss"
# Вихід за часом: закрити через 4 години
if time_in_trade > timedelta(hours=4):
return True, "time_exit"
return False, None

3. Розмір позиції

Скільки ви ризикуєте на угоду? Використовуйте критерій Келлі або фіксоване дробове ставкування:

Python — Розмір позиції
def calculate_position_size(account_balance, win_rate, avg_win, avg_loss):
# Критерій Келлі: f* = (p*b - q) / b
# p = ймовірність перемоги, b = співвідношення перемог/поразок, q = ймовірність поразки
p = win_rate
q = 1 - win_rate
b = avg_win / avg_loss
kelly_fraction = (p * b - q) / b
# Використовуйте 25% від Келлі для консервативності (уникнення банкрутства)
position_fraction = kelly_fraction * 0.25
risk_amount = account_balance * position_fraction
return risk_amount

Створення бектестера

Подієво-орієнтований бектест-двигун

Python — Фреймворк бектесту
class BacktestEngine:
def __init__(self, initial_capital=10000):
self.capital = initial_capital
self.trades = []
self.equity_curve = []
def run(self, дані, стратегія):
for i, бар in enumerate(data):
# Перевірте умови виходу для відкритих угод
for угода in self.trades:
should_close, reason = trade.check_exit(bar.close)
if should_close:
pnl = (bar.close - trade.entry_price) * trade.size
self.capital += pnl
self.trades.remove(trade)
# Перевірте умови входу
if strategy.should_enter(bar):
size = calculate_position_size(...)
trade = Trade(entry_price=bar.close, size=size)
self.trades.append(trade)
self.equity_curve.append(self.capital)
return self.calculate_metrics()

Ключові метрики бектестингу

Уникнення надмірної оптимізації

Пастка надмірного налаштування

Якщо ви налаштовуєте параметри на історичних даних, доки прибуток не становитиме 200%, ви будете розчаровані в реальному часі. Використовуйте суворе тестування на вибіркових даних:

Валідація з прогресуючим тестуванням: Оптимізуйте на 1 році даних, тестуйте на наступних 3 місяцях. Потім оптимізуйте на роках 2-3, тестуйте на 3 кварталі року. Повторіть на всій базі даних. Повідомляйте лише результати на вибіркових даних.

Чутливість параметрів

Тестуйте кілька комбінацій параметрів за допомогою пошуку по сітці, але штрафуйте за складність:

Python — Пошук по сітці з прогресуючим тестуванням
def walk_forward_optimization(data, param_ranges):
results = []
train_window = 252 # 1 рік щоденних даних
test_window = 63 # 3 місяці
for i in range(0, len(data) - train_window - test_window, test_window):
train_data = data[i:i+train_window]
test_data = data[i+train_window:i+train_window+test_window]
# Оптимізуйте на навчальних даних
best_params = None
best_return = -float('inf')
for params in param_combinations(param_ranges):
backtest_result = backtest(train_data, params)
if backtest_result.return_pct > best_return:
best_return = backtest_result.return_pct
best_params = params
# Тестуйте на невидимих даних
oos_result = backtest(test_data, best_params)
results.append({"is": best_return, "oos": oos_result.return_pct})
return results

Перехід до виробництва

Спочатку торгівля на папері

Перш ніж ризикувати реальним капіталом, торгуйте на папері (симульовано) протягом 2-4 тижнів. Ваша жива стратегія буде працювати на 5-15% гірше, ніж бектест, через прослизання, затримки та виконання. Якщо торгівля на папері близько відповідає бектесту, ви готові.

Управління ризиками в реальній торгівлі

Реальна торгівля відрізняється. Встановіть жорсткі обмеження:

Інтеграція з Smart Money API

Використовуйте наші бали підтвердження як попередній фільтр або множник на ваших сигналах:

Python — Інтеграція з API
import requests
def execute_with_confirmation(symbol, direction, signal_strength):
# Отримайте підтвердження від Smart Money
response = requests.get(
f"https://api.smartmoneyapi.com/v1/confirm?symbol={symbol}&direction={direction}",
headers={"X-API-Key": API_KEY}
)
data = response.json()
# Застосуйте множник розміру на основі впевненості Smart Money
if data["confidence"] == ВИСОКИЙ:
position_size = base_size * 1.5
elif data["confidence"] == СЕРЕДНІЙ:
position_size = base_size * 1.0
elif data["confidence"] == НИЗЬКИЙ:
position_size = base_size * 0.5
elif data["confidence"] == ВЕТО:
return "SKIP" # Не торгувати
# Виконати угоду з фінальним розміром
execute_order(symbol, direction, position_size)

Створюйте кращі стратегії з сигналами Smart Money

Поєднуйте відстеження китів, аналітику деривативів та ончейн-метрики у своїх кількісних моделях. Протестовані стратегії покращуються на 5-8% при додаванні підтвердження Smart Money.

Почати безкоштовне тестування →