Блог им. 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.
Функция сопровождения сделки делается примерно аналогично — полный код всей стратегии и тестера см. в конце топика.
Запускаем наш тестер, и получаем:
Вот сами видите, можно же зарабатывать. Мы уже Гуру трейдинга на СБ, можем набирать учеников. Конечно, многие скажут — 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.
Интересно, как это математики объяснят.
Ведь если просто бросать монетку, и за орел брать 0,2, а за решку отдавать 0,1, то навар будет огого.
Но, вообще, это все, и без экспериментов, на бумажке считается.)
Вот ТС пишет про случайное блуждание цены. Думаю, что случайный вход на реальном рынке тождественен случайному блужданию цены. И как на этом заработать? Похоже, никак.
Таким образом, суммарный статистический результат «успешности» и прибыльности не зависит от того, каким образом вы входите — случайно или с помощью сложных ТС, и играете ли вы на реальных котировках или СБ.
поставить
Кстати, на каждом прогоне входное СБ разное. Хотя, это и из кода видно.
При случайном блуждании заработать вообще не проблема — тейк больше стопа и вставай в любую сторону. Только рынок — это не случайное блуждание. Спектральный анализ говорит, что это скорее фрактал.
То, что Вы описали здесь, в итоге дает нулевую доходность. Протестировано на tradingview, см. random strategy.
3Qu, у одного и того же человека будет сегодня плюс, а завтра минус. Рынок — это тренды. Если выбирать направление с вероятностью 50%, половина сделок будет в плюс, половина в минус. Что очевидно, в общем-то.
Если бы рынок был бы реально рулеткой, случайным блужданием, заработать не составило бы труда.
А вообще, я не могу иначе думать, кроме как рынок это мешанина векторов влияния. В которую иногда вмешивается генерализирующая сила.
Ну то что мешанина, изначально из форекса шло. Там точно слишком много векторов силы.
Однако, объективно есть рубежи, после которых скорее продажа чем покупка и наоборот. Если конечно не смена парадигмы. Тут с погодой хорошая аналогия.
В общем, на счёт рынков пока нет идей, что и как можно сделать для прибыли. Хотя задача интересная, глубокая)
Однако, Python учить буду, он вообще по жизни помощник универсальный, для многих направлений гож. Правильно же понимаю, что можно всякие парсеры, автоматизацию инфо работы на нём делать?) Т.е. фактически любой рутинный процесс автоматизировать?
Спасибо за интересные мысли в статье!)