Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 3434

 

А вот так выглядят листья дерева 3-3-3-3, ниже отдельные графики по каждой выборки - в очередности train, test, exam



Ну, видно, что уже побольше смещение вероятности в листьях, но и начала проявляется нестабильность. Процент примеров в позитивных листьях дерева (кластерах) на последующих выборках уменьшился, что ещё раз подтверждает в общем то уникальность комбинаций, характерных на определенном участке торговли. Отмечу, что выборка сложная - всего 10% единиц (позитивных целевых).

 
Aleksey Vyazmikin #:

Делюсь результатами, значит дерево [3,3,3] - на каждом уровне в листе происходит кластеризация на 3 кластера, всего 3 уровня, в итоге 27 конечных листьев.

Применяем результат на 3 выборках - test и exam не участвовали в построении дерева.

На графике ниже показано смещение целевой "1" в процентах относительно среднего значения целевой "1" в своей выборке - для каждого листа дерева.

Что радует - устойчивость смещения, т.е. там где на train было больше 0 или 1, так и на остальных выборках часто остаётся.

Правда, если взять по выборке train примеры в выборке со смещением более 5%, то получиться всего около 20% примеров от всей выборки, что маловато.

50 кластеров. Кластеризация по волатильности.


Learn 0 BATCH 0 model
R2: -0.6975072967971953
Learn 0 BATCH 1 model
R2: 0.9475296697469157
Learn 0 BATCH 2 model
R2: 0.016017417967087666
Learn 0 BATCH 3 model
R2: -0.4384662368711072
Learn 0 BATCH 4 model
R2: -0.815427090254198
Learn 0 BATCH 5 model
R2: 0.22019051717293892
Learn 0 BATCH 6 model
R2: -0.3800956817962319
Learn 0 BATCH 7 model
R2: 0.07809908347775751
Learn 0 BATCH 8 model
/Users/dmitrievsky/miniforge3/lib/python3.10/site-packages/sklearn/metrics/_regression.py:1187: UndefinedMetricWarning: R^2 score is not well-defined with less than two samples.
  warnings.warn(msg, UndefinedMetricWarning)
R2 is fixed to -1.0
R2: -1.0
Learn 0 BATCH 9 model
R2: 0.004266344436175684
Learn 0 BATCH 10 model
R2: 0.4981881787045557
Learn 0 BATCH 11 model
R2: 0.0053097855769144164
Learn 0 BATCH 12 model
R2: 0.054027256930358925
Learn 0 BATCH 13 model
R2: 0.5899093013972916
Learn 0 BATCH 14 model
R2: -0.4946899648797436
Learn 0 BATCH 15 model
R2: 0.7939071178120198
Learn 0 BATCH 16 model
R2: 0.6477014231474504
Learn 0 BATCH 17 model
R2: 0.47273004383962347
Learn 0 BATCH 18 model
R2: 0.248941419849391
Learn 0 BATCH 19 model
R2: 0.800761188745112
Learn 0 BATCH 20 model
R2: 0.11376642072996479
Learn 0 BATCH 21 model
/Users/dmitrievsky/miniforge3/lib/python3.10/site-packages/sklearn/metrics/_regression.py:1187: UndefinedMetricWarning: R^2 score is not well-defined with less than two samples.
  warnings.warn(msg, UndefinedMetricWarning)
R2 is fixed to -1.0
R2: -1.0
Learn 0 BATCH 22 model
R2: 0.7838797961879156
Learn 0 BATCH 23 model
R2: -0.4268170909757055
Learn 0 BATCH 24 model
R2: 0.5737133818949138
Learn 0 BATCH 25 model
R2: 0.36270135520520974
Learn 0 BATCH 26 model
R2: -0.12049707206984317
Learn 0 BATCH 27 model
R2: 0.27317804513554567
Learn 0 BATCH 28 model
R2: -0.005998374759471736
Learn 0 BATCH 29 model
R2: 0.32044801432519554
Learn 0 BATCH 30 model
R2: 0.3106442469001309
Learn 0 BATCH 31 model
R2: 0.6887039726402294
Learn 0 BATCH 32 model
R2: -0.5321374845982312
Learn 0 BATCH 33 model
/Users/dmitrievsky/miniforge3/lib/python3.10/site-packages/sklearn/metrics/_regression.py:1187: UndefinedMetricWarning: R^2 score is not well-defined with less than two samples.
  warnings.warn(msg, UndefinedMetricWarning)
R2 is fixed to -1.0
R2: -1.0
Learn 0 BATCH 34 model
R2: -0.036793036508273036
Learn 0 BATCH 35 model
R2: -0.13234917037561222
Learn 0 BATCH 36 model
R2: -0.7195407853537261
Learn 0 BATCH 37 model
/Users/dmitrievsky/miniforge3/lib/python3.10/site-packages/sklearn/metrics/_regression.py:1187: UndefinedMetricWarning: R^2 score is not well-defined with less than two samples.
  warnings.warn(msg, UndefinedMetricWarning)
R2 is fixed to -1.0
R2: -1.0
Learn 0 BATCH 38 model
R2: 0.7462004403933388
Learn 0 BATCH 39 model
R2: -0.014321696157866604
Learn 0 BATCH 40 model
R2: 0.8581957623344842
Learn 0 BATCH 41 model
R2: -0.5150586236832828
Learn 0 BATCH 42 model
R2: 0.88749024612301
Learn 0 BATCH 43 model
R2: -0.02320296391829768
Learn 0 BATCH 44 model
R2: 0.5986943139612424
Learn 0 BATCH 45 model
/Users/dmitrievsky/miniforge3/lib/python3.10/site-packages/sklearn/metrics/_regression.py:1187: UndefinedMetricWarning: R^2 score is not well-defined with less than two samples.
  warnings.warn(msg, UndefinedMetricWarning)
R2 is fixed to -1.0
R2: -1.0
Learn 0 BATCH 46 model
R2: 0.08375468541665188
Learn 0 BATCH 47 model
R2: 0.7318534153534879
Learn 0 BATCH 48 model
R2: 0.3927709261051455
Learn 0 BATCH 49 model
R2: 0.8029591287960962

Лучшие результаты:


 
Aleksey Vyazmikin #:

А вот так выглядят листья дерева 3-3-3-3, ниже отдельные графики по каждой выборки - в очередности train, test, exam



Ну, видно, что уже побольше смещение вероятности в листьях, но и начала проявляется нестабильность. Процент примеров в позитивных листьях дерева (кластерах) на последующих выборках уменьшился, что ещё раз подтверждает в общем то уникальность комбинаций, характерных на определенном участке торговли. Отмечу, что выборка сложная - всего 10% единиц (позитивных целевых).

Попробуйте EURGBP


 
Maxim Dmitrievsky #:

Попробуйте EURGBP

А у тебя тестер считает вход по клоузу сигнальной свечи или по открытию следующей? 

Комиссия считаеться? 
 
Aleksey Vyazmikin #:

Выглядит весьма интересно. Подробности будут?

Будут, но позже
 
mytarmailS #:
А у тебя тестер считает вход по клоузу сигнальной свечи или по открытию следующей? 

Комиссия считаеться? 

Попроси чатгпт переписать на R %)

def tester(dataset: pd.DataFrame, plot = False):
    last_deal = int(2)
    last_price = 0.0
    report = [0.0]
    chart = [0.0]
    line = 0
    line2 = 0

    indexes = pd.DatetimeIndex(dataset.index)
    labels = dataset['labels'].to_numpy()
    metalabels = dataset['meta_labels'].to_numpy()
    close = dataset['close'].to_numpy()

    for i in range(dataset.shape[0]):
        if indexes[i] <= FORWARD:
            line = len(report)
        if indexes[i] <= BACKWARD:
            line2 = len(report)

        pred = labels[i]
        pr = close[i]
        pred_meta = metalabels[i] # 1 = allow trades

        if last_deal == 2 and pred_meta==1:
            last_price = pr
            last_deal = 0 if pred <= 0.5 else 1
            continue

        if last_deal == 0 and pred > 0.5 and pred_meta == 1:
            last_deal = 2
            report.append(report[-1] - MARKUP + (pr - last_price))
            chart.append(chart[-1] + (pr - last_price))
            continue

        if last_deal == 1 and pred < 0.5 and pred_meta==1:
            last_deal = 2
            report.append(report[-1] - MARKUP + (last_price - pr))
            chart.append(chart[-1] + (pr - last_price))

    y = np.array(report).reshape(-1, 1)
    X = np.arange(len(report)).reshape(-1, 1)
    lr = LinearRegression()
    lr.fit(X, y)

    l = lr.coef_
    if l >= 0:
        l = 1
    else:
        l = -1

    if(plot):
        plt.plot(report)
        plt.plot(chart)
        plt.axvline(x = line, color='purple', ls=':', lw=1, label='OOS')
        plt.axvline(x = line2, color='red', ls=':', lw=1, label='OOS2')
        plt.plot(lr.predict(X))
        plt.title("Strategy performance R^2 " + str(format(lr.score(X, y) * l,".2f")))
        plt.xlabel("the number of trades")
        plt.ylabel("cumulative profit in pips")
        plt.show()

    return lr.score(X, y) * l
 
Maxim Dmitrievsky #:

Попроси чатгпт переписать на R %)

Было бы не плохо знать что в датафрейме на входе.. 

То есть я так понял что по клоузу текущему открывается? 
 
Maxim Dmitrievsky #:

50 кластеров. Кластеризация по волатильности.


Лучшие результаты:


Как волатильность мерили - пусть останется тайной, но напишите, как оценивали результат в кластерах для их классификации, а то не понятно.

 
Maxim Dmitrievsky #:

Попробуйте EURGBP


Выглядит красиво. Чуть позже тесты на разных инструментах - пока надо технологию настроить.

 
Alexey Burnakov выбора предикторов " не сработали

Я опубликую свой метод, который надежно и чувствительно решает аналогичные проблемы - я изложу теорию и опубликую код на R.

Это делается для взаимного обогащения "понимания" задач машинного обучения.

Продолжайте публиковать!
Причина обращения: