使用python做FamaMacBeth回归

2023-11-03

金融资产定价常常需要用到FamaMacBeth回归。我们用python写一个模板,可以直接将数据调成需要的格式,代入代码即可出结果。所要求的数据格式,可以从链接下载。
https://download.csdn.net/download/weixin_45590329/87844944

需要注意的是,linearmodels中的FamaMacBeth( )方法一共执行了两步:第一步,在每个时间t的横截面上,用Y对X回归,然后产生一条由各个时间上的X的回归系数组成的时间序列;第二步,对X的回归系数的时间序列进行统计检验,分别计算他们的均值、t值、P值等。

首先载入代码框架

from linearmodels import FamaMacBeth
import pandas as pd
import numpy as np

class MyFamaMacBeth():

    def __init__(self,
                 ):
        pass

    #根据P值返回星号
    def star(self,p):
        if p<0.01:
            return '***'
        elif p<=0.05:
            return '**'
        elif p<=0.1:
            return '*'
        else:
            return ''

    #基本FM回归:一次只能回归一种模型
    def basic_FM(self,
        data,#面板数据
        Cols_X=['const','X1','X2','X3','X4','X5','X6','X7','X8'],#解释变量列标题
        Col_Y='Y',#被解释变量列标题
        Col_date='date',#日期的列标题
        Col_individual='individual',#个体的列标题
                 ):
        self.Cols_X=Cols_X
        self.Col_Y=Col_Y

        # 将数据格式修改为多个行标签的面板数据
        data = pd.pivot_table(data, index=[Col_date,Col_individual],
                              values=[Col_Y]+Cols_X)

        # 回归模型
        model = FamaMacBeth(dependent=data[Col_Y], exog=data[Cols_X])
        # 回归结果用Newey West方法进行调整,滞后阶数设置为6阶
        result = model.fit(cov_type='kernel', debiased=False, bandwidth=6)

        return result

    def basic_FM_summary(self,result,col_result='model',path_save=False):

        params=result.params
        t=result.tstats
        p=result.pvalues
        star=[self.star(x) for x in p]
        #数据合并
        values=pd.DataFrame({
            'Varible':params.index,
            'params':params,
            't':t,
            'star':star
        })
        #保留小数位数
        values['params']=values['params'].round(3).astype(str)
        values['t'] = values['t'].round(2).astype(str)
        #数据合并
        summary=pd.DataFrame({
            col_result:values['params']+values['star']+'('+values['t']+')',
        })
        summary=summary.append(pd.DataFrame([round(result.rsquared,3),len(result.resids)],index=[' Adj. R',' No. of obs'],columns=[col_result]))

        if path_save:
            summary.to_excel(path_save)

        return summary



    #FM回归,含有不同的模型
    def FM_multiple_models(self,
                           data,
                           models=[],
                           Col_date='date',  # 日期的列标题
                           Col_individual='individual',  # 个体的列标题
                           ):
        all_results={}
        all_summarys=[]
        for model in models:
            result = MFMB.basic_FM(data,  # 面板数据
                                             Cols_X=models[model]['X'],
                                             # 解释变量列标题
                                             Col_Y=models[model]['Y'],  # 被解释变量列标题
                                             Col_date=Col_date,  # 日期的列标题
                                             Col_individual=Col_individual,  # 个体的列标题
                                             )
            all_results[model]=result

            summary = MFMB.basic_FM_summary(result, col_result=model)
            all_summarys.append(summary)

        return all_results,all_summarys

    # 为 "FM回归,含有不同的模型" 整理出简洁结果
    def FM_multiple_models_summary(self,all_summarys,path_save=False):
        all_summarys=pd.concat(all_summarys,axis=1)
        all_summarys.sort_index(inplace=True)

        #保存路径
        if path_save:
            all_summarys.to_excel(path_save)

        return all_summarys


第一种使用方式,针对一种模型进行Fama回归:

###使用方式1:基本FM回归,一次只能回归一种模型
    ######################################
    # 第一步,生成测试所用面板数据集,该数据集在不同的日期有不同的个体
    # 期望回归模型:Y=3.4+6.6*X1-4*X2+7*X3-3*X4-4.9*X5+7.4*X6-4*X7-7.1*X8
    data = [[date, i] for date in pd.date_range('20050102', end='20060908', freq='D') for i in
            range(np.random.randint(20, 87))]  # 生成日期和个体
    data = pd.DataFrame(data, columns=['date', 'individual'])
    data['const'] = 1  # 生成常数项
    data[['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8']] = pd.DataFrame(np.random.normal(size=[len(data), 8]))  # 解释变量
    data['Y'] = 3.4 * data['const'] + 6.6 * data['X1'] - 4 * data['X2'] + 7 * data['X3'] - 3 * data['X4'] - 4.9 * data[
        'X5'] + 7.4 * data['X6'] - 4 * data['X7'] - 7.1 * data['X8'] + np.random.normal(size=len(data)) / 10  # 被解释变量

    #第二步,回归
    MFMB=MyFamaMacBeth()
    result=MFMB.basic_FM(data,#面板数据
        Cols_X=['const','X1','X2','X3','X4','X5','X6','X7','X8'],#解释变量列标题
        Col_Y='Y',#被解释变量列标题
        Col_date='date',#日期的列标题
        Col_individual='individual',#个体的列标题
        )

    # 第三步,整理出简洁结果
    summary=MFMB.basic_FM_summary(result, col_result='model',path_save='单Fama面板回归结果.xlsx')

第二种用法,可以同时针对多种模型进行回归:

###使用方式2:FM回归,含有不同的模型
    ######################################
    # 第一步,生成测试所用面板数据集,该数据集在不同的日期有不同的个体
    data = [[date, i] for date in pd.date_range('20050102', end='20060908', freq='D') for i in
            range(np.random.randint(20, 87))]  # 生成日期和个体
    data = pd.DataFrame(data, columns=['date', 'individual'])
    data['const'] = 1  # 生成常数项
    data[['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8']] = pd.DataFrame(np.random.normal(size=[len(data), 8]))  # 解释变量
    # 期望回归模型:Y1=3.4+6.6*X1-4*X2+7*X3-3*X4-4.9*X5+7.4*X6-4*X7-7.1*X8
    data['Y1'] = 3.4 * data['const'] + 6.6 * data['X1'] - 4 * data['X2'] + 7 * data['X3'] - 3 * data['X4'] - 4.9 * data[
        'X5'] + 7.4 * data['X6'] - 4 * data['X7'] - 7.1 * data['X8'] + np.random.normal(size=len(data)) / 10  # 被解释变量
    # 期望回归模型:Y2=-7.9-2*X1-1.9*X2+7.4*X3+3.5*X4+9.4*X5-5.2*X6-4.8*X7
    data['Y2'] = -7.9 * data['const'] -2 * data['X1'] - 1.9 * data['X2'] + 7.4 * data['X3'] + 3.5 * data['X4'] +9.4 * data[
        'X5'] -5.2 * data['X6'] - 4.8 * data['X7']  + np.random.normal(size=len(data)) / 10  # 被解释变量
    # 期望回归模型:Y3=8.4+2.1*X1+2.9*X2-2.8*X3-9.3*X4+7.7*X5
    data['Y3'] = 8.4 * data['const'] + 2.1 * data['X1'] +2.9 * data['X2'] - 2.8 * data['X3'] - 9.3 * data['X4'] +7.7 * data[
        'X5'] + np.random.normal(size=len(data)) / 10  # 被解释变量



    # 第二步,回归
    MFMB = MyFamaMacBeth()
    all_results,all_summarys = MFMB.FM_multiple_models(data,  # 面板数据
                                    #将模型结构按照顺序填进来
                                     models={
                                         'model1':{'Y':'Y1','X':['const','X1', 'X2','X7', 'X8']},
                                         'model2':{'Y':'Y1','X':['const','X1', 'X2',  'X5',  'X7', 'X8']},
                                         'model3':{'Y':'Y1','X':['const','X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8']},
                                         'model4':{'Y':'Y2','X':['const','X1', 'X2', 'X3', 'X4', 'X5']},
                                         'model5': {'Y': 'Y2',
                                                    'X': ['const', 'X1', 'X2', 'X3',  'X6', 'X7']},
                                         'model6': {'Y': 'Y3',
                                                    'X': ['const', 'X1', 'X2', 'X3', 'X4', 'X5']},
                                     },
                                     Col_date='date',  # 日期的列标题
                                     Col_individual='individual',  # 个体的列标题
                                     )

    # 第三步,整理出简洁结果
    all_summarys=MFMB.FM_multiple_models_summary(all_summarys=all_summarys,path_save='Fama面板回归结果.xlsx')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python做FamaMacBeth回归 的相关文章

  • Python:在列表理解本身中引用列表理解?

    这个想法刚刚出现在我的脑海中 假设您出于某种原因想要通过 Python 中的列表理解来获取列表的唯一元素 i if i in created comprehension else 0 for i in 1 2 1 2 3 1 2 0 0 3
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class

随机推荐

  • java中filereader读取文件_FileReader读取文件

    前言 FileReader是一种异步文件读取机制 结合input file可以很方便的读取本地文件 input file 在介绍FileReader之前 先简单介绍input的file类型 input的file类型会渲染为一个按钮和一段文字
  • [IDEA]报错 Could not autowire. No beans of 'XXXMapper' type found. less... (Ctrl+F1)

    在Idea的spring工程里 经常会遇到Could not autowire No beans of xxxx type found的错误提示 但程序的编译和运行都是没有问题的 这个错误提示并不会产生影响 但红色的错误提示在有些有强迫症的
  • ES基础操作及java代码

    ES相关随手记 文章目录 ES相关随手记 一 基本操作 1 es三大属性 索引 映射 文档 1 1 索引 1 2 映射 1 3 文档 1 3 2 文档的批量操作 二 高级查询 说明 1 查询所有 2 term 基于关键词查询 3 range
  • Apache + Tomcat + proxy_module 集群配置详解

    见转载 地址 http blog csdn net wccmfc123 article details 22829219 Apache Tomcat集群配置详解 2 补充 对 tomcat6 conf server xml文件修改配置如图
  • Camera日记(一)-ISP

    ISP Image Signal Processor 既图像信号处理 用于处理图像信号传感器输出的图像信号 它在相机系统肿占有核心主导的地位 是构成相机的重要设备 背景 图像采集设备存在缺陷 作用 数字图像经过采集 存储 显示 达到与人眼直
  • isce D-InSAR

    一 数据准备 二 配置文件insarApp xml 我设置的解缠常用参数grass和snaphu
  • 初等代数不等式1

    10 3赫尔德不等式还可以写成 即 即 简称 幂均值的几何均值不小于积均值 注 赫尔德与切比雪夫的不同点 赫尔德要求是 切比雪夫要求是同调 赫尔德的积均值小 切比雪夫的积均值大 10 4若 和为三个正实数序列 且 则 式称为加权赫尔德不等式
  • 【leetcode】93. 复原 IP 地址

    93 复原 IP 地址 题目链接 思路分析 代码实现 题目链接 93 复原 IP 地址 思路分析 既然是复原IP地址 那么就必然需要一个判断是否符合IP的函数 其次我们对于一段处理好的子串 需要将其提取出来 以及在回溯的时候 我们要将这一段
  • 第十一章 从Javaweb原⽣jdbc到MyBatis3.X

    1 javaweb通过原 jdbc访问数据库 原 jdbc访问数据库步骤 加载JDBC驱动程序 创建数据库的连接 创建preparedStatement 执 SQL语句 处理结果集 关闭JDBC对象资源 Springboot项 测试原 JD
  • 安捷伦34970a驱动及软件安装_最小最干净无需安装的驱动软件

    对于新安装系统电脑的驱动更新 驱动精灵基于驱动之家十余年的专业数据积累 支持度高达98 3 已经为数亿用户解决了各种电脑驱动问题 是目前有效的驱动软件 驱动精灵 支持市面99 的网卡设备 完美解决了系统新装问题 但对老电脑来说 也有自身的一
  • 计算二维离散随机变量的联合概率分布

    一 定义 Joint probability distribution 给定至少两个随机变量X Y 它们的联合概率分布 Joint probability distribution 指的是每一个随机变量的值落入特定范围或者离散点集合内的概率
  • Win11设置共享文件的方法

    1 按下键盘的win r键打开运行窗口 输入compmgmt msc指令 如图所示 2 随后在计算机管理的用户文件夹中 打开Guest账户 如图所示 3 如下图所示完成选项勾选以后 点击确定按钮 如图所示 4 接着右键需要分享的文件 打开属
  • Xeon可扩展Xeon睿频

    进行多线程AVX512运算的时候 需要把频率降下来 使用更低的电压 才能把功耗控制在一个TDP范围内 这就是全核AVX512默频 如果散热给力 可以提高电压增加点功耗 频率提高点 AVX512全核睿频 进行多线程AVX2运算的时候 单个核心
  • react性能优化是哪个周期函数

    shouldComponentUpdate 这个方法用来判断是否需要调用render方法重新描绘dom 因为dom的描绘非常消耗性能 如果我们能在shouldComponentUpdate方法中能够写出更优化的dom diff算法 可以极大
  • 0基础如何学习软件测试?1小时给你安排明白

    先上一张学习路线 在测试行业已经呆了5年多了 也算得上行业经验资深了吧 基本上也是摸清了这个行业的发展 所以今天也想对有转行想法的朋友分享一下经验 能够让你对这个行业有个大致的了解和对以后的发展有所规划 不会像是个无头苍蝇一样毫无头绪 东打
  • 测试环境搭建

    测试环境的搭建 为什么搭建测试环境 如果开发人员调试代码和测试人员测试软件在同一环境内 则他们的工作会互相影响 因此 需要将待测软件系统单独部署在一个独立于开发环境的测试环境中 了解软件系统结构 B S 浏览器 服务器 概念 使用浏览器访问
  • mysql 数据备份与存储引擎

    数据备份 mysql home bin下提供了mysqldump exe mysqldump sh 的可执行文件 用于备份数据库 语法 无需进入MySQL命令行 在本机命令行即可 mysqldump h IP P port u账号 p da
  • 创建SSAS项目

    2 3 创建Analysis Services 设计好了结构良好的数据仓库 并且将需要分析的业务数据装载到了数据仓库中之后 就为满足商务决策的全方位需求打下了根基 以后的操作都是基于这些拥有数据的数据仓库进行的 但是 对数据的多维分析却并不
  • 中间件运维分析中的选型与实践

    在近期的 Kylin Data Summit 上 好买财富平台架构总监王晔倞在互联网专场上分享了好买财富在中间件运维分析平台的演进过程 好买财富为什么选择从广泛应用的 ELK 转向 Apache Kylin 呢 王晔倞 我们在监控上 通常会
  • 使用python做FamaMacBeth回归

    金融资产定价常常需要用到FamaMacBeth回归 我们用python写一个模板 可以直接将数据调成需要的格式 代入代码即可出结果 所要求的数据格式 可以从链接下载 https download csdn net download weix