feat: signal abstraction layer + sizer + HS300 universe + PnL/IC reports
This commit is contained in:
@@ -10,3 +10,26 @@ def df_to_bt_feed(df: pd.DataFrame) -> bt.feeds.PandasData:
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user