python backtest (bt) error - TypeError: unhashable type: 'Series'

90 Views Asked by At

I am trying to backtest some trading data using the bt module. When I run the script, it says "unhashable type: Series".

This is my data: Trading Data

This is my code:

data5 = pd.read_csv("export.csv", index_col="Date",  parse_dates=True)
data5["SMA_long"] = talib.SMA(data5["Close"], timeperiod=50)
data5["SMA_short"] = talib.SMA(data5["Close"], timeperiod=20)
signal = data5["SMA_long"].copy()
signal[data5["SMA_long"] > data5["SMA_short"]] = 1
signal[data5["SMA_long"] < data5["SMA_short"]] = -1
bt_strategy = bt.Strategy(
    'EMA_crossover', [bt.algos.WeighTarget(signal), bt.algos.Rebalance()])
bt_backtest = bt.Backtest(bt_strategy, data5, "test", 1000)
bt_result = bt.run(bt_backtest)
1

There are 1 best solutions below

0
On

the issue is related to the signal variable inside your code that is a pandas series and it is unhashable but WeightTarget requires a hashable input so hope it helps:

import pandas as pd
import numpy as np
import bt

# Sample trading data
data = {
    'Date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'],
    'Open': [100, 105, 110, 108, 115],
    'Close': [105, 110, 108, 115, 112],
    'High': [115, 112, 115, 116, 118],
    'Low': [98, 103, 107, 105, 108]
}

# Create DataFrame
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

# Calculate moving averages
df['SMA_long'] = df['Close'].rolling(window=50).mean()
df['SMA_short'] = df['Close'].rolling(window=20).mean()

# Generate signal as a DataFrame
signal_df = pd.DataFrame(index=df.index)
signal_df['Close'] = 0 # Default to 0
signal_df.loc[df['SMA_long'] > df['SMA_short'], 'Close'] = 1
signal_df.loc[df['SMA_long'] < df['SMA_short'], 'Close'] = -1

# Create strategy and backtest
bt_strategy = bt.Strategy('EMA_crossover', [bt.algos.WeighTarget(signal_df), bt.algos.Rebalance()])
bt_backtest = bt.Backtest(bt_strategy, df)
bt_result = bt.run(bt_backtest)

# Print results
print(bt_result)