PB-ROE提供了一种投资的框架,这种框架是说,股票的PB和ROE之间存在近似的线性关系,ROE越高,PB越高,因此如果同时根据PB、ROE值来投资,很难选到同时满足PB最小、ROE最大的股票。但可以根据他们的线性关系进行选择,回归直线上的点可以视为合理的PB、ROE组合水平,这样位于回归线下方的股票都是PB被低估的,未来有很大的上升修复空间,而位于回归线上方的股票都是当前PB被高估的,未来会下降,因此投资可以选择位于回归线下方的股票。

使用这种方法最重要的点是回归必须是靠谱的,比如ROE应该是稳定的,确保未来可持续,比如应想办法消除行业间的差异等等。

import numpy as np
from atrader import *
import pandas as pd
set_setting('ALLOW_CONSOLE_SYSTEM_WARN', False)
import statsmodels.api as sm#获取沪深300的成分股代码
get_code_list('hs300')

#获取PB,ROE数据
import atrader as at
dfData=get_factor_by_day(factor_list=['PB','ROE'], target_list=list(get_code_list('hs300').code), date='2019-08-30').set_index('code')
dfData

# MAD:中位数去极值
def extreme_MAD(dt,n):median = dt.quantile(0.5)   # 找出中位数new_median = (abs((dt - median)).quantile(0.5))   # 偏差值的中位数dt_up = median + n*new_median    # 上限dt_down = median - n*new_median  # 下限return dt.clip(dt_down, dt_up, axis=1)    # 超出上下限的值,赋值为上下限# Z值标准化
def standardize_z(dt):mean = dt.mean()     #  截面数据均值std = dt.std()       #  截面数据标准差return (dt - mean)/std# 行业中性化
shenwan_industry = {
'SWNLMY1':'sse.801010',
'SWCJ1':'sse.801020',
'SWHG1':'sse.801030',
'SWGT1':'sse.801040',
'SWYSJS1':'sse.801050',
'SWDZ1':'sse.801080',
'SWJYDQ1':'sse.801110',
'SWSPCL1':'sse.801120',
'SWFZFZ1':'sse.801130',
'SWQGZZ1':'sse.801140',
'SWYYSW1':'sse.801150',
'SWGYSY1':'sse.801160',
'SWJTYS1':'sse.801170',
'SWFDC1':'sse.801180',
'SWSYMY1':'sse.801200',
'SWXXFW1':'sse.801210',
'SWZH1':'sse.801230',
'SWJZCL1':'sse.801710',
'SWJZZS1':'sse.801720',
'SWDQSB1':'sse.801730',
'SWGFJG1':'sse.801740',
'SWJSJ1':'sse.801750',
'SWCM1':'sse.801760',
'SWTX1':'sse.801770',
'SWYH1':'sse.801780',
'SWFYJR1':'sse.801790',
'SWQC1':'sse.801880',
'SWJXSB1':'sse.801890'
}# 构造行业哑变量矩阵
def industry_exposure(target_idx):# 构建DataFrame,存储行业哑变量df = pd.DataFrame(index = [x.lower() for x in target_idx],columns = shenwan_industry.keys())for m in df.columns:        # 遍历每个行业# 行标签集合和某个行业成分股集合的交集temp = list(set(df.index).intersection(set(get_code_list(m).code.tolist())))df.loc[temp, m] = 1      # 将交集的股票在这个行业中赋值为1df = df.fillna(0)return df        # 将 NaN 赋值为0# 需要传入单个因子值和总市值
def neutralization(factor,MktValue,industry = True):Y = factor.fillna(0)Y.rename(index = str.lower,inplace = True)df = pd.DataFrame(index = Y.index, columns = Y.columns)    # 构建输出矩阵for i in range(Y.shape[1]):    # 遍历每一天的截面数据if type(MktValue) == pd.DataFrame:lnMktValue = MktValue.iloc[:,i].apply(lambda x:math.log(x))   # 市值对数化lnMktValue.rename(index=str.lower, inplace=True)if industry:              # 行业、市值dummy_industry = industry_exposure(Y.index.tolist())X = pd.concat([lnMktValue,dummy_industry],axis = 1,sort = False)  # 市值与行业合并else:                     # 仅市值X = lnMktValueelif industry:              # 仅行业dummy_industry = industry_exposure(factor.index.tolist())X = dummy_industry# X = sm.add_constant(X)result = sm.OLS(Y.iloc[:,i].astype(float),X.astype(float)).fit()   # 线性回归df.iloc[:,i] = result.resid  # 每日的截面数据存储到df中return df
dfData = dfData.loc[dfData['PB']>0]
dfData = dfData.loc[dfData['PB']<10]
dfData = dfData.loc[dfData['ROE']>0]
dfData = dfData.loc[dfData['ROE']<10]# 去极值和标准化
data_S = standardize_z(dfData)
# 行业中性化
data_S_ID_PB = neutralization(data_S[['PB']],0)
data_S_ID_ROE = neutralization(data_S[['ROE']],0)#回归数据准备
x = data_S_ID_ROE[['ROE']]
x['Intercept'] = 1
x_ = x[['Intercept','ROE']]
y = data_S_ID_PB['PB']#回归
model = sm.OLS(y.astype(float),x_.astype(float))
result=model.fit()#回归系数
result.params#answer:
#Intercept    0.04428
#ROE          0.42821#拟合曲线
y_fitted = data_S_ID_ROE*result.params[1]+result.params[0]df = pd.DataFrame()
df[['PB']] = data_S_ID_PB
df['ROE'] = data_S_ID_ROE
df['y_fitted'] = y_fittedimport matplotlib.pyplot as plt
plt.figure(figsize = (8,6))
plt.plot(df['ROE'], df['PB'],'ko', label='sample')
plt.plot(df['ROE'], df['y_fitted'], 'black',label='OLS',linewidth = 2)
plt.xlabel('ROE')
plt.ylabel('PB')
plt.show()

df_choice = df.loc[df['PB']<df['y_fitted']]
df_choice.head()

python线性回归 多因子模型选股思路相关推荐

  1. python线性回归实例_sklearn+python:线性回归案例

    使用一阶线性方程预测波士顿房价 载入的数据是随sklearn一起发布的,来自boston 1993年之前收集的506个房屋的数据和价格.load_boston()用于载入数据. from sklear ...

  2. Python 线性回归

    Python 线性回归 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 线性回归简介 相关概念见下: 如果想通过一个模型找到目 ...

  3. l2正则化python_机器学习入门之机器学习之路: python线性回归 过拟合 L1与L2正则化...

    本文主要向大家介绍了机器学习入门之机器学习之路: python线性回归 过拟合 L1与L2正则化,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助. 正则化:    提高模型在未知数据上的 ...

  4. python 线性回归_Python中的简化线性回归

    python 线性回归 In the area of Machine Learning, one of the first algorithms that someone can come acros ...

  5. python 线性回归模型_如何在Python中建立和训练线性和逻辑回归ML模型

    python 线性回归模型 Linear regression and logistic regression are two of the most popular machine learning ...

  6. python 线性回归_用Python实现线性回归算法

    前几天我们介绍了线性回归模型的原理,今天我们主要来看如何用Python代码将线性回归写出来. 首先,打开我们的jupyter notebook,把常用的一些包都加载上吧: import numpy a ...

  7. python 线性回归 统计检验 p值_SPSS 25 数学统计分析工具

    SPSS 25 是一个集成的系列产品,解决了整个分析过程,从策划到数据收集,分析,报告和部署.随着十几完全集成的模块可供选择,你可以找到你需要的专业能力,以增加收入,超越竞争对手,进行研究,并做出更好 ...

  8. python线性回归实例_python 线性回归示例

    说明:此文的第一部分参考了这里 用python进行线性回归分析非常方便,有现成的库可以使用比如:numpy.linalog.lstsq例子.scipy.stats.linregress例子.panda ...

  9. python线性回归算法简介_Python机器学习(二):线性回归算法

    机器学习研究的问题分为分类问题和回归问题.分类问题很好理解,而回归问题就是找到一条曲线,可以最大程度地拟合样本特征和样本输出标记之间的关系.当给算法一个输入时,这条曲线可以计算出相应可能的输出.回归算 ...

最新文章

  1. Android:ListView、ListActivity、 setListAdapter
  2. 第十六届全国大学生智能汽车竞赛-航天智慧物流创意组 线下选拔赛赛题发布!
  3. JavaScript的特殊函数
  4. tensorflow2.0的cpu与gpu运行时间对比
  5. RabbitMQ之呕心沥血的总结(图文并茂、万字级别、毕生所学)
  6. python类与对象示意图_2020Python作业——类与对象,
  7. ubuntu 的远程桌面
  8. python是外部还是编程_Python网络编程(绑定到外部地址)
  9. 【NLP Subword】三大算法原理:BPE、WordPiece、ULM
  10. java gson json_Java利用gson处理json字符串
  11. Windows 安全杂记(一)
  12. 大数据培训(第一季) java基础-徐培成-专题视频课程
  13. 自学java,能找到工作吗?一位月薪13k的自学程序员分享自己是如何学会java的
  14. 利用“栈”快速计算——逆波兰表达式
  15. 八数码问题引发的思考
  16. 入门图形学:ComputeShader
  17. 外贸网站建设需要注意的事项
  18. Android项目CJM9之新闻浏览模块的实现
  19. [Mac 硬件相关] Mac日常拆卸及相关维护(更换电池/清风扇/更换硅脂)
  20. 博客园博文爬虫案例效果

热门文章

  1. 大容量存储方案_数字视频监控大容量存储解决方案
  2. Ubuntu16.04安装flash
  3. 传智黑马Java → 28同步技术的原理(同步代码块)
  4. 适合游戏办公的计算机组装,2800元i3-7100配GTX1050办公游戏两不误电脑配置推荐
  5. 去除js代码混淆的方法,亲测有效
  6. 全网最全安全加固指南
  7. 大数据平台下利用Python进行Hql并行数据跑批
  8. Kong 网关 | Route
  9. C#线程安全集合类说明(2): ConcurrentBag<T>
  10. Docsify 创建文档网站