• An example of using Pandas for regression


    An example of using Pandas for regression

    这个例子来自这本书 - "Python for Data Analysis", 这本书的作者 Wes McKinney 就是pandas的作者。

    pandas提供了一些很方便的功能,比如最小二乘法(OLS),可以用来计算回归方程式的各个参数。 同时pandas还可以输出类似ANOVA的汇总信息,比如决定系数(R平方), F 统计量等。

    OK,直接上例子。

    数据准备

    首先创建1000只股票,股票代码(5个字符)通过随机方式生成。

    In [29]: import string
    
    In [32]: import random
    
    In [33]: random.seed(0)
    
    In [34]: N = 1000
    
    In [35]: def rands(n):
       ....:     choices = string.ascii_uppercase
       ....:     return ''.join([random.choice(choices) for _ in xrange(n)])
       ....:
    
    In [36]: tickers = np.array([rands(5) for x in xrange(N)]) 
    

    回归分析

    假设现在有个 multiple factor model, 如下所示:

    y = 0.7 * x1 - 1.2 * x2 + 0.3 * x3 + random value
    

    按照这个模型创建一个portfolio, 然后我们再拿实际得到的值来跟这3个factor来做下回归分析,看得到的系数是不是跟上面的这个model比较接近。

    首先创建三个随机数组(每个大小都为1000, 对应刚才创建的1000只股票),分别为fac1, fac2, 和fac3.

    In [58]: from numpy.random import rand
    
    In [59]: fac1, fac2, fac3 = np.random.rand(3, 1000)
    
    In [62]: ticker_subset = tickers.take(np.random.permutation(N)[:1000])
    

    用选择的1000只股票按照上面的model创建portfolio, 得到的一组值也就是因变量y.

    In [64]: port = Series(0.7*fac1 - 1.2*fac2 + 0.3*fac3 + rand(1000), index=ticker_subset)
    

    现在我们用实际得到y和x1/x2/x3来做下回归。 首先把三个factors 构建成DataFrame.

    In [65]: factors = DataFrame({'f1':fac1, 'f2':fac2, 'f3':fac3}, index=ticker_subset)
    

    然后就直接调用pd.ols方法来进行回归 -

    In [70]: pd.ols(y=port, x=factors)
    Out[70]:
    
    -------------------------Summary of Regression Analysis-------------------------
    
    Formula: Y ~ <f1> + <f2> + <f3> + <intercept>
    
    Number of Observations:         1000
    Number of Degrees of Freedom:   4
    
    R-squared:         0.6867
    Adj R-squared:     0.6857
    
    Rmse:              0.2859
    
    F-stat (3, 996):   727.6383, p-value:     0.0000
    
    Degrees of Freedom: model 3, resid 996
    
    -----------------------Summary of Estimated Coefficients------------------------
          Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
    --------------------------------------------------------------------------------
                f1     0.6968     0.0311      22.44     0.0000     0.6359     0.7577
                f2    -1.2672     0.0312     -40.64     0.0000    -1.3283    -1.2061
                f3     0.3345     0.0310      10.80     0.0000     0.2738     0.3952
         intercept     0.5018     0.0275      18.28     0.0000     0.4480     0.5557
    ---------------------------------End of Summary---------------------------------
    
    In [71]:
    

    根据回归结果,得到的方程式是 -

    y = 0.5018 + 0.6968 * f1 - 1.2672 * f2 + 0.3345 * f3
    

    对比下实际的model -

    y = 0.7 * x1 - 1.2 * x2 + 0.3 * x3 + random value 
    

    可以看出还是比较match的。这个从每个参数p-value也可以看出来。

    另外,如果只想关注每个系数,可以直接读取beta.

    In [71]: pd.ols(y=port, x=factors).beta
    Out[71]:
    f1           0.696817
    f2          -1.267172
    f3           0.334505
    intercept    0.501836
    dtype: float64
    

    怎么样,感觉pandas是不是棒棒哒!

  • 相关阅读:
    BlockingQueue 原理 分析
    java引用 强引用,软引用,弱引用
    actomic cas无锁操作。
    MongoDB库设计原则及实践
    spring事物传播机制 事物隔离级别
    Hive UDAF介绍与开发
    [技术学习]js接口继承
    [技术学习]js继承
    [技术学习]正则表达式分析
    [技术学习]js正则表达式汇总
  • 原文地址:https://www.cnblogs.com/fangwenyu/p/4284523.html
Copyright © 2020-2023  润新知