问题描述
标准差是方差开根号,但我看网上方差却有两种算法
一种是
((x1-均值)²+(x2-均值)²...(xn-均值)²)/n
另一种是
((x1-均值)²+(x2-均值)²...(xn-均值)²)/(n-1)
但网上也并没有说两种(特别是第二种)的根据分别是什么。
请问在量化投资中,应该选择哪一种?为什么?
ps:因为问题是在涉及标准差时遇到的,我知道如果直接问方差可能更加方便一些,但我怕万一 平时方差用其中一种,但一涉及标准差时就用另一种算法,那就麻烦了,所以问题描述显得有点冗余,还请包涵……
解决方案
在量化投资和统计学中,标准差和方差的计算确实存在除以 n 和除以 n-1 两种公式。这并不是随意选择的,而是有着严格的统计学背景。简单来说,这取决于你的数据是总体(Population)还是样本(Sample)。
1. 两种公式的统计学根据
- 除以 n:总体方差/标准差(Population Variance/Standard Deviation)
当你拥有的数据包含了你所要研究的所有对象时,使用除以n。此时计算出的是真实的、确切的方差。 - 除以 n-1:样本方差/标准差(Sample Variance/Standard Deviation)
当你拥有的数据只是总体的一个样本,而你试图通过这个样本去估计总体的方差时,使用除以n-1。在统计学中,这被称为贝塞尔无偏估计(Bessel's Correction)。因为样本的均值往往比总体均值更靠近样本数据本身,如果直接除以n会低估真实的总体方差。除以n-1可以修正这种偏差,得到总体方差的无偏估计。
2. 量化投资中应该选择哪一种?
在量化投资中,我们通常选择第二种(除以 n-1,即样本标准差)。
原因如下:
- 金融数据本质上是样本:我们获取的历史行情数据(如某只股票过去一年的日收益率),仅仅是该资产在无限时间长河或潜在收益率分布中的一个样本。我们计算历史波动率(标准差),是为了估计该资产真实的、潜在的波动率,而不是仅仅描述过去这几天的绝对数据。因此,使用无偏估计(除以 n-1)在逻辑上更严谨。
- 业界惯例与工具默认值:在量化分析中最常用的 Python 数据处理库 Pandas 中,计算标准差的
std()和方差的var()方法,默认的自由度(ddof)都是 1,也就是默认除以n-1。
3. Python 与 JoinQuant 平台中的实现注意点
在 JoinQuant 平台上编写策略时,你通常会用到 Pandas 和 NumPy,需要特别注意它们的默认行为差异:
- Pandas:默认计算样本标准差(除以 n-1)。
df['close'].std()-> 默认ddof=1 - NumPy:默认计算总体标准差(除以 n)。
np.std(array)-> 默认ddof=0
如果你希望在 NumPy 中计算样本标准差,需要显式指定自由度:np.std(array, ddof=1)。
总结:在量化投资中计算波动率或风险指标时,请统一使用除以 n-1 的样本标准差。当样本量 n 很大(例如计算过去252个交易日的年化波动率)时,除以 n 和 n-1 的结果差异微乎其微,但在严谨的量化研究中,保持统计学意义上的正确性(使用 n-1)是更好的习惯。