С трендингом практически не знаком, занимаюсь разработкой программных решений.
Вдохновлённый теорией пузырькового состояния, и сделав предположение, что у цены на рынке есть инерция как у физического объекта — попробовал несколько вариантов как подготовить данные и какую архитектуру нейросети построить, вроде есть какой-то успех.
Обучалось на 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