Архипов Владимир
Архипов Владимир личный блог
31 августа 2025, 07:14

Нейросеть и скальпинг

С трендингом практически не знаком, занимаюсь разработкой программных решений.
Вдохновлённый теорией пузырькового состояния, и сделав предположение, что у цены на рынке есть инерция как у физического объекта — попробовал несколько вариантов как подготовить данные и какую архитектуру нейросети построить, вроде есть какой-то успех.
Обучалось на USD000UTSTOM2023 — данные за каждую минуту 2023 года. По последним 60 шагам предсказываем тренд направления цены в течение следующих 5ти минут.
Результаты обучения такие:
=== РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ===
Потери по инерции (MSE): 0.006449
Потери по направлению (BCE): 0.612085
Точность предсказания направления: 0.7300
Средняя предсказанная инерция: 0.9013
Реальная средняя инерция: 0.9057

Далее провёл дополнительную перепроверку:
1. ТОЧНОСТЬ ПРОГНОЗА НАПРАВЛЕНИЯ:
   Всего прогнозов: 169411
   Правильных: 126161
   Точность: 0.7447 (74.47%)

   Матрица ошибок:
   True 0 (↓) predicted as 0: 65485
   True 0 (↓) predicted as 1: 18016
   True 1 (↑) predicted as 0: 25234
   True 1 (↑) predicted as 1: 60676

   Средняя ошибка силы инерции: 0.0592

2. РЕЗУЛЬТАТЫ ТОРГОВЛИ:
   Всего сделок: 169324
   Прибыльных сделок: 82077
   Сделок с правильным направлением: 115947
   Успешность: 0.4847 (48.47%)
   Точность направления в сделках: 0.6848
   Общий P&L: 180.2525
   Средний P&L за сделку: 0.0011
   Средний P&L в %: 0.0013%

3. ДЕТАЛИЗАЦИЯ ПО ТИПАМ СДЕЛОК:
   LONG сделок: 78691
   Успешность LONG: 0.5061
   SHORT сделок: 90633
   Успешность SHORT: 0.4661

4. ЗАВИСИМОСТЬ ОТ СИЛЫ СИГНАЛА:
   Сигнал [0.70-0.75]:  145 сделок, успешность 0.4759, точность напр. 0.6690
   Сигнал [0.75-0.80]:  420 сделок, успешность 0.5786, точность напр. 0.6714
   Сигнал [0.80-0.85]: 2075 сделок, успешность 0.4872, точность напр. 0.6593
   Сигнал [0.85-0.90]: 62039 сделок, успешность 0.4900, точность напр. 0.7087
   Сигнал [0.90-0.95]: 103658 сделок, успешность 0.4795, точность напр. 0.6711
   Сигнал [0.95-1.00]:  886 сделок, успешность 0.6524, точность напр. 0.6772

Вроде как неплохой результат, но я не уверен, так как не знаком настолько глубоко с трейдингом.
Например есть вопрос — может ли такой процент успешности перекрыть затраты на процент брокера на сумму сделки?

Так же провёл обучение на настройками прогноза тренда на 1 минуту вперёд, результаты такие:
=== РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ===
Потери по инерции (MSE): 0.007061
Потери по направлению (BCE): 0.316872
Точность предсказания направления: 0.8728
Средняя предсказанная инерция: 0.8964
Реальная средняя инерция: 0.9004

Результаты дополнительной проверки обученной модели по 1 минуте:
Загружено 169488 записей
Период данных: 2023-01-03 04:00:00+00:00 — 2023-12-19 15:59:00+00:00

2. ПОДГОТОВКА ДАННЫХ ДЛЯ ПРОГНОЗА...
   Размерность матрицы признаков: (169488, 15)

3. ЗАГРУЗКА МОДЕЛИ...
   Расчетный размер входа: 977
   Модель успешно загружена с trained_inertia_predictor1min.pth

4. ВЫПОЛНЕНИЕ ПРОГНОЗА С ИДЕНТИЧНЫМ РАСЧЕТОМ ЦЕЛЕЙ...

Делаем прогнозы для 169415 точек...

5. АНАЛИЗ РЕЗУЛЬТАТОВ...

============================================================
ДЕТАЛЬНЫЙ АНАЛИЗ РЕЗУЛЬТАТОВ (ИДЕНТИЧНЫЙ РАСЧЕТ)
============================================================

1. ТОЧНОСТЬ ПРОГНОЗА НАПРАВЛЕНИЯ:
   Всего прогнозов: 169415
   Правильных: 148505
   Точность: 0.8766 (87.66%)

   Матрица ошибок:
   True 0 (↓) predicted as 0: 71206
   True 0 (↓) predicted as 1: 12295
   True 1 (↑) predicted as 0: 8615
   True 1 (↑) predicted as 1: 77299

   Средняя ошибка силы инерции: 0.0624

2. РЕЗУЛЬТАТЫ ТОРГОВЛИ:
   Всего сделок: 169275
   Прибыльных сделок: 75265
   Сделок с правильным направлением: 78295
   Успешность: 0.4446 (44.46%)
   Точность направления в сделках: 0.4625
   Общий P&L: -5.8775
   Средний P&L за сделку: -0.0000
   Средний P&L в %: -0.0000%

3. ДЕТАЛИЗАЦИЯ ПО ТИПАМ СДЕЛОК:
   LONG сделок: 89587
   Успешность LONG: 0.4670
   SHORT сделок: 79688
   Успешность SHORT: 0.4195

4. ЗАВИСИМОСТЬ ОТ СИЛЫ СИГНАЛА:
   Сигнал [0.70-0.75]:   99 сделок, успешность 0.3838, точность напр. 0.3737
   Сигнал [0.75-0.80]:  502 сделок, успешность 0.4044, точность напр. 0.4143
   Сигнал [0.80-0.85]:  900 сделок, успешность 0.4156, точность напр. 0.4356
   Сигнал [0.85-0.90]: 134851 сделок, успешность 0.4483, точность напр. 0.4689
   Сигнал [0.90-0.95]: 32597 сделок, успешность 0.4307, точность напр. 0.4374
   Сигнал [0.95-1.00]:  271 сделок, успешность 0.4834, точность напр. 0.4982

Хотя точность по 1 минуте выше, но доходность получается отрицательная, по 5 минутам положительная, хотя точность ниже, что для меня не совсем укладывается в голове… Поэтому прошу помочь разобраться в теме данного исследования.
Анализ результатов делал таким кодом:
# 6. ФУНКЦИЯ АНАЛИЗА РЕЗУЛЬТАТОВ
def analyze_results(all_predictions, trade_results):
    """Детальный анализ качества прогнозов и торговых результатов"""
    
    print("\n" + "="*60)
    print("ДЕТАЛЬНЫЙ АНАЛИЗ РЕЗУЛЬТАТОВ (ИДЕНТИЧНЫЙ РАСЧЕТ)")
    print("="*60)
    
    # Анализ прогнозов направления
    if all_predictions:
        correct_directions = sum(p['correct_direction'] for p in all_predictions)
        total_predictions = len(all_predictions)
        accuracy = correct_directions / total_predictions if total_predictions > 0 else 0
        
        print(f"\n1. ТОЧНОСТЬ ПРОГНОЗА НАПРАВЛЕНИЯ:")
        print(f"   Всего прогнозов: {total_predictions}")
        print(f"   Правильных: {correct_directions}")
        print(f"   Точность: {accuracy:.4f} ({accuracy*100:.2f}%)")
        
        # Матрица ошибок
        actual_dirs = [p['actual_direction'] for p in all_predictions]
        pred_dirs = [p['pred_direction'] for p in all_predictions]
        
        if total_predictions > 0:
            cm = confusion_matrix(actual_dirs, pred_dirs)
            print(f"\n   Матрица ошибок:")
            print(f"   True 0 (↓) predicted as 0: {cm[0,0]}")
            print(f"   True 0 (↓) predicted as 1: {cm[0,1]}")
            print(f"   True 1 (↑) predicted as 0: {cm[1,0]}")
            print(f"   True 1 (↑) predicted as 1: {cm[1,1]}")
            
            # Анализ силы инерции
            strength_error = np.mean([p['strength_error'] for p in all_predictions])
            print(f"\n   Средняя ошибка силы инерции: {strength_error:.4f}")
    
    # Анализ торговых результатов
    if trade_results:
        total_trades = len(trade_results)
        successful_trades = sum(1 for t in trade_results if t['success'])
        correct_direction_trades = sum(1 for t in trade_results if t['correct_trade'])
        success_rate = successful_trades / total_trades if total_trades > 0 else 0
        direction_accuracy = correct_direction_trades / total_trades if total_trades > 0 else 0
        
        total_pnl = sum(t['pnl'] for t in trade_results)
        avg_pnl = total_pnl / total_trades if total_trades > 0 else 0
        avg_pnl_pct = sum(t['pnl_pct'] for t in trade_results) / total_trades if total_trades > 0 else 0
        
        # Разделяем LONG и SHORT
        long_trades = [t for t in trade_results if t['direction'] == 'LONG']
        short_trades = [t for t in trade_results if t['direction'] == 'SHORT']
        
        print(f"\n2. РЕЗУЛЬТАТЫ ТОРГОВЛИ:")
        print(f"   Всего сделок: {total_trades}")
        print(f"   Прибыльных сделок: {successful_trades}")
        print(f"   Сделок с правильным направлением: {correct_direction_trades}")
        print(f"   Успешность: {success_rate:.4f} ({success_rate*100:.2f}%)")
        print(f"   Точность направления в сделках: {direction_accuracy:.4f}")
        print(f"   Общий P&L: {total_pnl:.4f}")
        print(f"   Средний P&L за сделку: {avg_pnl:.4f}")
        print(f"   Средний P&L в %: {avg_pnl_pct:.4f}%")
        
        print(f"\n3. ДЕТАЛИЗАЦИЯ ПО ТИПАМ СДЕЛОК:")
        if long_trades:
            long_success = sum(1 for t in long_trades if t['success']) / len(long_trades) if long_trades else 0
            print(f"   LONG сделок: {len(long_trades)}")
            print(f"   Успешность LONG: {long_success:.4f}")
        
        if short_trades:
            short_success = sum(1 for t in short_trades if t['success']) / len(short_trades) if short_trades else 0
            print(f"   SHORT сделок: {len(short_trades)}")
            print(f"   Успешность SHORT: {short_success:.4f}")
        
        # Анализ зависимости успеха от силы сигнала
        print(f"\n4. ЗАВИСИМОСТЬ ОТ СИЛЫ СИГНАЛА:")
        strength_bins = [0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0]
        for i in range(len(strength_bins) - 1):
            low = strength_bins[i]
            high = strength_bins[i + 1]
            bin_trades = [t for t in trade_results if low <= t['pred_strength'] < high]
            if bin_trades:
                bin_success = sum(1 for t in bin_trades if t['success']) / len(bin_trades)
                bin_direction_acc = sum(1 for t in bin_trades if t['correct_trade']) / len(bin_trades)
                print(f"   Сигнал [{low:.2f}-{high:.2f}]: {len(bin_trades):4d} сделок, успешность {bin_success:.4f}, точность напр. {bin_direction_acc:.4f}")
    
    else:
        print("Нет сделок для анализа. Попробуйте уменьшить inertia_threshold.")
    
    return all_predictions, trade_results


20 Комментариев
  • Ийон Тихий
    31 августа 2025, 09:34
    Ох уж эти кодописцы, заложите хотя бы 0.04% комиссии на сторону и 0.01% на проскальзывание
  • Валерий Осипенко
    31 августа 2025, 09:43
    на рынке есть инерция как у физического объекта —
    есть такое и если научится видеть первичный толчок то легко отыграть весь лонг и уйти  в деньгами
    я в так играю на дневках
    но никакой математики 

    чистый интуитив
  • T-800
    31 августа 2025, 10:42
    % угаданных направлений сделки не важен. Скажу больше, в прибыльных трендовых системах часто 30% угаданных направлений, а 70% не угаданных, и это приносит прибыль, а в убыточных, например в Мартингейле может быть наоборот 95% угаданных и 5 не угаданных и разоривших депозит.

    Переведите результаты в понятные в системном трейдинге: Итог/Дродаун, Средняя сделка%, Профит фактор и т.д. Тогда результаты будут понятны ваших изысканий.  
  • SergeyJu
    31 августа 2025, 11:14
    Если 5 м лучше, чем 1 м, может быть стоит перейти к 15 м или 1 час? 
    Транзакционные издержки на каждую смену позиции учитывать обязательно надо. 
    1 год статистики мало. 
    Обязательно считать капитал после каждой сделки. Тогда можно использовать стандартные метрики, типа Сортино и максимальной просадки.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн