Блог им. 3Qu

Python. Делаем тестер стратегий и... зарабатываем на случайном блуждании.

    • 19 июня 2020, 16:32
    • |
    • 3Qu
  • Еще

Если вам кто нибудь скажет, что на случайном блуждании (СБ) нельзя зарабатывать, бросьте в него камень. Как говорил Паниковский — это жалкие ничтожные люди. На СБ можно зарабатывать с результатами не хуже, чем на реальном рынке. У СБ, по сравнению с реальным рынком, только один недостаток — за игры с СБ никто деньги платить не будет.
А если бы платили? Никто бы ничего не заметил. По прежнему 95% СБ-трейдеров сливало бы депозиты, а 5% регулярно выигрывало и считало бы себя Гуру. По прежнему на графики наносились бы каббалистические знаки и индикаторы, угадывались бы направления движения, каналы, и линии поддержки/сопротивления. Все так же начинающие трейдеры искали Учителя для обучения, а аналитики предсказывали будущее. И, ровным счетом, абсолютно ничего бы не поменялось. Может только АГ заметил бы подвох, но тоже не сразу, а только через несколько месяцев, а, может, и через год-другой. Но, легко сделать, чтобы и АГ остался в неведении.)

Однако, прежде чем играть на СБ, нам необходима стратегия и тестер. Ими мы и займемся.
Для начала стратегия: нам нужны три функции
— одна для пошагового слежения за рыночными котировками и определения момента входа в сделку — DealEntryAnalysis(i) и пусть на ее выходе будет: 0-если сделки нет, 1 — необходим вход в лонг, и -1 — необходим вход в шорт. i — номер отсчета массива котировок.
— вторая для сопровождения сделки лонг — DealControlL(i), отвечающая за контроль и закрытие сделки.
— и третья, для сопровождения сделки шорт — DealControlS(i).
Теперь у нас все готово для разработки тестера стратегий, а это всего лишь цикл while() последовательно перебирающий котировки.
Вот наша стратегия уже в тестере:

while i < Ie:
    deal_type = DealEntryAnalysis(i)
    if deal_type == 1:
        j, rep = DealControlL(i)
        deals_report.append(rep)
        i = j+1
        continue
    elif deal_type == -1:
        j, rep = DealControlS(i)
        deals_report.append(rep)
        i = j+1
        continue
    i = i+1

deals_report — это отчет о проделанной работе по каждой из сделок, а j — номер отсчета выхода из сделки.

Ну, а какую стратегию выбрать для работы с СБ — лучше всего тоже случайную: случайный вход в сделку, и случайный выход из нее.
Выбор когда входить и в какую сделку — шорт или лонг сделаем так:

def DealEntryAnalysis(i):
    rnd1 = np.random.default_rng().uniform(0, 1)
    if rnd1 < 0.99:
        return 0
    else:
        rnd1 = np.random.default_rng().uniform(0, 1)
    if rnd1 > 0.5:
        return 1
    else:
        return -1

Здесь мы выбрали, что вероятность входа в сделку всего 0.01, а лонг или шорт выбираем с вероятностью 0.5.
Функция сопровождения сделки делается примерно аналогично — полный код всей стратегии и тестера см. в конце топика.

Запускаем наш тестер, и получаем:
Python. Делаем тестер стратегий и... зарабатываем на случайном блуждании.Python. Делаем тестер стратегий и... зарабатываем на случайном блуждании.

Вот сами видите, можно же зарабатывать. Мы уже Гуру трейдинга на СБ, можем набирать учеников. Конечно, многие скажут — 500 сделок, интервал маловат, надо минимум 1000. — Не проблема, сейчас покажем и 1000 сделок.
Обольщаться не надо, такие результаты доступны только ~10% трейдеров, но многие могут прибыльно торговать на СБ тоже с неплохими результатами. Вот с 1000 сделками дела похуже — Гуру становится меньше и успешные трейдеры потихоньку рассасываются. Но, при всем при том, истинные профессионалы, их немного, но даже на таком случайном рынке все равно остаются. В общем, на СБ вполне можно рассчитывать на ~5% успешных трейдеров, ну, а истинные гуру — их всегда мало, где-то доли процента. И в завершение, код нашей стратегии.
Что мы в итоге получили? А получили, что игры на СБ, по крайней мере по показателям успешности трейдеров, статистически не отличаются от игр на реальных биржевых инструментах.

import numpy as np
import matplotlib.pyplot as plt
# import SLPack.Filters as flt  # загрузка нашего пакета

mu = 0  # матожидание
sigma = 5  # стандартное отклонение
N = 50000  # длина последовательности

# нормально распределенная случ последовательность
normrand = np.random.default_rng().normal(mu, sigma, N)

rw = []
# создаем случ блуждание
for i in range(0, N):
    if i == 0:
        rw.append(10000+normrand[i])
    else:
        rw.append(rw[i-1] + normrand[i])

# F8 = flt.cF1Bat(8, rw)
# F16 = flt.cF1Bat(16, rw)
# FM16 = flt.cFMean(16, rw)


# анализ входа в сделку
def DealEntryAnalysis(i):
    rnd1 = np.random.default_rng().uniform(0, 1)
    if rnd1 < 0.99:
        return 0
    else:
        rnd1 = np.random.default_rng().uniform(0, 1)
    if rnd1 > 0.5:
        return 1
    else:
        return -1


# сопровождение сделки Long
def DealControlL(i):
    rep = [1, i, 0, rw[i], 0, 0]  # отчет о сделке Long
    ie = i+5
    rep[2] = ie
    rep[4] = rw[ie]
    rep[5] = rw[ie]-rw[i]
    return ie, rep


# сопровождение сделки Short
def DealControlS(i):
    rep = [-1, i, 0, rw[i], 0, 0]  # отчет о сделке Short
    ie = i+5
    rep[2] = ie
    rep[4] = rw[ie]
    rep[5] = rw[i]-rw[ie]
    return ie, rep


Ib = 20
Ie = 50000-10
i = Ib
deals_report = []

while i < Ie:
    deal_type = DealEntryAnalysis(i)
    if deal_type == 1:
        j, rep = DealControlL(i)
        deals_report.append(rep)
        i = j+1
        continue
    elif deal_type == -1:
        j, rep = DealControlS(i)
        deals_report.append(rep)
        i = j+1
        continue
    i = i+1

profit = []
for i in range(0, len(deals_report)):
    if i == 0:
        profit.append(deals_report[i][5])
    else:
        profit.append(profit[i-1]+deals_report[i][5])

plt.plot(profit)
plt.title('Profit')
plt.legend()
plt.grid()
plt.show()

На этом, думаю, можно завершить цикл топиков о моделировании торговых систем на Python. [1],[2] Все необходимые инструменты для тестирования ваших стратегий в Python готовы к применению.

Ссылки.

1. Моделирование Торговых Систем на Python. 1.

2. Моделирование Торговых Систем на Python. 2.

★38
20 комментариев
это одним контрактом, безо всяких условий и без Горчаковских умных «приращений».по- нашему, по-бразильски
А если добавить следящий стоп, а не выход по случайности. Результаты по идее должны быть не много лучше.
avatar
Как вы думаете, почему при случайном входе и TP/SL=2/1 результат стремится к 0 — комиссия ? 
Кирилл Сизов, я этим не занимался, не знаю, и не до конца понял постановку вопроса. Если Питон есть, можете быстренько поэкспериментировать с этим, дописав всего несколько строчек кода.
avatar
3Qu, я с монеткой экспериментировал на истории брент. Кинул 110 раз. ставил 0.1 стоп и 0,2 профит. Получился смешной плюс 0,4 бакса.
Интересно, как это математики объяснят. 
Ведь если просто бросать монетку, и за орел брать 0,2, а за решку отдавать 0,1, то навар будет огого.
Кирилл Сизов, в единичном эксперименте (и даже на серии) результаты могут вообще любыми получиться. Вы же видите, серия 500 на СБ с хорошей вероятностью может дать большой плюс. Вообще, если не учитывать сливов, там половина в профите будет, хотя бы в небольшом.
Но, вообще, это все, и без экспериментов, на бумажке считается.)
avatar
3Qu, Далеко не все можно посчитать на бумажке, а если и можно, то значит кто-то уже проделал необходимые эксперименты до нас)
Кирилл Сизов, а сколько процентов прибыльных сделок? Явно не 50%.
avatar
Susanin, то-то и оно, что прибыльных сделок примерно в два раза меньше, чем лосевых. Прямо чудеса какие-то!
Susanin, я полагаю, раз вход случайный, значит фактором направления можно пренебречь. Тогда вероятность движения на 0,1 в два раза выше движения на 0,2. Отсюда результат нулевой. 
Вот ТС пишет про случайное блуждание цены. Думаю, что случайный вход на реальном рынке тождественен случайному блужданию цены. И как на этом заработать? Похоже, никак.
Кирилл Сизов, ТС пишет о другом. Что успешных и сливающих трейдеров при игре на СБ столько же, сколько и при игре на реальных биржевых инструментах. А вероятности заработка на СБ аналогичны вероятностям заработка на бирже, и эти показатели статистически неотличимы.
Таким образом, суммарный статистический результат «успешности» и прибыльности не зависит от того, каким образом вы входите — случайно или с помощью сложных ТС, и играете ли вы на реальных котировках или СБ.
avatar
3Qu, понял.
А прогони плз у себя тест если вместо
if rnd1 > 0.5:
поставить

if rnd1 > 0.6:
Свой Мужик,  без прогона могу сказать — будет все тоже самое, хоть одни только лонги или одни шорты играй. Без разницы.
Кстати, на каждом прогоне входное СБ разное. Хотя, это и из кода видно.
avatar
рынок штука психологическая (для спекуляций), а не математическая. Все считают, что есть уровни, потому они и есть. и т.д.
avatar

При случайном блуждании заработать вообще не проблема — тейк больше стопа и вставай в любую сторону. Только рынок — это не случайное блуждание. Спектральный анализ говорит, что это скорее фрактал.

То, что Вы описали здесь, в итоге дает нулевую доходность. Протестировано на tradingview, см. random strategy.

avatar
Алексей А., дает нулевую доходность в среднем. С этим никто и не спорит, и обратное не утверждает. Однако, вы забываете, что у этого среднего существует распределение. У одних большой плюс, у других большой минус, а в среднем ноль.
avatar

3Qu, у одного и того же человека будет сегодня плюс, а завтра минус. Рынок — это тренды. Если выбирать направление с вероятностью 50%, половина сделок будет в плюс, половина в минус. Что очевидно, в общем-то.

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

avatar
Штука интересная, сам люблю задуматься на тему фин рынков. Того стоит. Ведь получив хоть небольшой % дохода, это уже огромный результат в жизни. Как я говорил, что если я найду способ весьма гарантированно зарабатывать в среднем 2% в мес, то о деньгах я никогда не побеспокоюсь)

А вообще, я не могу иначе думать, кроме как рынок это мешанина векторов влияния. В которую иногда вмешивается генерализирующая сила.

Ну то что мешанина, изначально из форекса шло. Там точно слишком много векторов силы. 

Однако, объективно есть рубежи, после которых скорее продажа чем покупка и наоборот. Если конечно не смена парадигмы. Тут с погодой хорошая аналогия.

В общем, на счёт рынков пока нет идей, что и как можно сделать для прибыли. Хотя задача интересная, глубокая)

Однако, Python учить буду, он вообще по жизни помощник универсальный, для многих направлений гож. Правильно же понимаю, что можно всякие парсеры, автоматизацию инфо работы на нём делать?) Т.е. фактически любой рутинный процесс автоматизировать? 

Спасибо за интересные мысли в статье!)
avatar

теги блога 3Qu

....все тэги



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