"""Convert pandas DataFrames to backtrader data feeds.""" import backtrader as bt import pandas as pd def df_to_bt_feed(df: pd.DataFrame) -> bt.feeds.PandasData: """Convert a standardized OHLCV DataFrame to a backtrader PandasData feed.""" df = df.copy() df["date"] = pd.to_datetime(df["date"]) df = df.set_index("date") df = df[["open", "high", "low", "close", "volume"]] return bt.feeds.PandasData(dataname=df) class SignalPandasData(bt.feeds.PandasData): """PandasData feed carrying an extra ``signal`` line alongside OHLCV.""" lines = ("signal",) params = (("signal", -1),) # -1 -> match by column name def df_to_signal_feed(df: pd.DataFrame) -> "SignalPandasData": """Convert an OHLCV+signal DataFrame to a SignalPandasData feed. Args: df: DataFrame with ``date``, OHLCV columns, and a ``signal`` column. Returns: A SignalPandasData feed (NaN signals are preserved for the strategy to skip). """ df = df.copy() df["date"] = pd.to_datetime(df["date"]) df = df.set_index("date") df = df[["open", "high", "low", "close", "volume", "signal"]] return SignalPandasData(dataname=df)