这里有些麻烦,但确实会有所帮助。
我有df
个股票数据,我想做的是测试Z分数的有效性,基本上是在绘制每只股票的Z分数,然后计算远期收益100天,然后将它们相互绘制以确定是否存在相关性。
但是,我只对极端感兴趣,而对买入仅感兴趣,因此我基本上只对较大的负Z分数感兴趣,比如说-3或更多的负数,以及它们相应的远期回报。 >
然后我还希望获得每只股票z得分与远期收益的R平方结果。
这是我到目前为止的位置。我将价格保存在一个名为data
的数据框中,最终我想要做的就是将所有符合条件的数据输入到df
中,然后全部绘制。我正试图将数据放入一个较长的数据框中,因为我对股票名称不感兴趣,因为我只是在按时绘制数据。
因此,我首先计算Zscore和所谓的正向收益,这很简单。但是,它们都产生NaN,因此为了避免df
逐渐变小,我将这些新数据放入newdf
中并丢弃NaN。
然后我用Zscores对newdf
进行排序,以返回-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之类的东西,但是我必须做些反复试验,这是机器学习可以帮助的吗?如果是这样,最好的方法是使用google /继续阅读?我不希望自己回答这个大问题。
真的很感谢任何帮助,欢呼声
以下是我的库存数据示例:
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