uralpro
uralpro личный блог
22 мая 2016, 12:43

Предсказание чего угодно с использованием Python

bayes-retgurns-1080x571

Небольшая статья с ресурса http://www.talaikis.com/ о построении простой стратегии, использующую наивный байесовский классификатор при создании процесса возврата к среднему. Весь код в статье приведен на языке Python.

Это достаточно большая область исследований, но расскажем все очень кратко. Мы попытаемся найти взаимоотношение между  временными сериями  (в данном случае возьмем в качестве сигнала взаимный фонд XLF из финансового сектора, сдвинутый по времени на 1 день назад), а нашей целью будет фьючерс S&P500 в форме CFD. Будем входить в длинную позицию по этой бумаге при нулевой вероятности приращения. Логически нулевая вероятность ни о чем не говорит, другими словами, будем покупать возврат к среднему.

1. Получение данных

Y = read_mongo(dbase, "S&P5001440")
X = read_mongo(dbase, syms[s]).shift()

#готовим набор данных
res = pd.concat([X.CLOSE, Y.CLOSE], axis=1, join_axes=[X.index]).pct_change().dropna()
res.columns = ['X', 'Y']

 

2. Далее мы конструируем матрицу ошибок.Если сигнал растет и S&P500 растет — это истинное положительное значение, если сигнал вверх, а S&P500 -вниз, это ложное положительное значение, то же для отрицательных сигналов. Мы делаем это двумя способами:

#матрица ошибок
res['true_positive'] = np.where(np.where((res['X'] > 0), res['Y'], 0) > 0, res['Y'], 0) 
res['false_positive'] = np.where((np.where((res['X'] > 0), res['Y'], 0) < 0), res['Y'], 0)
res['true_negative'] = np.where((res['X'] < 0) & (res['Y'] < 0), res['Y'], 0)
res['false_negative'] = np.where((res['X'] < 0) & (res['Y'] > 0), res['Y'], 0)

 

3. Преобразуем сигналы в булевы переменные, используя скользящую сумму из 10 значений по всем сигналам:

#скользящая сумма сигналов
w = 10
res['true_positive_sum'] = pd.rolling_sum(res['true_positive'].astype(bool), window=w) 
res['false_positive_sum'] = pd.rolling_sum(res['false_positive'].astype(bool), window=w)
res['true_negative_sum'] = pd.rolling_sum(res['true_negative'].astype(bool), window=w)
res['false_negative_sum'] = pd.rolling_sum(res['false_negative'].astype(bool), window=w)

 

4. Теперь попытаемся определить вероятность сигналов обоих направлений. Для этого используем простую формулу частот:

Предсказание чего угодно с использованием Python

смысл которой в том, что вероятность события равна числу желаемых событий, деленных на число всех возможных событий:

res['accuracy'] =  (res['true_positive_sum'] + res['true_negative_sum']) / (res['true_positive_sum'] + \
            res['true_negative_sum'] + res['false_positive_sum'] + res['false_negative_sum'])

plt.plot(res['accuracy'])
plt.axhline(0.5, color = 'r', xmax=5)
plt.show()

signal-accuracy-1080x580

 

5. Вычислим вероятности противоположных событий:

res['true_positive_ratio'] =  res['true_positive_sum'] /(res['true_positive_sum'] + res['false_negative_sum'])
res['false_positive_ratio'] = res['false_positive_sum'] / (res['false_positive_sum'] + res['true_negative_sum'])
res['true_negative_ratio'] = 1 - res['true_positive_ratio']
res['false_negative_ratio'] = 1 - res['false_positive_ratio']

6. Сейчас мы можем вычислить сигналы и прибыльность. Будем использовать десятикратное плечо при расчете прибыли. Код ниже дан для ситуации " вход в лонг при отрицательной вероятности":

res['signal'] = np.where(res['true_negative_ratio'] >= 1, 1, 0)
res['returns'] = res['signal'].shift() * res['Y'] * 10.0

В заглавии статьи показан график кумулятивной прибыли по сравнению со стратегией «купил и держи» ( линия зеленого цвета).

Ниже — график просадок:

bayes-drawdown-1080x572

Конечно, векторизованный бэктест показывает только, как это было бы при входе и выходе  на закрытии дня, не учитывает комиссий и т.п.

Другие стратегии и алгоритмы автоматической торговли смотрите на моем сайте www.quantalgos.ru

17 Комментариев
  • Silent Hamster
    22 мая 2016, 12:50
    круто, а почему сам не торгуешь? Все деньги рынка твои же?!  Или только аналитик?!)
    Есть не менее крутой метод- МНК, он дает прогноз на шаг вперед. 
    Делаешь полином 30 степени- точно вычислен прогноз для очень волотильного рынка, берешь полином 2-или 3 порядка- 95% попадаешь в рынок на 5-ти минутках!  Сам так торгую! 
      • Silent Hamster
        22 мая 2016, 12:56
        uralpro, и как?   только с рынка живешь или еще куда по найму ходишь?
          • Александр
            22 мая 2016, 13:33
            uralpro, давненько на вашем сайте обновлений не было) ожидается что нибудь интересное в ближайшее время?
      • Евгений Черных
        22 мая 2016, 15:20
        uralpro, Ссылко в конце статьи бита 
  • Oleg Only Algo
    22 мая 2016, 13:40
    Может быть, но пока будешь разбираться в этом питоне,  вся жизнь пройдёт. Тем более рынок не так сложен как кажется! Другое дело, что правильный алгоритм не просто сделать, наверно и на питоне этом
  • Pobeditel
    22 мая 2016, 16:16
    ну и где предсказание? график предсказания всегда должен выходить ЗА пределы другого графика. Вообще в таких статьях конечно интересно рыться… но все это фигня полная если нет Эквити за конкретный период по конкретному инструменту. Любому торговцу пофигу умный ты или дурак, важно другое. Как заработать исходя из предоставленной информации. А это отражается обычно в одностраничном листике… и там нет вот всех эти кусков кода… таких графиков и прочего. Нет конечно программеры скажут- о чувак тоже программист, типа круто. Но твоя же аудитория к которой ты обращаешься судя по сайту, там блок с продажами,- это не программисты. Соответственно где логика Каааарл?
  • Pobeditel
    22 мая 2016, 16:17
    касаемо hft и прочего. Единственно правильный hft-тот который садиться на поток ордеров и катиться на нем. ВСЕ. все другое это от лукавого. Я тупенький мне можно так думать)
  • SciFi
    22 мая 2016, 17:33
    Классная полезная статья. Не обращай внимания на идиотские комментарии, их пишут люди, которые не понимают статью.
  • Roman Nekrasov
    22 мая 2016, 19:50
    Не надо городить огород, в эконометрике давно есть критерий Грейндежера для понимания, где предиктор, а где объясняемая переменная. 
    • SergeyJu
      23 мая 2016, 12:06
      Roman Nekrasov, между наличием критерия и его практическим применением дистанция огромного размера :)
      • Roman Nekrasov
        23 мая 2016, 21:32
        SergeyJu, эконометрика — царица наук для трейдера
        • SergeyJu
          24 мая 2016, 10:32
          Roman Nekrasov, Вы, наверное, не поняли.
          1. Эконометрика — это статистика давно прошедшего прошлого. Если Ваш таймфрейм несколько лет, Вы можете на неё полагаться с определенными оговорками. Если таймфрейм меньше месяца — она просто шум.
          2. Если у Вас есть какой-то критерий, который используется где-то теоретиками, из этого не следует, что этот критерий применим в реальной спекуляции. Тем более, что цены нестационарны и, в отличие от эконометрических данных, очень сильно зашумлены.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн