【问题标题】:What is the difference between this code and this formula?这段代码和这个公式有什么区别?
【发布时间】:2015-08-19 02:35:51
【问题描述】:

我正在编写一个算法并计算每日收益分布的峰度。我试图让我的峰度计算与 Excel 的计算相匹配。 Excel 的计算应该使用此网页顶部的公式:http://www.macroption.com/kurtosis-excel-kurt/

这是我用来模拟该公式的代码(returns 是一个由一系列每日回报组成的 numpy 数组):

def kurtosis(returns):
    n = len(returns)
    avg = np.average(returns)
    std = np.std(returns)
    coefficient = 1.0 * n * (n+1) / ((n-1) * (n-2) * (n-3) * std**4.0)
    term = (3 * (n-1)**2.0) / ((n-2) * (n-3))
    summation = 0

    for x in returns: 
        summation += ( (x - avg) ) ** 4.0
    kurt = coefficient * summation - term

    return kurt 

显然,excel 使用的公式和我的代码之间存在差异...... Excel 给出的峰度为 1.94,而我的代码给出的值为 2.81。

有人知道为什么这两个值不同吗?

【问题讨论】:

  • 您可以为std 尝试不同的ddof,例如。 ddof=1。检查该函数的文档。通常选择population v sample dof的效果很小,但是使用s**4,效果会被放大。
  • 您还可以使用scipy.stats.kurtosis,并查找其他[numpy] kurtosis SO 问题。
  • 给出不同值的数据样本是什么?如果在此处发布太大,您能否找到一个可以在此处发布的小数据样本,以产生不同的答案?
  • (不是解决方案)您可以用summation=np.sum((returns-avg)**4) 替换您的for 循环
  • @hpaulj 我可以确认使用std = np.std(returns, ddof = 1) 与使用来自Microsoft's kurtosis help page 的数据的Excel 提供相同的结果。也许你应该把你的评论作为答案?

标签: python numpy statistics finance kurtosis


【解决方案1】:

重写我的评论:

np.std() 提供ddof=1 参数会将其计算从总体更改为样本(n-1)。通常std 的变化很小,但随着s**4 的使用,s 的微小变化会被放大。

【讨论】:

    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 2021-01-06
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多