В этот раз повторим на Python🐍 индикатор KST (Know Sure Thing), созданный Мартином Прингом. Если вы подписаны на StockCharts.com, то вы получаете платную рассылку обзоров рынка от Джона Мэрфи и Мартина Принга. Принг в своих анализах постоянно ссылается на свой индикатор KST. И у него всегда всё складно и точно совпадает.
Я же в бессонных😴 поисках граалей🏆 решил повторить индикатор KST и провести коротенький анализ за предыдущие 14 лет.
Также покрутим ROC (Rate-of-Change) и попробуем выжать из него ещё немного идей. Но всё по порядку.
📈 KST
Индикатор KST (Know Sure Thing) (пер. Знать наверняка) был представлен в далёком 1992 году и активно используется автором по сей день. Состоит KST из четырёх индикаторов ROC разных периодов, сглаженных простой скользящей средней. Конечное значение получается суммированием полученных величин, умноженных на свои веса. Чем больше период ROC, тем больше вес. Сигнальная линия получается сглаживанием KST 9-дневной скользящей средней. Формула:
На графике это выглядит так:
Невооруженным глазом видно, что к таким резким движениям цены данный индикатор не подходит.
🔬Запускаем Quantopian
Протестируем индикатор KST и другие вариации на тему ROC:
- Положение KST относительно нуля.
- Положение KST над сигнальной линией.
- Индикатор силы тренда TSI > 0.5 из этой статьи.
- Положение ROC(5) сглаженного на SMA(200) над нулём. (Благодарю за подсказку в комментариях.)
Общие условия тестов:
- Торгуем SPY.
- Период: 2004-2018.
- Проводим сделку за 1 час до закрытия рынка.
- Капитал 100K.
Код условий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# KST prices = data.history(context.asset, ['close'], 400, '1d') kst, kst_signal = get_kst(prices, [10, 15, 20, 30], [10, 10, 10, 15], 9) allow = 0. <= kst[-1] # ... # KST histogram allow = 0. <= (kst - kst_signal)[-1] # ... # ROC(5) by SMA(200) roc_sma = talib.SMA(talib.ROC(prices.close, timeperiod=5), timeperiod=200) allow = 0. <= roc_sma[-1] # ... def get_kst(df, roc, sma, signal): kst = None for i, v in enumerate(roc): data = talib.SMA(talib.ROC(df.close, timeperiod=v), timeperiod=sma[i]) if kst is None: kst = data * (i + 1) else: kst += data * (i + 1) return kst, talib.SMA(kst, timeperiod=signal) |
Результаты на Quantopian:
- Exposure — время нахождения в позициях.
- Transactions — количество сделок, включая открытие и закрытие.
Как видим, для SPY лидером остаётся пересечение SMA(50) и SMA(200).
🐍Посмотрим на результаты в Jupyter
Эти же стратегии проверим в Jupyter без тестов, лишь расчётом. Так как это быстро, проверим другие ETF на основные индексы и секторы.
- bench — бенчмарк, результат удержания актива в течение всего времени;
- * dd — максимальная просадка при каждом условии;
- kst — удержание при KST больше нуля;
- kst_hist — удержания при KST выше сигнальной линии;
- roc5_200 — удержание при ROC(5), сглаженном на SMA(200) выше нуля;
- tsi — удержание при ROC(200) выше нуля и TSI выше 0,5;
- s50x200 — пересечение SMA(50) и SMA(200).
🏁Вывод
Тесты показали, что KST работает хуже SMA(50) и SMA(200). Приятно удивил приличными результатами ROC(5), усреднённый за 200 дней. Все стратегии плохо себя проявляют в коррекциях за последние годы, когда идёт резкое падение и быстрый откуп. Все сглаженные индикаторы дают сигнал на продажу, когда актив уже растёт.
💬В комментариях пишите ваши вопросы по тестам и коду. Предлагайте, как можно вести портфель с минимальным количеством ребалансировок и своевременной реакцией на падение.
Автор Quantrum.me
Telegram-канал📣: @quantiki
Подбор и тестирование портфелей. Подключение стратегий к IB.