首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能把指数加权纳入分布拟合吗?

你能把指数加权纳入分布拟合吗?
EN

Stack Overflow用户
提问于 2017-08-30 20:26:05
回答 1查看 1.1K关注 0票数 0

鉴于一些时间序列数据:

代码语言:javascript
复制
np.random.seed(123)
r = pd.Series(np.random.beta(a=0.5, b=0.5, size=1000),
              index=pd.date_range('2013', periods=1000))

以及scipy.stats._continuous_distns._distn_names内部的分布

代码语言:javascript
复制
import scipy.stats as scs
dists = scs._continuous_distns._distn_names

我希望能够建立一个新的分布,然后调用它的.ppf (百分比点函数),同时将指数权值加入到分布的构建中。

例如,对于正常分布,这只需估计指数加权均值和标准差:

所有连续分布都以loc和scale作为关键字参数来调整分布的位置和规模,例如,对于标准正态分布,位置是均值,尺度是标准差。[来源]

代码语言:javascript
复制
ewm = r.ewm(span=60)
loc = ewm.mean().iloc[-1]
scale = ewm.std().iloc[-1]
print(scs.norm.ppf(q=0.05, loc=loc, scale=scale))
-0.196734019969

但我希望能够将其扩展到更广泛的连续分布家族,其中经常涉及到其他参数(shape)。例如,

如何将此过程扩展到分布 (除了locscale之外还有参数)

来自上面的组合片段:

代码语言:javascript
复制
import scipy.stats as scs
import numpy as np
import pandas as pd
np.random.seed(123)
r = pd.Series(np.random.beta(a=0.5, b=0.5, size=1000),
              index=pd.date_range('2013', periods=1000))
ewm = r.ewm(span=60)
loc = ewm.mean().iloc[-1]
scale = ewm.std().iloc[-1]
print(scs.norm.ppf(q=0.05, loc=loc, scale=scale))
# -0.196734019969
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-31 02:20:05

以下是我的实现:

  • 给出一个经验分布的x,给每个x分配指数权重。
  • 使用这些权重引导一个新发行版的示例。权重是np.random.choicenp.random.choice参数。
  • 然后,可以在该引导数据上调用任何发行版的.fit方法。

代码:

代码语言:javascript
复制
def ewm_weights(i, alpha):
    w = (1 - alpha) ** np.arange(i)[::-1]
    w /= w.sum()
    return w

def bootstrap(a, alpha, size=None):
    p = ewm_weights(i=len(a), alpha=alpha)
    return np.random.choice(a=a, size=size, p=p)

ewm_weights的定义如下:

http://pandas.pydata.org/pandas-docs/stable/computation.html#exponentially-weighted-windows

adjust=True

示例:

代码语言:javascript
复制
# Create a nonstationary `x` variable with larger mean and stdev in period 2
x1 = np.random.normal(loc=4, scale=3, size=1000)
x2 = np.random.normal(loc=10, scale=5, size=1000)
x = np.hstack((x1,x2))

x的直方图如下所示:

代码语言:javascript
复制
plt.hist(x, bins=25)

虽然带有b的引导alpha=0.03看起来如下:

代码语言:javascript
复制
b = bootstrap(x, alpha=0.03, size=int(1e6))
plt.hist(b, bins=25)

然后,来自scipy.stats._continuous_distns._distn_names的任何连续分发都可以适合于b

问题:

  • 使用softmax函数可以使ewm_weights更安全。
  • 这种方法忽略了x中的自相关。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45969140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档