немного затянуто здесь, но был бы очень признателен за помощь.
У меня есть df
данных о запасах, и я пытаюсь проверить эффективность Z-показателей, и в основном строю график Z-показателей для каждой акции, а затем рассчитываю форвардный доходболее 100 дней, и вычерчивая их друг против друга, чтобы определить, есть ли корреляция.
Однако меня интересуют только крайности и интересует только сторона покупки, поэтому я в основном интересуюсь только большим, отрицательнымZ-оценки, скажем, -3 или более отрицательных, и соответствующие им форвардные доходы.
Затем я также хочу получить результат R-квадрата для каждой акции z балла против форвардных возвратов.
Вот где я сейчас нахожусь.У меня есть цены в кадре данных, называемом data
, и в конечном итоге я хочу ввести все соответствующие данные в df
, а затем построить их все.Я пытаюсь просто перенести данные в один длинный фрейм данных, поскольку меня не интересует название акций, поскольку я просто отображаю данные в минуту.
Итак, я начинаю с вычисления Zscoreи то, что я называю прямым возвратом, который довольно прост.Они оба производят NaN, однако, чтобы избежать постепенного уменьшения df
при прохождении цикла, я помещаю эти новые данные в newdf
и сбрасываю NaN.
Затем я сортирую это newdf
по Zscores, чтобы вернуть любые данные, которые имеют -3 или меньше, и именно здесь я столкнулся с моей первой проблемой.Если запас не имеет данных для Zscores или -3 или меньше, он выдает ошибку, и цикл прерывается.
ValueError: Found array with 0 sample(s) (shape=(0, 1)) while a minimum of 1 is required.
Это ошибка, которую я получаю.Я протестировал его на -2
, и все работает нормально, просто чтобы убедиться, что остальная часть сценария работает.
Затем я выполняю линейную регрессию, чтобы вернуть r-квадрат, и использую это число.в качестве другого квалификатора, с помощью которого можно получить мой окончательный кадр данных, df
.
df = []
for stock in stocks:
newdf = []
data['zscore'] = (data[stock] - data[stock].rolling(100).mean()) / data[stock].rolling(100).std()
data['fwd100'] = (data[stock].rolling(10).mean().shift(-105) - data[stock]) / data[stock]
newdf.append(data[['zscore', 'fwd100']])
newdf = pd.concat(newdf, axis=1)
newdf.dropna(inplace=True)
newdf.sort_values('zscore', inplace=True)
newdf = newdf[newdf.zscore < -3]
X = newdf['zscore'].values.reshape(-1, 1)
y = newdf['fwd100'].values.reshape(-1, 1)
linear_regressor = LinearRegression()
linear_regressor.fit(X, y)
rsq = linear_regressor.score(X, y)
if rsq > 0.3:
df.append(newdf[['zscore', 'fwd100']])
df = pd.concat(df, axis=0)
sns.regplot(df['zscore'],df['fwd100'])
plt.show()
Используя -2
в качестве моего параметра, я получаю следующий график разброса.
Итак, мой первый вопрос: как я могу предотвратить возникновение этой ошибки, если у акции нет соответствующих данных?Во-вторых, это самый эффективный способ для меня сделать это?Я чувствую, что я делал несколько работ вокруг.И в-третьих, я смотрю на 100-дневные Zscores и 100-дневные форвардные возвраты, но это довольно произвольное число, возможно, оптимальная комбинация будет 75 и 125 или что-то в этом роде, но мне придется сделать небольшую пробу и ошибку,Это то, с чем может помочь машинное обучение.Если так, что лучше всего гуглить / читать?Я не ожидаю громкого ответа, который я с удовольствием прочту на нем.
Любая помощь действительно приветствуется, ура
Вот пример моих данных о запасах:
Stock A Stock B Stock C Stock D Stock E
Date
01/04/2019 8.17 1.11 3.22 11.58 1.20
02/04/2019 8.17 1.11 3.21 11.53 1.20
03/04/2019 8.15 1.10 3.20 11.67 1.20
04/04/2019 8.12 1.10 3.21 11.66 1.21
05/04/2019 8.11 1.10 3.19 11.57 1.19
08/04/2019 8.11 1.09 3.18 11.46 1.20
09/04/2019 8.10 1.07 3.13 11.19 1.19
10/04/2019 8.15 1.08 3.13 11.30 1.17
11/04/2019 8.15 1.08 3.11 11.20 1.18
12/04/2019 8.14 1.09 3.09 11.17 1.19
15/04/2019 8.12 1.08 3.09 11.19 1.17
16/04/2019 8.11 1.08 3.08 11.02 1.17
17/04/2019 8.15 1.08 3.04 10.94 1.17
18/04/2019 8.14 1.08 3.05 11.05 1.18
19/04/2019 8.13 1.07 3.04 10.98 1.16