В Algotrading, как постепенно вычислять функции для новых живых свечей, обеспечивая консистенцию в полной мере (Pandas/TPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 В Algotrading, как постепенно вычислять функции для новых живых свечей, обеспечивая консистенцию в полной мере (Pandas/T

Сообщение Anonymous »

Я разрабатываю живую торговый бот в питоне, который получает данные OHLCV (например, 15 млн. Свечи) и вычисляет большое количество функций-индикаторы ролики (VWAP/Volume-ADI, SMA/EMA/ATR/RSI), ценовая действие, объем и т. Д. Повторяйте весь набор данных каждый цикл.
Однако, когда я делаю это, функции для новой свечи часто не совпадают с тем, что я получаю, если я пересматриваю весь набор данных, заставляя мою модель, давая противоречивые прогнозы между режимами в прямом эфире и партии (Backest). (упрощено): < /h3>
import pandas as pd
from ohlcv_data_util import ensure_ohlcv_updated
from signal_generator import generate_signal

# Fetches all candles from 2023
df_15m = ensure_ohlcv_updated(client, symbol, "15m", "15m_ohlcv.csv")

# Only predict for the latest closed candle (for live)
use_idx = df_15m.index[-2] # Assume last candle is still forming

features_row, signal, atr, idx = generate_signal(df_15m, force_idx=use_idx)
< /code>
поместите порядок на основе сигнала ... < /h1>
signal_generator.py (упрощенное): < /h3>

import pandas as pd
import joblib
from feature_engineering_util import run_pipeline

MODEL = joblib.load("model.pkl")
SCALER = joblib.load("scaler_selected.pkl")
FEATURES = joblib.load("selected_feature_names.pkl")

def generate_signal(df_15m, force_idx=None):
if force_idx is not None:
target_idx = force_idx
else:
target_idx = df_15m.index[-2]

# (Here's the efficiency problem:) Only pass a window for speed:
window = 1500
pos_end = df_15m.index.get_loc(target_idx)
df_15m_sub = df_15m.iloc[max(0, pos_end - window + 1): pos_end + 1]
features_df = run_pipeline(df_15m_sub)

if target_idx not in features_df.index:
print(f"[DEBUG] Features for {target_idx} missing")
return None, None, None, None

features_row = features_df.loc[target_idx]
X = SCALER.transform(features_row[FEATURES].values.reshape(1, -1))
proba = MODEL.predict_proba(X)[0]
cls = MODEL.classes_.tolist()
p_long = proba[cls.index(1)]
p_short = proba[cls.index(-1)]
signal = 1 if p_long > p_short and p_long > 0.3 else -1 if p_short > p_long and p_short > 0.3 else 0
atr = features_row.get("atr", 0)
return features_row, signal, atr, target_idx
< /code>
функциональныйimport pandas as pd
import ta

def run_pipeline(df):
# Adds many rolling/stat features
df['ema_200'] = df['close'].ewm(span=200, adjust=False).mean()
df['rsi_14'] = pd.Series(...) # Rolling RSI
df = ta.add_all_ta_features(df)
# ... other features ...
df = df.dropna()
return df
< /code>
Проблема < /h3>
При запуске пакетного режима по всему набору данных (для бэктов) мои функции и модельные прогнозы, как и ожидалось. Особенности проката, такие как EMA и т. Д. < /p>
Это заставляет мою модель давать противоречивые сигналы в прямом эфире против бэк -теста.features_full = run_pipeline(df_15m)
signal_full = model.predict(scaler.transform(features_full.iloc[-1][FEATURES].values.reshape(1, -1)))
< /code>
"live" encremental < /h1>
window = 1500
features_recent = run_pipeline(df_15m.iloc[-window:])
signal_recent = model.predict(scaler.transform(features_recent.iloc[-1][FEATURES].values.reshape(1, -1)))
< /code>
часто: signal_full! = signal_recent # или, features_full.iloc [-1]! = features_recent.iloc [-1] < /h1>
то, что я пробовал < /strong>
, увеличивая окно (помогает, но все же не идеально подходит для очень длинных особенностей или ярких индикаторов). Только последние новые функции для основного рамки данных, но состояние теряется для некоторой статистики. История) Расчет - особенно для функций с Rolling/ema/state? /> < /li>
< /ul>
мои требования: < /strong> < /p>

Используйте панды или векторизованные библиотеки, если это возможно для скорости. Код, советы или указатели на библиотеки/инструменты, которые обрабатывают это надежно для торговли/мл высоко ценится!

Подробнее здесь: https://stackoverflow.com/questions/796 ... candles-en
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • В Algotrading, как постепенно вычислять функции для новых живых свечей, обеспечивая консистенцию в полной мере (Pandas/T
    Anonymous » » в форуме Python
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Как постепенно добавлять строки в Pandas Dataframe?
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Как постепенно добавить строки в DataFrame Pandas?
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Python: построение свечей с автоматическим масштабированием по оси Y
    Anonymous » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Backtrader показывает одинаковое время для всех свечей
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»