我试图通过提供一些数据来回测试我的代码,但它显示“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”(价格下跌)的数量将显示出来
1条答案
按热度按时间3ks5zfa01#
在函数
backtest
中,您不检查您的数据是否足够大,以满足start=2500
和step=250
参数的默认值。我相信这就是问题所在。此时(2023年7月30日),当您运行代码直到第一次调用backtest
时,sp_500
中的记录数只有394。所以函数不会启动内部循环:字符串
因为
range(2500, 394-250, 250)
在这个例子中是空的,对吗?所以它直接跳到线上型
其中
all_predictions
仍然是一个空列表。这就是为什么你会得到ValueError: No objects to concatenate
-你实际上没有对象在输出。