Fama三因子模型应用及python代码

Fama-French 三因子模型介绍、修改与框架搭建 ff三因子模型的复现 阅读详情
AI摘要

本文介绍Fama - French三因子模型,该模型从众多影响股票收益率因素中提取市场风险溢酬、市值、账面市值比三个因子构建线性模型。阐述了理论假设、因子构建方法,还提及数据来源与清洗,虽FF3在美股或失效,但建模选因子方式有借鉴意义,最后尝试按模型计算股票收益率。

Fama-French三因子模型原理

自从资本资产定价模型(CAPM)问世以后,许多学者对其进行了实证研究,如Black和Scholes(1972)及Fama(1973)的检验证明,对1969年以前的数据而言,资本资产定价模型是有效的,而对之后的股市数据,却缺乏说服力。在横截面数据里,股票的平均收益和市场β相关性很低,因而更多影响股票收益的因素亟待发掘。

Fama和French(1993)开始对美国股市中股票收益率的决定因素进行了全面性的研究分析,他们发现单独使用Beta值或者分别与市值、P/E比、杠杆比例、B/M比结合在一起来研究股票收益率时,Beta的解释能力很弱。而市值、P/E比、杠杆比例、B/M比各因子单独用来解释收益率时,每个因子的解释能力都很强,当把这些因子组合起来时,市值、B/M比会弱化P/E比、杠杆比例的解释能力。

因此Fama和French从可以解释股票收益率的众多因素中提取出了三个重要的影响因子,即市场风险溢酬因子、市值因子和账面市值比因子B/M Ratio,仿照CAPM模型用这三个因子建立起来一个线性模型来解释股票的收益率,提出了著名的三因子模型(Fama and French Three Factor Model,简称FF3)。

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

Rit-rf=αi+β1iRmt-rf+β2iSMBt+β3iHMLt+εit

其中Rit代表资产收益率,rf代表无风险收益率;Rit-rf为超额市场收益率;SMBt代表市值规模因子,HMLt代表账面市值比因子,β1i、β2i、β3i分别为Rit-rf、SMBt、HMLt的系数,εit为残差项,αi为截距项。

理论假设

Fama-French三因子模型,是以“有限理性”理论假设有基础,并在此基础上提出若干基本假定:

(1)存在着大量投资者;

(2)所有投资者都在同一证券持有期计划自己的投资资产组合;

(3)投资者投资范围仅限于公开金融市场上交易的资产;

(4)不存在证券交易费用(佣金和服务费用等)及税赋;

(5)投资者们对于证券回报率的均值、方差及协方差具有相同的期望值;

(6)所有投资者对证券的评价和经济局势的看法都一致。

三因子的构建方法

FF三因子模型提出,根据上市公司的市值,按照其大小值进行排序并分为两组,记为S、B,S、B分别表示为小市场规模股和大市场规模股。然后再根据年末上市公司账面市值比,按照33%、33%、33%的比例排序,记为L、M、H,L、M、H分别为低价值、中等价值、高价值;最后即可得到股票交叉组合,并通过加权平均(以总市值为权重)计算它们的月收益率{SL,SM,SH,BL,BM,BH}。通过以上6个组合的月收益率数据即可构造出市值规模因子(SMB),具体计算公式如下:

SMBt=(SLt+SMt+SHt)3-(BLt+BMt+BHt)3

通过该方法得到的市值规模因子体现出市值规模小的投资组合与市值规模大的投资组合之间的收益率差异,剔除账面市值比因素所造成的影响。

HMLt=BHt+SHt2-(BLt+SLt)2

同理,得到账面市值比因子也保证了解释变量只考虑账面市值比所产生的影响,反映账面市值比高的投资组合与账面市值比低的投资组合之间的收益率差异。

尽管许多西方研究证明FF3模型在美股已经失效,后续Fama本人也提出有效度更高的FF5模型,但是对于FF3的建模和选因子方式仍然具有借鉴意义。本文将尽可能呈现对FF3的理解的建模。

数据来源和数据清洗

本文数据来源为CSMAR数据库、网络完整的整理数据、中国资产管理研究中心的FF5的因子数据,包括每日收盘价、账面市值比、流通市值、无风险利率。时间区间为2017年1月1日至2020年12月31日四年时间的数据,频率为日,数据对象为中国A股所有股票,总计3391010行截面数据。

本文使用到的python包包括Pandas、Numpy、statsmodel、matplotlib、tqdm等包。

考虑到数据的有限来源以及无法获取tushare的pro接口,本文对于数据的清洗比较简陋,对于缺失值只是做一些简单填充和删除缺失值,并未考虑合适的插补数据方法。同时,考虑到股票的退市,理应对退市股票进行标记,并得到其退市区间,但由于数据过于简陋,且从CSMAR数据库导入该部分数据并不熟悉,最后选择放弃标记ST区间,仅仅对数据简单清洗,侧重于对FF3的建模和计算筛选股票alpha并可视化结果。

按照FF3的方法,本文需要对所有个股数据进行标记,分别按照每年五月末的市值分为两组,前50%是Big组,后50%是Small组;同时按照BM账面市值比分为三组,前30%是High组,后30%是Low组,其余的都是Medium组;一旦分组形成,以年为周期不发生改变,直到下一年末再重新分组。但是,我国上市公司企业年报的披露一般都在4月末,因此在构建因子时本文选用5月初的数据来分组。得到分组后的标记数据后,与所有股票数据进行合并。

随后,根据合并数据计算每个股票的收益率。同时,将每个月按照SIZE与BM分组,计算组内各支股票收益率市值加权综合收益率。

尽管由于经济形势的变化,普遍都认为FF3的因子建模得到的效果并不好,但是如果默认三因子模型的有效性,且市场风险、市值风险、账面市值比,这三类风险能很好地解释个股的超额收益,alphai的长期均值应该是0。那么,如果对于某个时期的股票,回归得到alphai<0,说明这段时间里面收益率偏低(因此股价也偏低),而根据有效市场假设,偏离值总会回归到均值。也就是说,如果在某个时刻根据FF3计算建模出的alpha值进行选股,选出alpha最小的N支股票,持仓一段时间后,下一个调仓日重复选股计算alpha最小的N支股票并持有,就可能有超额收益。

然而,由于我没有聚宽和其他量化的接口,也并未掌握有效的回测框架,导致学习曲线异常陡峭,于是放弃这种63日持仓择股的方法,打算后续攒积分后逐步开发这些策略。因此,我并没有按照选股是按如此进行的,为了方便循环建模,只是单纯计算如果按照alpha最大的股票进行计算收益率,持仓期设置为1年(也就是FF3计算因子分组的一年),每年一循环,找到前二十个alpha最大的股票,最终组合的收益率的结果会是多少。本着一种死马当活马医的想法,对所有时间节点的股票进行建模。

主要代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import tushare as ts
from pylab import mpl
import statsmodels.api as sm
import statsmodels.stats.api as sms
from tqdm import tqdm
import pickle
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

#Fama三因子策略
# bm.csv 账面市值比
# cap.csv 流通市值
# close.csv 收盘价

#读取csv格式数据
bm = pd.read_csv("bm.csv")
cap = pd.read_csv("cap.csv")
close = pd.read_csv("close.csv")
#将data一列改为时间索引
bm = bm.set_index("Date")
cap = cap.set_index('Date')
close = close.set_index('Date')
#将所有数据均按照date格式输出
datelist=pd.to_datetime(cap.index.astype("int").astype("str"))
close = close.set_index(datelist)
bm = bm.set_index(datelist)
cap = cap.set_index(datelist)

#使用stack函数将数据变为标准面板数据并将三个dataframe并到一起
close_1 = close.stack().reset_index(name='close') #重新设置ind索引
bm_1 = bm.stack().reset_index(name='B/M')
cap_1 = cap.stack().reset_index(name='mkt')
close_1.columns = ['Date','stock_name','close']
bm_1.columns = ['Date','stock_name','B/M']
close_1 = close_1.join(bm_1, lsuffix='_close',rsuffix='_bm') #使用join函数合并列
close_1 = close_1.join(cap_1,lsuffix='_close',rsuffix='_cap')
my_data = close_1.drop(columns=['Date_bm','stock_name_bm','level_1','Date'])#删掉多余的列
my_data.columns = ['Date','code','close','B/M','mkt'] #得到初始数据

#去ST对数据要求很高,故直接填充
my_data = my_data.fillna(method='ffill', axis=0, inplace=False)
my_data = my_data.set_index('Date')
my_data

#定义两个画图的函数方便处理
def bar_plot_describe(df):
    df.plot(kind='bar', legend=True, figsize=(12, 8))
    plt.title('Results')
    plt.ylabel('Value')
    plt.show()

def box_plot_describe(df):
    df.boxplot(vert=False, grid=True, figsize=(12, 8))
    plt.title('Results')
    plt.show()

#创建一个新列包含日期的年份和月份
my_data['YearMonth'] = my_data.index.to_period('M')

#通过找到每个月第一个交易日的索引来确认
first_day_index = my_data[my_data['YearMonth'].dt.month == 5].groupby('YearMonth').apply(lambda x: x.index.min())
may_start_data = my_data.loc[first_day_index]

#得到包含五月初的所有数据
may_start_data =may_start_data.reset_index()

#分组
def mark_FF_group(df):
    df = df[df['close'] != 0]
    df['Date'] = pd.to_datetime(df['Date'])
    
    # 根据年份进行分组
    df['Year'] = df['Date'].dt.year

    # 根据市值排序,分为Big和Small组
    df['Mkt_Rank'] = df.groupby('Year')['mkt'].rank(pct=True)
    df['Size_Group'] = 'S'
    df.loc[df['Mkt_Rank'] >= 0.5, 'Size_Group'] = 'B'

    # 根据BM账面市值比排序,分为High、Medium、Low组
    df['BM_Rank'] = df.groupby('Year')['B/M'].rank(pct=True)
    df['BM_Group'] = 'M'
    df.loc[df['BM_Rank'] <= 0.3, 'BM_Group'] = 'L'
    df.loc[df['BM_Rank'] > 0.7, 'BM_Group'] = 'H'
    
    #同时标记
    df['portflio_mark'] =df['Size_Group'] +'/'+df['BM_Group']
    return df

marked_df = mark_FF_group(may_start_data)
marked_df['portflio_date'] = pd.to_datetime(marked_df['Date'],format="%Y-%m-%d").dt.strftime("%Y%m%d").astype(int).apply(lambda x: x//100)

#将标记好的数据与股票数据合并
my_data = my_data.reset_index()
data_rt0 = pd.DataFrame(my_data,columns=['Date','code','close','B/M','mkt'])
data_rt0['Date'] = pd.to_datetime(data_rt0['Date'],format="%Y-%m-%d").dt.strftime("%Y%m%d").astype(int)
data_rt0['portflio_date'] = data_rt0['Date'].apply(lambda x:x//10000*100+5 if (x//100%10>=5) or (x//1000%10==1) else (x//10000-1)*100+5)
data_rt1 = pd.merge(data_rt0,marked_df.drop(['Date','B/M','mkt','close'],axis=1),how='inner',left_on=['code','portflio_date'],right_on=['code','portflio_date'])
data_rt1

#计算得到每个股票的收益率序列
data_rt = data_rt1.sort_values(by='Date',ascending=True)
data_rt['ret'] = data_rt.groupby('code')['close'].apply(lambda x:x.pct_change()).dropna(axis =0)
data_rt.dropna(axis =0)

#将每个月按照SIZE与BM分组,计算组内各支股票收益率市值加权综合收益率ret
port_ret = data_rt.groupby(['Date','portflio_mark']).apply(lambda x: (x['ret']*x['mkt']).sum()/x['mkt'].sum())
port_ret = port_ret.reset_index()
port_ret.rename(columns={port_ret.columns[-1]:'ret'},inplace=True)  #重新设置列名
port_ret = port_ret.pivot(index='Date',columns='portflio_mark',values='ret')  #将表格改为透视表
port_ret

#计算三因子的SMB和HML
port_ret['SMB']=(port_ret['S/L']+port_ret['S/M']+port_ret['S/H'])/3-(port_ret['B/L']+port_ret['B/M']+port_ret['B/H'])/3
port_ret['HML']=(port_ret['S/H']+port_ret['B/H'])/2-(port_ret['S/L']+port_ret['B/L'])/2
ff3=port_ret.loc[:,['SMB','HML']].copy()
ff3=ff3.reset_index()
ff3.columns=['DATE','SMB','HML']
ff3['DATE'] = pd.to_datetime(ff3['DATE'].astype(str),format='%Y%m%d')
ff3     

#为了方便计算,fama三因子的市场风险溢价因子由其他导入
fama_5 = pd.read_csv("D:/桌面/python数据分析/Fama五因子数据/中国资产管理研究中心数据/fivefactor_daily.csv",index_col='trddy',parse_dates=True)
fama_5 = fama_5.loc['2017-05-02':'2020-12-31']
fama_5['portflio_date'] = pd.to_datetime(fama_5.index,format='%Y-%m-%d').strftime("%Y%m%d").astype(int)
fama_5 = fama_5.reset_index()
fama_5 = fama_5.rename(columns={'trddy': 'DATE'})
ff3 = pd.merge(ff3, fama_5[['DATE', 'mkt_rf','rf']], on='DATE', how='left')

# 绘制三因子的收益率折线图
df_resampled = ff3[['SMB', 'HML', 'mkt_rf', 'rf']].cumsum()
plt.figure(figsize=(12, 10))
plt.plot(df_resampled.index, df_resampled['SMB'], label='SMB', marker='o', linestyle='-',markevery=5)
plt.plot(df_resampled.index, df_resampled['HML'], label='HML', color ='lightblue',marker='o', linestyle='-',markevery=5)
plt.plot(df_resampled.index, df_resampled['mkt_rf'], label='MKT', color= 'red',marker='o', linestyle='-',markevery=5)
plt.plot(df_resampled.index, df_resampled['rf'], label='Rf', color='green',marker='o', linestyle='-',markevery=5)
plt.xlabel('DATE')
plt.ylabel('Values')
plt.title('Time Series Plot')
plt.legend()
plt.tight_layout()
plt.show()

new_df = data_rt[['Date','code','ret',]]
new_df = new_df.rename(columns = {'Date':'DATE'})
new_df['DATE'] = pd.to_datetime(new_df['DATE'].astype(int).astype(str),format='%Y%m%d')

# 得到合并后的所有数据
merged_df = pd.merge(new_df,ff3,on='DATE')
merged_df = merged_df.dropna(axis =0)
merged_df.isnull().sum() #判断是否有空值

# 创建几个空字典来保存回归结果
results_dict = {}
alpha_list = []
portfolio_returns = []
top_stocks = []
model_all = {}
unique_codes = merged_df['code'].unique()
merged_df.loc[:,'year'] = pd.DatetimeIndex(merged_df['DATE']).year
merged_df

#定义一个保存回归模型到本地的函数
def save_data(data,filename):
    with open(f'{filename}.pkl', 'wb') as file:
        pickle.dump(data, file)

#定义一个加载到本地的这些文件的函数
def load_data(filename):
    with open(f'{filename}.pkl', 'rb') as file:
        data = pickle.load(file)
    return data

#每年一循环,找到前二十个alpha最大的股票
for year in tqdm(merged_df['year'].unique(), desc='Processing years'):
    alpha_list = []
    for code in tqdm(unique_codes,desc ='Processing stocks'):
        try: #try很有用!如果成功就执行,不成功就except兜底!
            data = merged_df[(merged_df['code'] == code) & (merged_df['year'] == year)]
            data = data.dropna(axis =0)

            X = data[['SMB', 'HML', 'mkt_rf']]
            X = sm.add_constant(X)  # 添加截距项
            y = data['ret']
            #担心数据量,因此提前筛选一些股票
            if len(y) < 4 or len(X) < 4:
                continue

            # 回归!
            model = sm.OLS(y, X, missing='drop')
            results = model.fit()
            alpha = results.params['const']
            alpha_list.append({'code': code, 'alpha': alpha})
            
            # 将回归结果保存到字典中
            results_dict[(code,year)] = results.params
            model_all[(code,year)] = results
        except Exception as e:
            print(f"Error occurred while processing stock {code} in year {year}: {e}")
            save_data(results_dict, 'results_dict_backup')
            continue
    #得到一些数据
    top_stock20 = sorted(alpha_list, key=lambda x: x['alpha'], reverse=True)[:20]
    top_stocks.append({'year':year,'top_stock20':top_stock20})
    portfolio_return = np.mean([stock['alpha'] for stock in top_stock20])
    portfolio_returns.append({'year': year, 'return': portfolio_return})

save_data(results_dict, 'results_dict')
save_data(portfolio_returns, 'portfolio_returns')
save_data(top_stocks, 'top_stocks')
save_data(model_all,'model_all')

#提取这些数据,并接下来分开查看方便可视化
results_dict = load_data('results_dict')
portfolio_returns = load_data('portfolio_returns')
top_stocks = load_data('top_stocks')
model_all = load_data('model_all')

rsquared_list = [{'code': code, 'year': year, 'rsquared': result.rsquared} for (code, year), result in model_all.items()]
top_5_stocks = sorted(rsquared_list, key=lambda x: x['rsquared'], reverse=True)[:10]
for stock in top_10_stocks:
    print(f"Stock: {stock['code']}, Year: {stock['year']}, R-squared: {stock['rsquared']}")

同花顺Supermind量化交易 风险控制建模-Fama-French三因子模型应用 顾名思义,Fama-French三因子模型中包含三个因子:市值因子(SMB)、账面市值比因子(HML)、市场风险因子(RM)。三因子模型的本质就是把CAPM中的未被解释的超额收益分解掉,将其分解成SMB、BM、RM和其他未能解释的因素(a),公式表达即为其中:Ri=E(ri−rf),指股票i比起无风险投资的期望超额收益率。RM=E(rM−rf),为市场相对无风险投资的期望超额收益率。E(SMB)是小市值公司相对大市值公司股票的期望超额收益率。 阅读详情

相关推荐

AI辅助的投资组合归因分析

在当今复杂多变的金融市场中,投资组合归因分析对于投资者和金融机构至关重要。它能够帮助投资者理解投资组合的表现来源,识别哪些因素对投资回报产生了影响,以及这些影响的程度如何。本文章的目的在于详细介绍AI辅助的投资组合归因分析技术,涵盖从核心概念到实际应用的各个方面。范围包括常见的归因分析方法、AI算法在其中的应用、实际案例展示以及相关工具和资源的推荐。本文将按照以下结构进行阐述:首先介绍核心概念与联系,明确投资组合归因分析的基本原理和架构;接着详细讲解核心算法原理和具体操作步骤,通过Python代码进行演示。

专注搜索引擎技术 295

Fama-French三因子模型数据和Stata代码(2000-2020年)

Fama-French三因子模型数据和Stata代码(2000-2020年)

量化投资基础(三)之Fama-French 三因子模型(1)

Fama 和 French 从可以解释股票收益率的众多因素中提取出3个重要的影响因子(特征工程),即 **市场风险溢酬因子**、**市值因子** 和 **账面市值比因子**,仿照 CAPM模型 用这3个因子建立起线性模型来解释股票的收益率,这就是著名的 **Fama-French三因子模型** (Fama-French Three Factor Model ) 。

PyQuant 5085

利用python构建Fama-French三因子模型.py

以python构建Fama and French三因子(MKT、SMB、HML),代码从网络整理,可以运行,数据可通过tushare pro下载。

python多因子量化选股模型_Python量化入门:Fama-French三因子模型

技术讨论,不构成任何投资建议!一、CAPM的不足与三因子模型的诞生CAPM模型经历了大量的实证和应用之后,有证据表明,市场风险溢酬并不能充分解释个别风险资产的收益率。于是很多研究者开始探索其他的因素,比如公司市值、PE、杠杆比例、账面市值比等。Fama和French两个人对于各种因素进行了全面的组合分析,当单独使用Beta或者用Beta分别与其他几个因子相结合时,Beta的解释能力很弱;市值、PE...

weixin_39616348的博客 3913

Fama-French三因子模型详解:量化价值投资的基石

资本资产定价模型(CAPM)自1960年代提出后,成为资产定价理论的核心框架,但其假设的市场有效性和单一风险因子(β)在现实市场中面临诸多挑战。1992年,Eugene Fama和Kenneth French通过对美股市场的实证研究,发现规模效应(小市值股票长期超额收益)和价值效应(高账面市值比股票超额收益),并于1993年提出三因子模型,将资产收益分解为市场风险、规模风险和价值风险的共同作用。

AI天才研究院 1709

Python量化交易06——Fama-French三因子模型(Rmt,SMB,HML)

Python构建三因子模型,市场风险溢酬因子(Rmt),市值因子(SMB),账面市值比因子(HML),计算阿尔法,贝塔系数,最大回测率,夏普比率等

weixin_46277779的博客 2万+

从理论到实践:Fama-French模型在A股市场的应用案例

构建适用于A股市场的Fama-French三因子模型分析框架解决因子计算中的数据预处理关键问题(财务数据滞后、异常值处理等)通过实证案例验证模型对A股收益率的解释能力为量化投资策略提供因子配置参考理论基础:解析Fama-French模型核心假设与因子经济含义数据工程:A股市场特有数据处理技术(财务滞后、停牌调整)因子构建:SMB/HML因子动态计算的Python实现实证分析:横截面回归与模型有效性检验实战应用:基于因子模型的投资组合优化案例三因子模型。

2501_92132293的博客 1514

手把手教你实现法玛三因子模型

其中,E(Ri)表示股票i的预期回报,Rf表示无风险收益率,βi表示股票i的市场风险系数,Market Risk Premium表示市场风险因子的回报率减去无风险收益率,si表示股票i的市值因子系数,SMB表示市值因子的超额回报,hi表示股票i的价值因子系数,HML表示价值因子的超额回报。以上代码中,我们首先计算了每个因子的收益率,然后使用OLS回归分析计算了每个因子的残差,即每个因子收益率中的alpha值。接着,我们使用OLS回归分析计算了每个因子的残差,即每个因子收益率中的alpha值。

不定时分享最优质的网络技术与教程,满满的干货。 2162

如何将特价股票策略应用于另类beta策略

本文章的主要目的是深入探讨如何将特价股票策略有效地应用于另类beta策略。随着金融市场的不断发展和创新,投资者对于多样化投资策略的需求日益增加。特价股票策略通常基于对股票价值的低估判断来选取投资标的,而另类beta策略则试图捕捉传统市场beta之外的风险溢价。将两者结合起来,有望为投资者提供更丰富的收益来源和更有效的风险管理手段。本文将涵盖从核心概念的解释、算法原理的阐述、实际应用案例的分析到相关工具和资源的推荐等多个方面,为读者全面了解和应用这一策略提供详细的指导。

操作系统内核探秘的博客 601

开发智能化的资产配置策略归因分析引擎

在金融市场中,资产配置策略的有效性和合理性对于投资者至关重要。资产配置策略归因分析旨在明确投资组合的收益来源和风险因素,帮助投资者更好地理解和评估投资策略。本项目的目的是开发一个智能化的资产配置策略归因分析引擎,能够对各种资产配置策略进行高效、准确的归因分析。本引擎的范围涵盖了常见的金融资产,如股票、债券、基金等,支持多种资产配置策略,包括战略资产配置、战术资产配置等。同时,引擎将考虑多种归因分析方法,如 Brinson 模型、Fama - French 三因子模型等。

2501_92132293的博客 380

python做事件研究法_Event Study(附Python代码)(一)

过年回国就赶上了肺炎...也突然有时间来写写专栏了!第一个话题就写写事件研究法,event study吧,原因之一当然就是这个肺炎事件,可能我还太年轻,才发现瘟疫事件对金融市场的影响,富时A50指数,日经225已经连续跌两天了,美国股市也是从年前就已经闻到了瘟疫带来的恐慌早早开始避险。所以是时候来讨论一下event study了。不知道会不会有未来会有很多关于写这次瘟疫的event study的文...

weixin_39622980的博客 1909

金融市场风险因子分解与分析

金融市场充满了各种不确定性和风险,准确地识别、分解和分析这些风险因子对于投资者、金融机构和监管部门都具有至关重要的意义。本研究的目的在于深入探讨金融市场风险因子的分解方法和分析技术,帮助投资者更好地理解投资组合所面临的风险,优化投资决策;为金融机构提供有效的风险管理工具,降低潜在的损失;为监管部门制定合理的政策提供理论依据和数据支持。本研究的范围涵盖了股票市场、债券市场、外汇市场等主要金融市场,涉及到系统性风险因子和非系统性风险因子的分解与分析。

AI Agent Harness Engineering 770

Python实现Fama-French三因子模型:A股实证与风险归因

在资产定价与量化投资研究中,如何从收益中剥离市场、风格与真正alpha的影响,是策略诊断的关键。CAPM仅以市场因子解释收益,在A股等新兴市场往往留下显著异常alpha。Fama-French三因子模型引入规模(SMB)与价值(HML)因子,提供了更细致的风险归因框架。本文从因子经济学含义出发,详解SMB与HML的构造原理、财务数据对齐与防前视偏差等工程细节,并给出基于Python的完整实现,涵盖数据清洗、2x3分组、因子收益率计算与回归分析。该模型可广泛应用于量化选股的风格诊断、组合风险控制与业绩归因。通

weixin_32238157的博客 297

Fama-French三因子模型:理论与实践代码教程

市场因子(Mkt)是Fama-French三因子模型中的核心组成部分,它代表的是市场投资组合的平均收益与无风险收益率之间的差异。理解市场因子对于深入把握Fama-French模型至关重要。小市值因子(SMB,Small Minus Big)是Fama-French三因子模型中的一个核心因子,其核心思想是小市值公司的股票往往会有更高的回报率。SMB因子反映了公司市值大小与股票回报率之间的关系,它支持了学术界所提出的"市值效应",即小市值股票的回报率往往高于大市值股票。

weixin_31163455的博客 2157

MATLAB FF三因子代码

该文件是基于fama-French三因子模型而编写的MATLAB程序代码。里面有详细说明和PDF文档

数据分析---Fama-French三因子模型

短短二十行,只需两个库,就能构建Fama-French三因子模型,快来看看吧!

FightingBob的博客 3万+

Fama三因子选股的python实现

Fama三因子选股的python实现,是做量化投资的基本策略,

loge_python
博客等级 码龄6年 20粉丝 1原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值