Перейти к содержимому
Все стратегии

Стратегии

SPY Откат на бычьем рынке: контртрендовая стратегия (точный перенос pinkfish «ac-countertrend» Farrell Aultman) — только длинные позиции, весь капитал, DAILY баров, SPY.USEQ

Итог: Отменено

SpyAcCountertrendPullback

Сводка по итогам

SpyAcCountertrendPullback перенёс стратегию покупки просадок на бычьем рынке «ac-countertrend» из pinkfish на дневные SPY.USEQ, без изменений сохранив правила, настройки по умолчанию и особенность расчёта отката в исходнике. Было выполнено 3 итераций, но тестовая среда Layer 3 неоднократно превышала лимит времени 300 с. В последней версии обновления для каждого бара уже выполнялись за O(1), а разработчик отметил, что время, по всей видимости, тратилось вне кода стратегии. Запуск прервали в цикле верификации до получения метрик бэктеста, поэтому сама гипотеза так и не была проверена.

Гипотеза

Построчный перенос примера торговой стратегии pinkfish «ac-countertrend» с лицензией MIT, созданного Farrell Aultman (https://github.com/fja05680/pinkfish/blob/18a0d557ead25e0e82de3ece86bcab6c325a59ed/examples/strategies/ac-countertrend/strategy.py). Заслуга за стратегию принадлежит Farrell Aultman. В исходнике торгуют SPY на дневных барах. На нашей платформе этот инструмент представлен как SPY.USEQ; доступны десятилетия дневных данных с поправкой на дробление акций, нулевые комиссии и около 0.02-0.05% спреда с……Показать большеСвернуть

Построчный перенос примера торговой стратегии pinkfish «ac-countertrend» с лицензией MIT, созданного Farrell Aultman (https://github.com/fja05680/pinkfish/blob/18a0d557ead25e0e82de3ece86bcab6c325a59ed/examples/strategies/ac-countertrend/strategy.py). Заслуга за стратегию принадлежит Farrell Aultman. В исходнике торгуют SPY на дневных барах. На нашей платформе этот инструмент представлен как SPY.USEQ; доступны десятилетия дневных данных с поправкой на дробление акций, нулевые комиссии и около 0.02-0.05% спреда с учётом влияния на цену за полный цикл сделки. Поэтому адаптировать площадку или комиссии не требуется. Это не несовпадение режимов комиссий, из-за которого провалились переносы FMZ (вывод 167). Механизм: при восходящем тренде (EMA-дневный 40 выше EMA-дневного 80) купить на снижении ниже максимальной цены закрытия за 20 дней. Выйти при отскоке выше SMA за 20, по стопу, при смене режима или по истечении лимита в 20 баров. Только длинные позиции, одна позиция, большую часть времени без позиции. Все индикаторы используют дневной CLOSE и рассчитываются точно как в исходнике: ema_fast = EMA(close, 40); ema_slow = EMA(close, 80) (pinkfish.EMA — это TA-Lib EMA, инициализированный SMA первых N цен закрытия); bull = ema_fast > ema_slow; daily_std = скользящее выборочное стандартное отклонение цены закрытия за 40 баров (ddof=1, значение pandas по умолчанию) от close.pct_change(); high_close = скользящий максимум close за 20 баров, не включая текущий бар INCLUDING; pullback = (high_close - close) / daily_std; exit_ma = SMA(close, 20). Разогрев: торговля не ведётся, пока все индикаторы не перестанут иметь значение NaN (исходник отбрасывает строки с NaN, около 81 баров). DEFAULT PARAMETERS EXACTLY AS WRITTEN: std_period=40, high_period=20, ema_fast=40, ema_slow=80, hold_period=20, min_pullback=3.0, exit_ma=20, stop_loss_pct=0.15, exit_on_bear=True, margin=1 (без кредитного плеча), use_adj=False. SOURCE QUIRK THE DEVELOPER MUST KEEP (не «исправляйте» это): pullback делит расстояние в DOLLAR (high_close - close) на безразмерное стандартное отклонение доходности (около 0.01 для SPY), поэтому это NOT настоящий z-показатель. Если SPY около $500, а daily_std около 1%, для pullback >= 3.0 достаточно, чтобы цена закрытия была примерно на $0.03-0.15 ниже максимальной цены закрытия за 20 дней. На практике сигнал на вход срабатывает почти при любом закрытии ниже максимума за 20 дней, когда рынок находится в бычьем режиме. В переносе эта формула сохранена без изменений. Вариант с согласованными единицами (деление на close*daily_std) был бы SEPARATE гипотезой, а не этой. Размер позиции: весь капитал, то есть 100% средств счёта (pinkfish margin=1 → плечо 1.0), целыми акциями: floor(equity / price). Комиссии: у USEQ нулевая комиссия; наш движок моделирует спред и влияние на цену. Ожидаемая доля дней без позиции — около 55-70%, поскольку стратегия выходит при первом закрытии выше SMA20.

В итерации 3 исправлена вторая ошибка Layer-3 sandbox_timeout. Правила, индикаторы и параметры не менялись, выходные сигналы численно совпадают с v2 (максимальное относительное различие около 3e-15 на 3,000 тестовых барах). Диагностика урока 155(c): версия v2 уже обрабатывала каждый бар за O(1). В окне всего около 1,650 дневных баров — при нагрузке хоста около 50 на обработку стратегии уйдёт меньше 1 с. Значит, реальное время, скорее всего, тратится на каталог/движок вне стратегии (тот же вывод, что и при диагностике тайм-аута Eth/Bnb v3). Тем не менее обработка каждого бара стала ещё дешевле: скользящее стандартное отклонение доходности и выход SMA используют накопительные суммы вместо копирования списков и повторного суммирования на каждом баре. Скользящий максимум close за 20 баров вычисляется перебором дека из фиксированных 20 элементов, а EMA задаются начальным значением один раз, затем обновляются рекурсивно. Если запуск снова завершится по тайм-ауту, причина — работа песочницы или нагрузка на хост, а не код стратегии.

verification_loop: sandbox_timeout: верификация не пройдена (Layer 3 — бэктест в песочнице): дымовой тест превысил лимит реального времени 300 с на окне примерно в 20000 баров (2400 дней по SPY.USEQ-1-DAY-LAST-EXTERNAL). Почти всегда это означает, что работа на каждом баре растёт вместе с длиной истории — например, повторное сканирование всего ряда funding/дополнительных данных или создание списка и вызов min()/sorted() внутри calculate_signal()/on_bar() на каждом баре. Заранее вычисли отсортированные массивы временных меток ONCE в __init__ и используй bisect либо кэшируй результаты поиска по временной метке, чтобы стоимость обработки бара была O(log n), а не O(n).

Реализация

Точный перенос pinkfish «ac-countertrend» в Stratmill (Farrell Aultman, MIT) на дневных барах SPY.USEQ. В бычьем режиме (SMA, похожая на TA-Lib, с начальным значением по EMA40 > EMA80) покупает на весь капитал (целые акции, плечо 1), когда pullback = (максимум закрытия за 20 дней, включая текущий бар - close) / выборочное стандартное отклонение pct_change за 40 баров >= 3.0 (сохранена особенность исходника: доллары делятся на безразмерную величину). Выход при смене режима на медвежий, close > SMA20, close < entry*(1-0.15) или после 20 баров в позиции.

Результаты верификации

sandbox_timeout: верификация не пройдена (Layer 3 — бэктест в песочнице): дымовой тест превысил лимит реального времени 300 с на окне примерно в 20000 баров (2400 дней по SPY.USEQ-1-DAY-LAST-EXTERNAL). Почти всегда это означает, что работа на каждом баре растёт вместе с длиной истории — например, повторное сканирование всего ряда funding/дополнительных данных или создание списка и вызов min()/sorted() внутри calculate_signal()/on_bar() на каждом баре. Заранее вычисли отсортированные массивы временных меток ONCE в __init__ и используй bisect либо кэшируй результаты поиска по временной метке, чтобы стоимость обработки бара была O(log n), а не O(n).

Сводка по итогам

Разработчик уже сократил работу на каждом баре до O(1), используя накопительные суммы и декы фиксированного размера. В его заметках указано, что время тратилось вне кода стратегии — на каталог/движок при высокой нагрузке на хост. Поэтому повторные тайм-ауты песочницы на USEQ дневных барах следует проверять как проблему инфраструктуры, а не пытаться решить новыми переписываниями кода.

Запуск прервали в цикле верификации после 3 итераций. Решающее препятствие: бэктест в песочнице Layer 3 превысил лимит реального времени 300 с на дневном окне 20,000 баров (~2,400 дней) по SPY.USEQ. До проверки бэктеста, оптимизации, анализа аналитиком и оценки рисков дело не дошло.

Точный перенос стратегии Farrell Aultman «ac-countertrend» из pinkfish на дневные SPY.USEQ: только длинные позиции, весь капитал; стратегия покупает просадки ниже максимума закрытия за 20 дней, когда EMA(40) > EMA(80), и выходит при закрытии выше SMA(20), срабатывании стопа 15%, смене режима или по истечении 20 баров. Особенность исходного расчёта «pullback»: долларовое значение делится на стандартное отклонение доходности — намеренно сохранена.

Данных о результативности нет: отчёт бэктеста пуст, отчёта об оптимизации нет, доходность, коэффициент Шарпа и число сделок не рассчитывались.

Анализ

ac-countertrend

Stratmill — это инструмент для исследований и бумажной торговли, а не финансовая консультация или брокер. Результаты бэктестов и бумажной торговли являются гипотетическими. Торговля сопряжена с риском убытков.