Python 量化分析——基本面选股模型
摘要
利用Python进行量化分析,AkShare获取股票基本面财务数据。进行基本面数据分析,pe市盈率、ps市销率、pb市净率、总市值等数理统计,以及图表展示。基于莫伦卡选股模型进行编码,对A股300支股票进行模型运行,得到选股参考名单。最大可能基于宏观经济市场环境,进行过滤掉垃圾股,尽可能避开风险股。
本文源码及数据下载:点击这,谢谢支持
一 环境准备
1 - Anaconda 安装
参考:https://www.toutiao.com/i6825779591861240324/
2 -AkShare 库 安装
pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com --user --upgrade
安装完,测试数据获取
#%%
##1- 获取数据-A股 股票市场总貌
import akshare as ak
stock_sse_summary_df = ak.stock_sse_summary()
print(stock_sse_summary_df)##运行结果type item number
0 总貌 上市公司/家 1809
1 总貌 总股本/亿股(份) 42721.72
2 总貌 总市值/亿元 473985.92
3 总貌 平均市盈率/倍 17.44
0 总貌 上市股票/只 1852
1 总貌 流通股本/亿股(份) 37871.28
2 总貌 流通市值/亿元 395888.65
0 主板 上市公司/家 1589
1 主板 总股本/亿股 42066.29
2 主板 总市值/亿元 437496.82
3 主板 平均市盈率/倍 16.47
0 主板 上市股票/只 1632
1 主板 流通股本/亿股 37691.25
2 主板 流通市值/亿元 384769.06
0 科创板 上市公司/家 220
1 科创板 总股本/亿股(份) 655.43
2 科创板 总市值/亿元 36489.10
3 科创板 平均市盈率/倍 98.18
0 科创板 上市股票/只 220
1 科创板 流通股本/亿股(份) 180.03
2 科创板 流通市值/亿元 11119.59
其他证券数据获取,参考AkShare数据字典
https://www.akshare.xyz/zh_CN/latest/data/index.html
##1.2- 获取工行2020年全年历史股价 日频率数据
import akshare as ak
stock_zh_a_daily_qfq_df = ak.stock_zh_a_daily(symbol="sh601398", start_date="20200101", end_date="20210101", adjust="qfq")
print(stock_zh_a_daily_qfq_df)##输出结果open high low close volume outstanding_share turnover
date
2020-01-02 5.62 5.73 5.61 5.67 234949397.0 2.696122e+11 0.000871
2020-01-03 5.67 5.72 5.66 5.69 152213047.0 2.696122e+11 0.000565
2020-01-06 5.66 5.75 5.65 5.67 226509705.0 2.696122e+11 0.000840
2020-01-07 5.68 5.74 5.68 5.71 116804353.0 2.696122e+11 0.000433
2020-01-08 5.66 5.67 5.60 5.61 158559090.0 2.696122e+11 0.000588
... ... ... ... ... ... ... ...
2020-12-25 4.96 4.97 4.95 4.97 153283872.0 2.696122e+11 0.000569
2020-12-28 4.96 4.97 4.93 4.97 231926812.0 2.696122e+11 0.000860
2020-12-29 4.97 4.98 4.95 4.98 254202319.0 2.696122e+11 0.000943
2020-12-30 4.97 4.98 4.94 4.96 254078489.0 2.696122e+11 0.000942
2020-12-31 4.95 5.01 4.95 4.99 310003990.0 2.696122e+11 0.001150[243 rows x 7 columns]
二 股票基本面数据
数理统计、数据分析,以数据为基础,对其进行科学地处理、分析,从而做出推断。统计分析,包括描述性统计Descriptive Statistics、推断统计Inferential Statistics。首先我们对数据源进行整理,排序、统计频率、绘制分布图、平均数、中位数等基础书里统计,然后对数据进行整理、归类、简化、绘图。我们目的都是为了从数据中通过统计学方式去发现挖掘其中的特征、规律。
- 定性数据: 行业、企业信息等,确定性质的描述性数据
- 定量数据:股票收益数据等,确定数量的描述性数据
股票的基本面指对宏观经济、行业和公司基本情况的分析,包括公司经营理念策略、公司报表等的分析。长线投资一般用基本面分析。
四个指标:第一个是市盈率市盈率,第二个是PS市销率,第三个是市净率,第四个是总市值指标
1 -PE市盈率
市盈率 Price Earning Ratio,股价收益比率,公司市值÷股东应占比溢利
市盈率=市值/净利润
解读:一般情况下,一只股票市盈率越低,市价相对于股票的盈利能力越低,表明投资回收期越短,投资风险就越小,股票的投资价值就越大;反之则结论相反。如果一家公司的市盈率超过100倍,那么当前的股价就要通过该公司赚100年的利润才可以收回成本。如果这个比值过高说明该支股票的价值被高估,不过也反映了投资者对这支股票的信任,更加看重其未来的发展前景
那市盈率多少为之正常?这个没有绝对,跟行情、行业有关系,新兴产业一般市盈率比较高,风险也高。
- PE-TTM
- 静态市盈率
- 动态市盈率
正方图分布-每个区间的数量级直观观察,频率分布
import akshare as ak
import pandas as pd
import matplotlib.pyplot as pltstock_a_indicator_df = ak.stock_a_lg_indicator(stock="601398")
plt.hist(stock_a_indicator_df.pe)## 市盈率-正方图
plt.hist(stock_a_indicator_df.pe_ttm)## 市盈率-直方图
2 -PS市销率
总市值除以主营业务收入或者股价除以每股销售额。市销率越低,说明该公司股票目前的投资价值越大
曲线图-直观根据时序变化看到数据波动情况
stock_a_indicator_df.set_index('trade_date')
plt.plot(stock_a_indicator_df.trade_date,stock_a_indicator_df.ps,c='b')##市销率-曲线图
3- PB市净率
市净率(P/B) = 每股市价/每股账面净资产
解读:每股账面净资产主要取决于公司的运营情况所需要的净资产,是以成本投入来计量的,如果运营业绩出色,则资产增值越快,股票净值就越高
通过变形可以得到:市净率 = 市盈率x净资产收益率
4- 总市值
总市值=股票总股本 X 当时每股价格
一是公司的股价高低直接关系到公司的控制权;其二,良好的市值表现有利于降低公司的融资成本;其三,市值体现了企业家的价值和企业经营的成果;其四,市值直接反映上市公司对社会资本的吸纳能力,影响和决定着公司的未来发展。但是也有个别操纵操作虚假的嫌疑,未必能反映真实情况。
4个指标曲线图显示
df =stock_a_indicator_df
ax1 = plt.subplot(411)
plt.plot(df.trade_date,df.pe)#市盈率
plt.setp(ax1.get_xticklabels(), visible=False)ax2 = plt.subplot(412)
plt.plot(df.trade_date,df.ps)#市销率
plt.setp(ax2.get_xticklabels(), visible=False)ax3 = plt.subplot(413)
plt.plot(df.trade_date,df.pb)#市净率
plt.setp(ax3.get_xticklabels(), visible=False)ax4 = plt.subplot(414)
plt.plot(df.trade_date,df.total_mv)#市总值plt.show()
5- 其他基面数据
还有其他的基面数据,例如财务指标、分红配股、等等
例如股息率
plt.plot(df.trade_date,df.dv_ratio)#股息率
三 选股-模型:莫伦卡选股
1- 模型指标
莫伦卡提供了一个有效的框架来研究宏观经济和市场环境
- 指标1:基于历年年报数据,过去5年平均净资产收益率高于14%##指标1 - 过去5年来平均净资产收益率高于14%
import akshare as ak
df = ak.stock_financial_analysis_indicator(stock="601398")# 工行财报
df1 = df[df.index>'2015-01-01']['净资产收益率(%)']
df1_sum = df1.astype(float).sum(axis = 0, skipna = True)
df1_count = df1.count()var1 = (df1_sum / df1_count)>14
print(var1)
- 指标2:市盈率低于30,且大于0##指标2- 市盈率低于30 并且大于 0
import datetime
day = (datetime.datetime.now()- datetime.timedelta(days=30))
dateStart = datetime.datetime(day.year, day.month, day.day, 0, 0, 0)##过去30天的数据
df2 = ak.stock_a_lg_indicator(stock="601398")
df2_mean = df2[df2.trade_date >dateStart ].pe.mean()
var2 = df2_mean >0 and df2_mean < 30
print(var2)
- 指标3:经营现金流为正#指标3:经营现金流为正
import akshare as ak
df3 = ak.stock_financial_analysis_indicator(stock="601398")#财务指标数据
var3 = float( df3['每股经营性现金流(元)'].iat[1] ) > 0
print(var3)
- 指标4:新期的净利润大于前5年的净利润
#指标4:新期的净利润大于前5年的净利润
import numpy as np
var4_1 = float(df3['扣除非经常性损益后的净利润(元)'].iat[1])/ 10000
var4_2 = df3['扣除非经常性损益后的净利润(元)'].iloc[2:7].astype(np.float).max()/10000 var4 = var4_1 > var4_2
print(var4)
综合指标评估如下:
import pandas as pdvarAll = var1 and var2 and var3 and var4
anyData = {'stock':'601398','指标1':var1,'指标1':var1,'指标2':var2,'指标3':var3,'指标4':var4,'是否满足':varAll}df = pd.DataFrame(anyData,index=[0])
df
2- 模型建模
根据指标整合,先获取A股所有股票信息,然后逐个评估分析是否符合模型
## A 股上市公司的实时行情数据
stock_zh_a_spot_df = ak.stock_zh_a_spot()
print(stock_zh_a_spot_df)
##取前300测试
##取前300测试
df_stock = stock_zh_a_spot_df[['code','name']][63:200]anyData = {'stock':'00','name':'name_test','指标1':'var1','指标1':'var1','指标2':'var2','指标3':'var3','指标4':'var4','综合评估':'varAll'}
dfResult = pd.DataFrame(anyData,index=[0])for row_index, row in df_stock.iterrows():# print(row['code'])# print(row['name'])r_code = row['code']r_name = row['name']##指标1 - 过去5年来平均净资产收益率高于14%df = ak.stock_financial_analysis_indicator(stock=r_code)# 财务指标数据 工行财报# print(df.head())df1 = df[df.index>'2015-01-01']['净资产收益率(%)']df1_sum = df1.replace('--',0).astype(float).sum(axis = 0, skipna = True)df1_count = df1.count()var1 = (df1_sum / df1_count)>14##指标2- 市盈率低于30 并且大于 0 day = (datetime.datetime.now()- datetime.timedelta(days=30))dateStart = datetime.datetime(day.year, day.month, day.day, 0, 0, 0)##过去30天的数据df2 = ak.stock_a_lg_indicator(stock="601398")df2_mean = df2[df2.trade_date >dateStart ].pe.mean()var2 = df2_mean >0 and df2_mean < 30#指标3:经营现金流为正df3 = df#财务指标数据var3 = float( df3['每股经营性现金流(元)'].iat[1] ) > 0# print(var3)#指标4:新期的净利润大于前5年的净利润 取万元var4_1 = float(df3['扣除非经常性损益后的净利润(元)'].iat[1])/ 10000 var4_2 = df3['扣除非经常性损益后的净利润(元)'].iloc[2:8].astype(np.float).max()/10000 var4 = var4_1 > var4_2##综合评估varAll = var1 and var2 and var3 and var4if varAll == True:print(row)anyData = {'stock':r_code,'name':r_name,'指标1':var1,'指标1':var1,'指标2':var2,'指标3':var3,'指标4':var4,'综合评估':varAll}df_idex = row_index+1dfResult.loc[df_idex] = anyDataprint(dfResult)time.sleep(7)
运行过程:
3 运行模型结果
结果如下:
完整结果《莫伦卡选股结果数据集.csv》以及本文所有过程源码,点击这,谢谢支持,或者关注公众号:
freo-studio,回复“莫伦卡选股”获取,谢谢!
Python 量化分析——基本面选股模型相关推荐
- python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据
python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据 最近工作太忙了,有一个星期没有更新文章了,本来这一期打算分享一些对龙虎榜数据的分析结果的,现在还没有把数据内的价值很好 ...
- python量化分析数据_Python数据分析_量化分析.pdf
法律声明 本课件包括:演示文稿,示例,代码,题库,视频和声 音等,小象学院拥有完全知识产权的权利:只限于善意 学习者在本课程使用,不得在课程范围外向任何第三方 散播.任何其他人或机构不得盗版.复制 ...
- Python 量化分析ETF指数基金投资
Python 量化分析ETF指数基金. 标签(空格分隔): python 量化 ETF tushare pandas 文章目录 Python 量化分析ETF指数基金. 数据获取 数据分析 在喜马拉雅上 ...
- Python量化分析之K线模式识别
Python量化分析中,基于TA-Lib 的K线的指标分析 转自 https://www.ricequant.com/community/topic/2393 函数名:CDL2CROWS 名称:Two ...
- python 量化分析 入门_【合辑·收藏】Python量化从入门到精通
原标题:[合辑·收藏]Python量化从入门到精通 引言 自2018年9月27日发第一篇推文以来,公众号"Python金融量化"专注于分享Python在金融量化领域的实战应用,坚持 ...
- python量化交易--因子选股策略
Fama-French三因子选股策略,三因子分别为 市场因子(股指).市值因子.账面市值比因子 三因子模型的具体步骤: 1.对股票按照市值和账面市值比分组,共计六组,市值按大小市值各50%分,账面市 ...
- python量化分析岗位_量化金融有哪些职位可以选择?
机会成本 之前写了自己如何从自动化领域转行到金融领域,后台很多朋友私信问自己的背景适不适合转行做量化,或者是如果想做量化需要做什么准备,虽然简单的回答了一些,但是由于平时工作和学习实在太忙,难免相对简 ...
- python量化分析前景_Python3 量化分析笔记从小白到破产-学习路线规划
文:蓝兔子读难NOTES 图: 配图 来源于网络 Python3 量化分析从小白到破产 学习路线规划 编码:0002 上一次我们安装了 jupyter notebook 作为我们的开发环境,但是我们在 ...
- python 量化分析 入门_量化入门-小白到菜鸟的学习路线
小白到菜鸟的入门学习路线,不要盲目以为多看策略就能学会,要注意学习方法. 本文的主要目的 很多新人面对多如牛毛的策略不知从何下手,在很多较难的帖子下面留言一些最基础的问题.小白不知道该先学什么,后学什 ...
最新文章
- 用Eclipse开发PHP项目
- python找最长的字符串_在字符串python中查找最长的唯一子字符串
- 力争营收渠道多样化,Line 向自拍应用 Snow 投资 4500 万美元
- python读取二进制文件_如何用python读取二进制文件?
- 以监控为核心 实现安防智能化全面兼容
- 作为一个女程序员,有感而发
- 【分享】终端命令工具 自动生成vue组件文件以及修改router.js
- openwrt路由器进入安全模式
- 做创业公司长期价值的共建者,高榕资本完成5亿美元新基金募资
- mysql执行提交与回滚
- 为何time_before 起作用【转】
- elk怎么读的_大数据采集和抽取怎么做?这篇文章终于说明白了!
- 考研数学证明题快速方法
- 超好用json转excel工具
- vue中局部过滤器和全局过滤器的使用
- 如何快速的将PDF文件转换成word?
- JSF 原理简要介绍
- pro缺点和不足 一加7t_一加7T Pro深度体验半个月以后:优点和缺点都很明显
- nrf24l01无线通信模块与51单片机工作原理
- 记一次攻防演练之vcenter后渗透利用
热门文章
- SQLite3在IOS中的用法
- vue-element-admin 快捷导航(标签栏导航)切换不刷新问题
- 微型计算机内存为16m,微型计算机的内存为16M,指的是其内存容量为()。
- keep sb updated_keep you update 和keep you updated哪个正确
- 一文详解工业视觉中的光源及应用
- 斐讯n1遥控器app(支持休眠和唤醒)——WiFi篇
- Effective C++ 总结
- css3 - 图标元素动画效果4 - 动画延迟
- 计算机硬盘满了怎么解决,我的128G笔记本电脑硬盘又满了,怎么办?
- 高斯消元简单线性代数线性基学习记录