我正在研究一个财务问题,我要实现一个函数,在每只股票的信号回报的正态分布之间使用 Kolmogorov-Smirnov 检验(KS 检验)。我要针对每只股票的信号回报在正态分布上运行 KS 测试,为了测试,我将使用scipy.stats.kstest来执行 KS 测试。
- 建议我迭代groupby函数
- 我只需要使用 pandas、numpy 和 scipy。
我的功能如下:
def calculate_kstest(long_short_signal_returns):
"""
Calculate the KS-Test against the signal returns with a long or short signal.
Parameters
----------
long_short_signal_returns : DataFrame
The signal returns which have a signal.
This DataFrame contains two columns, "ticker" and "signal_return"
Returns
-------
ks_values : Pandas Series
KS static for all the tickers
p_values : Pandas Series
P value for all the tickers
"""
#TODO: Implement function
ks_v = []
p_v = []
#print(long_short_signal_returns)
column = []
df = long_short_signal_returns.copy()
print(df)
#df['signal_return'] = (df['signal_return'] - df['signal_return'].mean()) / (df['signal_return'].max() - df['signal_return'].min())
for name, group in df.groupby('ticker'):
sub_group = group['signal_return'].values
ks,p = kstest(sub_group,'norm')
ks_v.append(ks)
p_v.append(p)
column.append(name)
ks_values = pd.Series(ks_v,column)
p_values = pd.Series(p_v, column)
return ks_values, p_values
但是,我的回答与预期的输出不符。
输入是:
INPUT long_short_signal_returns:
signal_return ticker
0 0.12000000 DNTM
1 -0.83000000 EHX
2 0.37000000 VWER
3 0.83000000 DNTM
4 -0.34000000 EHX
5 0.27000000 VWER
6 -0.68000000 DNTM
7 0.29000000 EHX
8 0.69000000 VWER
9 0.57000000 DNTM
10 0.39000000 EHX
11 0.56000000 VWER
12 -0.97000000 DNTM
13 -0.72000000 EHX
14 0.26000000 VWER
我的输出是:
OUTPUT ks_values:
DNTM 0.20326939
EHX 0.34826827
VWER 0.60256811
dtype: float64
OUTPUT p_values:
DNTM 0.98593727
EHX 0.48009144
VWER 0.02898631
dtype: float64
预期的输出是:
EXPECTED OUTPUT FOR ks_values:
DNTM 0.28999582
EHX 0.34484969
VWER 0.63466098
dtype: float64
EXPECTED OUTPUT FOR p_values:
DNTM 0.73186935
EHX 0.49345487
VWER 0.01775987
dtype: float64
有人告诉我在获得正确的 p_values 和 ks_values 之前使用正确的标准化,但我不明白这种正确的标准化意味着什么以及如何解决这个问题。有人可以帮忙吗??