Python量化入门:Fama-French三因子模型

一、CAPM的不足与三因子模型的诞生

CAPM模型经历了大量的实证和应用之后,有证据表明,市场风险溢酬并不能充分解释个别风险资产的收益率。于是很多研究者开始探索其他的因素,比如公司市值、PE、杠杆比例、账面市值比等。

Fama和French两个人对于各种因素进行了全面的组合分析,当单独使用Beta或者用Beta分别与其他几个因子相结合时,Beta的解释能力很弱;市值、PE(市盈率)、杠杆比例、BM(账面市值比,PB的倒数)单独来用时,对于收益率的解释能力都很强,但是组合起来时,市值、BM会弱化杠杆比例和PE的解释能力。

后来Fama和French两人提取了3个重要因子:市场风险溢酬因子、市值因子和账面市值比因子,以收益率作为因变量构建了一个类似CAPM的线性模型,即著名的三因子模型。

二、三因子模型的原理

三因子模型中的3个因子均为投资组合的收益率:市场风险溢酬因子对应了市场投资组合的收益率,市值因子对应了做多市值较小的公司与做空市值较大的公司的投资组合带来的收益率,账面市值比因子对应的是做多高BM公司、做空低BM公司的投资组合带来的收益率。三因子模型的形式为:

E ( R i

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Fama-French因子模型是一种用于解释股票收益的模型,详细解释了资产的超额收益与市场风险、规模和价值因素之间的关系。下面是一个使用Python编写的Fama-French因子模型分组代码示例: 首先,我们需要引入所需的库: ```python import pandas as pd import statsmodels.api as sm ``` 接下来,我们需要获取所需的股票数据和因子数据。假设我们的股票数据存储在一个名为"stock_data.csv"的CSV文件中,而因子数据存储在一个名为"factor_data.csv"的文件中: ```python # 读取股票数据和因子数据 stock_data = pd.read_csv('stock_data.csv') factor_data = pd.read_csv('factor_data.csv') ``` 然后,我们需要将数据合并在一起。假设我们的股票数据中有"Date"列和"Returns"列,因子数据中有"Date"列、"Market Risk Premium"列、"SMB"列和"HML"列: ```python # 合并股票数据和因子数据 data = pd.merge(stock_data, factor_data, on='Date') ``` 接下来,我们需要根据市值和账面市值比(BM)将股票分组。假设我们将市值大的股票分为"Large"组,市值小的股票分为"Small"组;将BM高的股票分为"High BM"组,BM低的股票分为"Low BM"组: ```python # 根据市值和BM分组 data['Market Cap Group'] = pd.qcut(data['Market Cap'], 2, labels=['Small', 'Large']) data['BM Group'] = pd.qcut(data['BM'], 2, labels=['Low BM', 'High BM']) ``` 接下来,我们需要为每个分组拟合Fama-French因子模型并获取结果。假设我们的因变量是"Returns"列,自变量是"Market Risk Premium"列、"SMB"列和"HML"列: ```python # 为每个分组拟合Fama-French因子模型并获取结果 results = {} for market_cap in ['Small', 'Large']: for bm in ['Low BM', 'High BM']: subgroup = data[(data['Market Cap Group'] == market_cap) & (data['BM Group'] == bm)] x = sm.add_constant(subgroup[['Market Risk Premium', 'SMB', 'HML']]) y = subgroup['Returns'] model = sm.OLS(y, x) result = model.fit() results[(market_cap, bm)] = result ``` 最后,我们可以输出每个分组的回归结果: ```python # 输出每个分组的回归结果 for market_cap in ['Small', 'Large']: for bm in ['Low BM', 'High BM']: result = results[(market_cap, bm)] print(f"Market Cap Group: {market_cap}, BM Group: {bm}") print(result.summary()) print('-'*50) ``` 以上就是一个使用Python编写的Fama-French因子模型分组代码示例,通过分组实施回归,可帮助我们了解市值和账面市值比对股票收益的影响程度。 ### 回答2: Fama-French因子模型是一种资产定价模型,通过考虑市场风险因素、市值因素和账面市值比因素来解释股票回报。Python代码可以用于实现Fama-French因子模型的分组。 首先,我们需要导入所需的库。在Python中,我们可以使用pandas库来处理数据,使用numpy库进行数值计算。 ```python import pandas as pd import numpy as np ``` 接下来,我们需要下载并读取包含市场因子、市值因子和账面市值比因子数据的CSV文件。在这个例子中,我们假设文件名为"factor_data.csv"。 ```python # 从CSV文件中读取数据 data = pd.read_csv("factor_data.csv") ``` 然后,我们可以将数据按照市场因子、市值因子和账面市值比因子进行分组。在这个例子中,我们将市场因子分为"high"和"low"两组,市值因子分为"large"和"small"两组,账面市值比因子分为"high"和"low"两组。我们可以使用pandas中的`cut`函数进行分组。 ```python # 市场因子分组 data['market_group'] = pd.cut(data['market_factor'], bins=[-np.inf, 0, np.inf], labels=['low', 'high']) # 市值因子分组 data['size_group'] = pd.cut(data['size_factor'], bins=[-np.inf, np.percentile(data['size_factor'], 50), np.inf], labels=['small', 'large']) # 账面市值比因子分组 data['bm_group'] = pd.cut(data['bm_factor'], bins=[-np.inf, np.percentile(data['bm_factor'], 50), np.inf], labels=['low', 'high']) ``` 最后,我们可以计算不同分组的平均收益率。我们可以使用pandas的`groupby`函数按照分组进行分组,然后使用`agg`函数计算平均值。 ```python # 按照分组计算平均收益率 average_returns = data.groupby(['market_group', 'size_group', 'bm_group'])['return'].agg('mean') print(average_returns) ``` 以上就是一个用Python实现Fama-French因子模型分组的示例代码。代码中使用了pandas库进行数据处理和分组,numpy库进行数值计算。 ### 回答3: Fama-French因子模型是一种用于解释股票收益率的经济模型。它将股票的超额收益率分解为市场因子、市值因子和账面市值比因子。以下是一个用Python编写的简单的Fama-French因子模型分组代码示例: ```python import pandas as pd import numpy as np import statsmodels.api as sm # 获取股票收益率数据 stock_returns = pd.read_csv('stock_returns.csv') # 获取市场收益率数据 market_returns = pd.read_csv('market_returns.csv') # 获取市值数据 market_cap = pd.read_csv('market_cap.csv') # 获取账面市值比数据 book_to_market = pd.read_csv('book_to_market.csv') # 合并数据 data = pd.merge(stock_returns, market_returns, on='date') data = pd.merge(data, market_cap, on='date') data = pd.merge(data, book_to_market, on='date') data.columns = ['date', 'stock_returns', 'market_returns', 'market_cap', 'book_to_market'] # 创建一个新的DataFrame来存储因子暴露和超额收益率 ff_factors = pd.DataFrame(index=data.index) # 计算市场因子 ff_factors['market_factor'] = data['market_returns'] # 计算市值因子 ff_factors['size_factor'] = np.log(data['market_cap']) # 计算账面市值比因子 ff_factors['value_factor'] = data['book_to_market'] # 将股票收益率与因子数据合并 ff_data = pd.concat([ff_factors, data['stock_returns']], axis=1) # 拟合线性回归模型 model = sm.OLS(ff_data['stock_returns'], sm.add_constant(ff_data[['market_factor', 'size_factor', 'value_factor']])) results = model.fit() # 输出回归结果 print(results.summary()) ``` 这段代码首先将股票收益率数据、市场收益率数据、市值数据和账面市值比数据合并在一起。然后,通过计算市场因子、市值因子和账面市值比因子,将它们组合成一个新的DataFrame。接下来,使用statsmodels库的OLS函数进行线性回归拟合,回归的自变量为市场因子、市值因子和账面市值比因子,因变量为股票收益率。最后,打印回归结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老Q量化投研

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值