Пересечение SMA

    В этой статье рассматривается очень простая система. Если быстрая SMA пересекает медленную SMA снизу вверх, то покупаем, если пересекает сверху вниз, то ликвидируем позицию. Только лонг, никаких стопов, т.к. ими пользуется только трусы. Для упрощения комиссия не учитывается. Для тестирования берется портфель ликвидных бумаг: SBER, GAZP, GMKN, LKOH, ROSN, MOEX, NVTK, PLZL, AFLT, MTLR, NLMK, MAGN, TRNFP, MGNT. Для этой системы нужно найти два параметра: периоды быстрой и медленной SMA.  Для подбора этих параметров берётся диапазон с 01.01.2015г. по 01.01.2023г. А диапазон с 01.01.2023г. по 07.03.2025г. используется для проверки.
   Для всех бумаг используется система с одинаковыми параметрами. Чтобы найти эти параметры, сначала для каждой бумаги строится свой профиль доходности в зависимости от периодов (т.е. двух параметров) на испытательном диапазоне. Затем все эти профили доходности суммируются и усредняются, в итоге мы имеем усредненный профиль доходности портфеля. Находится максимальная доходность на этом профиле и соответствующие ему параметры, т.е. два периода (быстрой и медленной SMA), и далее молимся надеемся, чтобы найденные параметры достаточно робастные.

( Читать дальше )

Случайный лес

    В этом опусе рассмотрим попытку использования алгоритм случайного леса для создания торгового модели для слива денег на примере индекса IMOEX. Используется язык питон и библиотеки pandas и scikit-learn. Модель будет предсказывать сторону закрытие на следующий день, т.е. оно положительное или отрицательное, и на основании этого строится торговая система.
df["Tomorrow"] = df["Close"].shift(-1)
df["Target"] = (df["Tomorrow"] > df["Close"]).astype(int)  # наша цель
    Очень важно, какие данные будут использоваться для прогнозирования. Здесь используется: показатель силы закрытия бара (т.е. (Close-Low)/(High-Low)) за текущий и предыдущий день, процентные соотношения между ценой закрытия и средними за периоды 2,10,15,25,50 дней по индексам IMOEX, RVI, RGBITR, и плюс цены закрытия индексов RVI, RGBITR.
    Для обучения модели используется период 2013-2022 гг., для проверки 2023-2024г.:
train = df.loc['2013':'2022']
test = df.loc['2023':]
    Для создания модели используется <a href=«scikit-learn.

( Читать дальше )

О применимости или неприменимости ARIMA

Пока рыночек пилит, мы тоже попилим чего-нибудь. Данная статься написана по мотивам главы 3 «Time-Series Analysis» из книги «Machine trading» E.Chan.
Все расчеты сделаны на matlab.
Первым делом, берем 5-минутки нашего любимого Сбербанка и разделим на две набора данных, первый набор 01.01.2020-01.01.2024 для тренировки нашей модели ARIMA(p, 0, 0), а второй набор с 01.01.2024г. — 08.11.2024г. для проверки модели.
Для тренировки модели используется средняя цена, т.е. 0.5*(High + Low). Для нахождения оптимального числа p (лаг) на тренировочных данных используем цикл, где перебираются p от 1 до 60 и определяем для каждого лага Байесовский информационный критерий (BIC). Оптимальный лаг будет иметь минимальный BIC.
В нашем случае получилось, что оптимальное p = 41 с такими параметрами: 

 

ARIMA(41,0,0) Model (Gaussian Distribution):
 
                   Value       StandardError    TStatistic      PValue   
                ___________    _____________    __________    ___________

    Constant      0.


( Читать дальше )

Торговля по луне

Попробуем быстренько исследовать, можно ли извлечь что-нибудь из лунного цикла с помощью питона и библиотек pandas и pylunar на индексе IMOEX. Предварительно устанавливаем pylunar. Библиотека дает дает информацию о луне на основе локации и даты.

import pylunar
import pandas as pd
import matplotlib.pyplot as plt

*** Теперь готовим дневные данные индекса IMOEX ***
*** Если есть минутные данные в формате DataFrame, то делаем следующее  ***

df = intraday_df.resample('D').agg({'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'})
df = df.dropna() 

Теперь в df содержатся дневки IMOEX.

  *** Вычисляем процентное изменение цены за один день
df['pct'] = df['Close'].pct_change().shift(-1)  

  *** Изменение цены за один день
df['diff'] = df['Close'].diff().shift(-1)              

Делаем стобец для хранения лунных дней
df['age'] = 0.0

mi = pylunar.MoonInfo((55,45,7),(37,36,56))

Здесь цифры (55,45,7),(37,36,56) — широта и долгота г.Москвы



( Читать дальше )

теги блога Riskplayer

....все тэги



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