Files
chinese-equity-quant/backtest/feed.py
T

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)