用python将2010-2020年的月度A股数据构造fama五因子模型
时间: 2024-02-18 20:00:26 浏览: 173
构造Fama-French五因子模型需要获取股票市场数据、市场收益率数据和无风险收益率数据,并计算市值因子、账面市值比因子、动量因子、投资因子和质量因子。下面是一个简单的Python代码实现示例,以2010年至2020年的月度A股数据为例:
1. 数据获取:首先需要获取股票市场数据、市场收益率数据和无风险收益率数据,可以使用pandas库中的read_csv函数进行读取。
```python
import pandas as pd
# 读取股票市场数据
stock_data = pd.read_csv('stock_data.csv', index_col=0)
# 读取市场收益率数据
market_data = pd.read_csv('market_data.csv', index_col=0)
# 读取无风险收益率数据
rf_data = pd.read_csv('rf_data.csv', index_col=0)
# 将日期转换为月度频率,并设置为数据索引
stock_data['date'] = pd.to_datetime(stock_data['date'])
stock_data.set_index('date', inplace=True)
market_data['date'] = pd.to_datetime(market_data['date'])
market_data.set_index('date', inplace=True)
rf_data['date'] = pd.to_datetime(rf_data['date'])
rf_data.set_index('date', inplace=True)
```
2. 因子计算:接下来需要计算市值因子、账面市值比因子、动量因子、投资因子和质量因子,通常需要使用多个数据源和一些复杂的计算方法,这里只提供一个简单的示例,以计算市值因子为例。
```python
# 计算股票市值
stock_data['market_cap'] = stock_data['price'] * stock_data['shares_outstanding']
# 计算市场总市值
total_market_cap = stock_data.groupby(pd.Grouper(freq='M'))['market_cap'].sum()
# 计算每只股票的月度市值占比
stock_data['market_cap_weight'] = stock_data['market_cap'] / total_market_cap.loc[stock_data.index].values
# 计算市值因子
market_cap_data = stock_data.pivot_table(index=stock_data.index, columns='ticker', values='market_cap_weight')
market_cap_data = (market_cap_data.rank(axis=1) / market_cap_data.shape[1]).sub(0.5)
```
3. 数据合并:将因子数据和股票收益率数据、市场收益率数据、无风险收益率数据进行合并,以准备进行回归分析。
```python
# 提取股票收益率数据
stock_returns = stock_data['return'].unstack()
# 合并因子数据和股票收益率数据
excess_returns = stock_returns.sub(rf_data['rf'], axis=0)
excess_returns = excess_returns.loc[market_data.index]
# 合并因子数据和市场收益率数据
market_data = market_data[['return']]
market_data.rename(columns={'return': 'market_return'}, inplace=True)
# 合并因子数据和无风险收益率数据
rf_data = rf_data[['rf']]
# 将因子数据和其他数据进行合并
merged_data = pd.concat([excess_returns, market_data, rf_data, market_cap_data], axis=1)
merged_data = merged_data.dropna()
```
4. 回归估计:使用多元线性回归模型,以股票超额收益率为因变量,市场收益率、市值因子、账面市值比因子、动量因子、投资因子和质量因子的暴露度为自变量,估计模型系数。
```python
import statsmodels.api as sm
# 构建因子矩阵
factor_data = merged_data[['market_return', 'Mkt-RF', 'SMB', 'HML', 'Mom', 'CMA']]
factor_data = sm.add_constant(factor_data)
# 进行回归估计
results = sm.OLS(merged_data.iloc[:, :-6], factor_data).fit()
# 打印模型系数
print(results.params)
```
需要注意的是,本示例代码只是一个简单的演示,实际应用中还需要进行更多的数据处理、因子计算和模型检验等工作。另外,在实际应用中还需要考虑因子的选取、权重的调整等问题,以得到更加准确的模型。
阅读全文