36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""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)
|