Блог им. Quantrum

Индикатор KST и другие приключения с ROC

В этот раз повторим на 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-дневной скользящей средней. Формула:

roc_1=SMA(ROC(10), 10)
roc_2=SMA(ROC(15), 10)
roc_3=SMA(ROC(20), 10)
roc_4=SMA(ROC(30), 15)

KST=1*roc_1+2*roc_2+3*roc_3+4*roc_4
KSTsignal=SMA(KST, 9)

На графике это выглядит так:

Индикатор KST и другие приключения с ROC

Невооруженным глазом видно, что к таким резким движениям цены данный индикатор не подходит.

Запускаем Quantopian

Протестируем индикатор KST и другие вариации на тему ROC:

  • Положение KST относительно нуля.
  • Положение KST над сигнальной линией.
  • Индикатор силы тренда TSI > 0.5 из этой статьи.
  • Положение ROC(5) сглаженного на SMA(200) над нулём. (Благодарю за подсказку в комментариях.)

Общие условия тестов:

  • Торгуем SPY.
  • Период: 2004-2018.
  • Проводим сделку за 1 час до закрытия рынка.
  • Капитал 100K.

Код условий:

# 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:

Индикатор KST и другие приключения с ROC

  • Exposure — время нахождения в позициях.
  • Transactions — количество сделок, включая открытие и закрытие.

Как видим, для SPY лидером остаётся пересечение SMA(50) и SMA(200).

Посмотрим на результаты в Jupyter

Эти же стратегии проверим в Jupyter без тестов, лишь расчётом. Так как это быстро, проверим другие ETF на основные индексы и секторы.

Индикатор KST и другие приключения с ROC

  • 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

Интересуетесь алготрейдингом на Python? Присоединяйтесь к команде.

Исходные коды на Quantrum.me

★9
10 комментариев
ROC(5) с усреднением за 200 дней это случайно не тоже самое, что ROC(200)?
avatar
ch5oh, попробуйте. у меня в телеграм-канале @quantiki есть примеры кода для быстрой проверки на графике.
Здравствуйте. А какой сайт позволяет бесплатно сформировать и добавить индикатор ROC?
avatar
PALINDROM, tradingview, stockcharts и любой торговый терминал
Александр Румянцев, на stockcharts он вроде как платный. А какой источник надо выбрать?

avatar
PALINDROM, я по закрытию строил. 
Александр Румянцев, «ROC(5), сглаженный на SMA(200), больше 0.» должен вот так выглядеть в виде двойной гистограммы? Это на ru.investing.com/equities/apple-computer-inc-advanced-chart настроил.



avatar
PALINDROM, похоже. Я никогда не видел, как это выглядит.
Просто там в расширенной версии можно еще вот такой уже график сформировать. Но только одно значение можно вводить — 5, а 200 к этому индикатору некуда вводить.




avatar
PALINDROM, 200 нужна. 

теги блога Александр Румянцев

....все тэги



UPDONW
Новый дизайн