pandas 在对我的模型进行回溯测试时Python中出现的无OBJECT TO CONCATENATE错误

y0u0uwnf  于 2023-08-01  发布在  Python
关注(0)|答案(1)|浏览(332)

我试图通过提供一些数据来回测试我的代码,但它显示“ValueError:没有要连接的对象”
下面是我的代码:

import yfinance as yf
import numpy as np
import pandas as pd

sp_500 = yf.Ticker("MSFT")
sp_500 = sp_500.history(period="max")

# sp_500.plot.line(y="Close", use_index=True)

del sp_500["Dividends"]
del sp_500["Stock Splits"]

sp_500["Tomorrow"] = sp_500["Close"].shift(-1)

sp_500["Target"] = (sp_500["Tomorrow"] > sp_500["Close"]).astype(int)  # for boolean value instead of TRUE AND FALSE

sp_500 = sp_500.loc["2022-01-01":].copy()

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import precision_score

model = RandomForestClassifier(n_estimators=100, min_samples_split=100, random_state=1)

train = sp_500.iloc[:-100]
test = sp_500.iloc[-100:]

predictors = ["Close", "Volume", "Open", "High", "Low"]
model.fit(train[predictors], train["Target"])

preds = model.predict(test[predictors])
preds = pd.Series(preds, index=test.index)

combined = pd.concat([test["Target"], preds], axis=1)

def predict(train, test, predictors, model):
    model.fit(train[predictors], train["Target"])
    preds = model.predict(test[predictors])
    preds = pd.Series(preds, index=test.index, name="Predictions")
    combined = pd.concat([test["Target"], preds], axis=1)
    return combined

def backtest(data, model, predictors, start=2500, step=250):
    all_predictions = []

    for i in range(start, data.shape[0] - step, step):
        train = data.iloc[i:(i + step)]
        test = data.iloc[(i + step):(i + 2 * step)]
        predictions = predict(train, test, predictors, model)
        all_predictions.append(predictions)

    return pd.concat(all_predictions)

predictions = backtest(sp_500, model, predictors)
print(predictions["Predictions"].value_counts())

字符串
我期待的输出将是预测价格上升和下降在回测过程中的计数。“预测”栏中预测的“1”(价格上涨)和“0”(价格下跌)的数量将显示出来

3ks5zfa0

3ks5zfa01#

在函数backtest中,您不检查您的数据是否足够大,以满足start=2500step=250参数的默认值。我相信这就是问题所在。此时(2023年7月30日),当您运行代码直到第一次调用backtest时,sp_500中的记录数只有394。所以函数不会启动内部循环:

for i in range(start, data.shape[0] - step, step)

字符串
因为range(2500, 394-250, 250)在这个例子中是空的,对吗?所以它直接跳到线上

return pd.concat(all_predictions)


其中all_predictions仍然是一个空列表。这就是为什么你会得到ValueError: No objects to concatenate-你实际上没有对象在输出。

相关问题