工具介绍

在构建模型之前,首先介绍所需的工具。

import pandas as pd
import tushare as ts
pro = ts.pro_api()
import statsmodels.api as sm

这里需要用到的是python中的pandas和statsmodels模块,分别用于数据处理和做多元回归。
另外,还需要获取股票和指数的各项数据,这里所用到的是tushare,tushare拥有丰富的数据内容,如股票、基金等行情数据,公司财务理等基本面数据。通过tushare平台赚取一定的积分可以免费获取平台提供的数据。(个人ID:419382)

Fama-French理论介绍

Fama-French是从1993年提出来的模型,该模型建立了三个因子来解释股票的回报率。这三个因子分别是:市场组合(Rm-Rf),市值因子(SMB)以及账面市值比因子(HML)。
具体公式如下:
E(Rit) −Rft= βi[E(Rmt−Rft)] +siE(SMBt) +hiE(HMLt)
其中SMB的计算公式为:
(SL+SM+SH)/ 3 - (BL+BM+BH)/ 3
HML的计算公式为:
(SH+BH)/ 2 - (SL+BL)/ 2

利用python构建模型

获取进行选股的指数

这里使用上证50作为选择股票的指数。

#获取进行选股的股票池
#获取进行选股的股票池
def get_SZ50_stocks(start,end):#获取上证50成分股df1 = pro.index_weight(index_code="000016.SH",start_date=start,end_date=end)SZ50_codes = df1["con_code"].tolist()#剔除最近一年上市和st股票df2 = pro.stock_basic(exchange="",list_status="L")df2 = df2[df2["list_date"].apply(int).values<20200101]df2 = df2[-df2["name"].apply(lambda x:x.startswith("*ST"))]all_codes = df2["ts_code"].tolist()stocks_codes  = []for i in SZ50_codes:if i in all_codes:stocks_codes.append(i)return stocks_codes

将股票进行分组

从上证50中选择出来的股票需要按照市值和账面市值比(PB ratio 的倒数)进行分组,其中市值划分为2组,账面市值比划分为3组,所以一共由2*3=6组。在进行市值和账面市值比划分时,需要选定一个基准日期。在构建模型时,这里使用了2020-03-10作为基准日期。

#将股票分为六个组
def group_stocks(stocks,date):
#划分大小市值list_mv = []df_stocks = pd.DataFrame()count = 0for i in stocks:count += 1a = pro.daily_basic(ts_code=i,trade_date=date)a = a["circ_mv"].valueslist_mv.append(float(a))print("第%d支股票市值计算完成"%count)df_stocks["code"] = stocks_codesdf_stocks["mv"] = list_mvdf_stocks["SB"] = df_stocks["mv"].map(lambda x:"B" if x>df_stocks["mv"].median() else "S")#划分高中低账面市值比list_bm = []count = 0for i in stocks_codes:count += 1b = pro.daily_basic(ts_code=i,trade_date=date)b = 1/b["pb"].valueslist_bm.append(float(b))print("第%d支股票账面市值比计算完成"%count)df_stocks["bm"] = list_bmdf_stocks["HML"] = df_stocks["bm"].apply(lambda x:"H" if x>=df_stocks["bm"].quantile(0.7) else ("L" if x<=df_stocks["bm"].quantile(0.3) else "M"))return df_stocks

分组之后的结果如图:

计算SMB和HML

这里先算出六组股票的收益率,由基准日期往后一天计算一年内的日收益率。之后利用公式算出每日的SMB和HML。

#分别计算六个组的日收益率
def groups_return(stocks,start,end):SL = stocks[stocks["SB"].isin(["S"])&stocks["HML"].isin(["L"])].code.tolist()sum_SL = df_stocks[df_stocks["SB"].isin(["S"])&df_stocks["HML"].isin(["L"])]["mv"].sum()SM = stocks[stocks["SB"].isin(["S"])&stocks["HML"].isin(["M"])].code.tolist()sum_SM = df_stocks[df_stocks["SB"].isin(["S"])&df_stocks["HML"].isin(["M"])]["mv"].sum()SH = stocks[stocks["SB"].isin(["S"])&stocks["HML"].isin(["H"])].code.tolist()sum_SH = df_stocks[df_stocks["SB"].isin(["S"])&df_stocks["HML"].isin(["H"])]["mv"].sum()BL = stocks[stocks["SB"].isin(["B"])&stocks["HML"].isin(["L"])].code.tolist()sum_BL = df_stocks[df_stocks["SB"].isin(["B"])&df_stocks["HML"].isin(["L"])]["mv"].sum()BM = stocks[stocks["SB"].isin(["B"])&stocks["HML"].isin(["M"])].code.tolist()sum_BM = df_stocks[df_stocks["SB"].isin(["B"])&df_stocks["HML"].isin(["M"])]["mv"].sum()BH = stocks[stocks["SB"].isin(["B"])&stocks["HML"].isin(["H"])].code.tolist()sum_BH = df_stocks[df_stocks["SB"].isin(["B"])&df_stocks["HML"].isin(["H"])]["mv"].sum()groups = [SL,SM,SH,BL,BM,BH]sums = [sum_SL,sum_SM,sum_SH,sum_BL,sum_BM,sum_BH]groups_names = ["SL","SM","SH","BL","BM","BH"]df_groups = pd.DataFrame(columns=groups_names)count=0for group in groups:df1 = pd.DataFrame()for i in range(len(group)):data = pro.daily(ts_code=group[i],start_date=start,end_date=end)data.sort_values(by="trade_date",inplace=True)data = data["pct_chg"]*df_stocks["mv"][i]df1[group[i]] = datadf_groups[groups_names[count]] = df1.apply(lambda x:x.sum()/sums[count],axis=1)/100print("%s组计算完成"%groups_names[count])count += 1return df_groups#计算每日SMB,HML
def SMB_HML(data):data["SMB"] = (data["SL"]+data["SM"]+data["SH"])/3-(data["BL"]+data["BM"]+data["BH"])/3data["HML"] = (data["SH"]+data["BH"])/2-(data["SL"]+data["BL"])/2return data

两个因子的计算结果如图:

加入市场组合收益和股票收益

#加入市场因子和股票收益率
def selection(data,start,end,stocks_codes):MKT = pro.index_daily(ts_code="000016.SH",start_date=start,end_date=end)MKT.sort_values(by="trade_date",ascending=True,inplace=True)MKT = (MKT["pct_chg"]/100-0.035).tolist()data["MKT"] = MKTdata.drop(data.columns[0:6],axis=1,inplace=True)for i in range(len(stocks_codes)):a = pro.daily(ts_code=stocks_codes[i],start_date=20200311,end_date=20210311)if len(a) == 244:a.sort_values(by="trade_date",ascending=True,inplace=True)a = (a["pct_chg"]/100-0.035).tolist()data["%s"%stocks_codes[i]] = areturn data

将如图表格用于多元回归:

对每支股票收益率和三个因子进行多元回归

这里回归之后选择返回阿尔法值最大的前十支股票。

#回归找出阿尔法最大的股票组合
def OLS(df_final):results = pd.DataFrame()stocks_return = df_final.iloc[:,3:50]for i in range(len(stocks_return.columns)):x = df_final.iloc[:,0:3]y = stocks_return.iloc[:,i]X = sm.add_constant(x)model = sm.OLS(y,X)result = model.fit()results[i] = result.paramsresults.columns = stocks_return.columnsresults.rename(index={"const":"Alpha"},inplace=True)z =results.sort_values(by="Alpha",axis=1,ascending=False)stocks_lists = z.columns.values.tolist()top_stocks = stocks_lists[:10]return top_stocks

最终返回的股票组合如图:

python量化——利用python构建Fama-French三因子模型相关推荐

  1. Python:利用python语言绘制多个子图经典案例、代码实现之详细攻略

    Python:利用python语言绘制多个子图经典案例.代码实现之详细攻略 目录 利用python语言绘制多个子图代码实现.经典案例 1.绘制多个子图框架 多个子图绘制的经典案例 1.绘制多个直方图 ...

  2. Python:利用python编程实现三维图像绘制展示(六面体旋转、三维球柱状体、下雪场景等)

    Python:利用python编程实现三维图像绘制展示(六面体旋转.三维球柱状体.下雪场景等) 目录 利用python编程实现三维图像绘制展示(六面体旋转.三维球柱状体.下雪场景等) 1.实现六面体旋 ...

  3. Python:利用python编程将上海十六区,2020年5月份房价实时地图(数据来源房天下)进行柱状图、热图可视化

    Python:利用python编程将上海十六区,2020年5月份房价实时地图(数据来源房天下)进行柱状图.热图可视化 目录 上海十六区,2020年5月份房价实时地图(数据来源房天下)可视化 雷达图.柱 ...

  4. python怎么实现检验_[python skill]利用python实现假设性检验方法

    [python skill]利用python实现假设性检验方法 刀尔東 2018-08-03 09:19:13 1244 收藏 2 版权 hello,大噶好,最近新学习了利用python实现假设性检验 ...

  5. 【Python】利用python进行数据分析——以新型冠状病毒疫情为例

    [Python]利用python进行数据分析--以新型冠状病毒疫情为例 重要说明 只提交该文档这一个文件,做完后提交到学习通"结课大作业"中. 1. 文件命名: 必须以学号-姓名- ...

  6. 【Python】利用Python实现精准三点定位(经纬度坐标与平面坐标转换法求解)

    [Python]利用Python实现精准三点定位(经纬度坐标与平面坐标转换法求解) 众所周知,如果已知三个点的坐标,到一个未知点的距离,则可以利用以距离为半径画圆的方式来求得未知点坐标. 如果只有两个 ...

  7. 用python实现星期的转换_[Python实践] 利用python实现的日期映射礼拜X的简单实现...

    [Python实践] 利用python实现的日期映射礼拜X的简单实现 2018年12月19日 最近在处理分析数据的时候,突发奇想试着从用户离职的日期上判断是主动辞职还是被动解雇?数据的背景是美国某企业 ...

  8. python求因子代码_Python量化入门:饱受青睐的三因子模型「附代码及数据」

    代码及数据见文章最后. 主要内容: 一.CAPM的不足与三因子模型的诞生 二.三因子模型的原理 三.Python三因子模型选股实战 一.CAPM的不足与三因子模型的诞生 CAPM模型经历了大量的实证和 ...

  9. python推荐系统-利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

最新文章

  1. JSSE访问带有未验证证书的HTTPS
  2. 北京2019高考分数线:本科理423文480
  3. Javascript中字符串转数字
  4. 判断js变量是否定义,
  5. 数组字符串转化成数组与eval函数
  6. JavaEE 从入门到精通(含学习路线)
  7. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库02 ——使用ambari-server安装HDP...
  8. Unity2020.1中如何安装DOTS的Entities包?
  9. Linux系统安全之pam后门安装使用详解
  10. Linux Shell基础 Shell的输入重定向和输出重定向
  11. 想做游戏测试,你一定要知道这几点!
  12. html停止工作,update.exe已停止工作
  13. 黑眼圈大神程序员用5000字带你通透读懂Elasticsearch的注意事项
  14. android 测量距离 app,手机测距软件哪个好?6款手机测距APP推荐
  15. 高校计算机水平能力联合测试成绩,学校关于开展2017年度专业技术职务任职资格评审工作的通知...
  16. 【1.7k行代码优秀课设】基于stm32f4xx粤嵌GEC-M4的按键密码锁、呼吸灯、蜂鸣器音乐、超声波测距及倒车雷达、温湿度检测、光敏电阻自动灯光调节、USART串口控制系统
  17. 孙陶然:创新是最好的生存之道
  18. 希腊字母与英文读音中文读音对照表
  19. thinkpad x250装黑苹果教程_[黑苹果]x250 黑苹果历险记
  20. [HNOI2003] 消防局的设立

热门文章

  1. 未来的量子存储器!科学家发现全新量子光学效应 | Nature速递
  2. Ubuntu 16.04 下安装 Dropbox
  3. 2022__我的嵌入式入坑之路
  4. 导师制——听初二家长会
  5. 由区块链引发的密码技术讨论(五)哈希
  6. 解决GitHub中报错Something went really wrong and we can’t process that...
  7. sctf_2019_easy_heap off-by-null劫持IO_FILE,理解 0ctf2015 free_note unsortedbin-double_free使用
  8. Citespace6.1.R2版对知网、万方文献同时分析
  9. 第三方MiPush框架上线:既保证推送,又无需应用挂后台
  10. MIT 18.06 Gilbert Strang《线性代数》L2. 矩阵消元