这里有点啰嗦,但非常感谢一些帮助。
我有一个df
股票数据,我想做的是测试 Z 分数的有效性,基本上是绘制每只股票的 Z 分数,然后计算 100 天的远期回报,并将它们与每个股票进行对比其他以确定是否存在相关性。
但是,我只对极端情况感兴趣,只对买方感兴趣,所以我基本上只对较大的负 Z 分数感兴趣,比如 -3 或更多负数,以及它们相应的远期回报。
然后,我还想获得每个股票 z 分数与远期回报的 R 方结果。
这就是我目前所处的位置。我将价格保存在一个名为的数据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 天的 Z 分数和 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