Блог им. uralpro

Предсказание чего угодно с использованием 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

★42
17 комментариев
круто, а почему сам не торгуешь? Все деньги рынка твои же?!  Или только аналитик?!)
Есть не менее крутой метод- МНК, он дает прогноз на шаг вперед. 
Делаешь полином 30 степени- точно вычислен прогноз для очень волотильного рынка, берешь полином 2-или 3 порядка- 95% попадаешь в рынок на 5-ти минутках!  Сам так торгую! 
avatar
Silent Hamster, я торгую
avatar
uralpro, и как?   только с рынка живешь или еще куда по найму ходишь?
avatar
Silent Hamster, да, уже только с рынка
avatar
uralpro, давненько на вашем сайте обновлений не было) ожидается что нибудь интересное в ближайшее время?
Александр, сегодня разместил новую статью. Но вы правы, времени на сайт остается совсем мало. Постараюсь больше публиковать, тем более материала накопилось много
avatar
uralpro, Ссылко в конце статьи бита 
kbrobot.ru, исправил
avatar
Может быть, но пока будешь разбираться в этом питоне,  вся жизнь пройдёт. Тем более рынок не так сложен как кажется! Другое дело, что правильный алгоритм не просто сделать, наверно и на питоне этом
avatar
Oleg Only Algo, да, алгоритм придумать намного труднее, чем выучить любой язык программирования
avatar
ну и где предсказание? график предсказания всегда должен выходить ЗА пределы другого графика. Вообще в таких статьях конечно интересно рыться… но все это фигня полная если нет Эквити за конкретный период по конкретному инструменту. Любому торговцу пофигу умный ты или дурак, важно другое. Как заработать исходя из предоставленной информации. А это отражается обычно в одностраничном листике… и там нет вот всех эти кусков кода… таких графиков и прочего. Нет конечно программеры скажут- о чувак тоже программист, типа круто. Но твоя же аудитория к которой ты обращаешься судя по сайту, там блок с продажами,- это не программисты. Соответственно где логика Каааарл?
avatar
касаемо hft и прочего. Единственно правильный hft-тот который садиться на поток ордеров и катиться на нем. ВСЕ. все другое это от лукавого. Я тупенький мне можно так думать)
avatar
Классная полезная статья. Не обращай внимания на идиотские комментарии, их пишут люди, которые не понимают статью.
avatar
Не надо городить огород, в эконометрике давно есть критерий Грейндежера для понимания, где предиктор, а где объясняемая переменная. 
avatar
Roman Nekrasov, между наличием критерия и его практическим применением дистанция огромного размера :)
avatar
SergeyJu, эконометрика — царица наук для трейдера
avatar
Roman Nekrasov, Вы, наверное, не поняли.
1. Эконометрика — это статистика давно прошедшего прошлого. Если Ваш таймфрейм несколько лет, Вы можете на неё полагаться с определенными оговорками. Если таймфрейм меньше месяца — она просто шум.
2. Если у Вас есть какой-то критерий, который используется где-то теоретиками, из этого не следует, что этот критерий применим в реальной спекуляции. Тем более, что цены нестационарны и, в отличие от эконометрических данных, очень сильно зашумлены.

avatar

теги блога uralpro

....все тэги



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