2

这里有点啰嗦,但非常感谢一些帮助。

我有一个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
4

0 回答 0