我们平时做股票投资,经常会提到市盈率(PE)、市净率(PB)、净资产收益率(ROE)等数据,并有各种分析技术说明如何根据 PE、PB、ROE 等数据对股票价值进行评估。那 PE、PB、ROE 数据对 A股市场到底有多少参考价值呢?这里我们用 Python 简单的对其做一分析,供大家参考,详细过程如下。
分析 PE、PB 对股价的影响
我们先提取个股 PE、PB数据,并用三维点阵图显示,评估其规律,直接上代码如下:
import matplotlib.pyplot as plt
import numpy as np
import tushare as ts
import pandas as pd
from mpl_toolkits.mplot3d import Axes3D #绘制三D图形
# 获取股票基本信息,包括 PE、PB 值
df_base = ts.get_stock_basics()
df_base['code'] = df_base.index
# 获取股票当天数据,包括当前股价
df_todays = ts.get_today_all()
df_todays['code'] = df_todays.index
# 整合股价与 PE、PB 数据
df = pd.merge(df_todays, df_base, how='left', on=['code'])
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X = df['per'].tolist() # X 轴为 PE 数据
Y = df['pb_x'].tolist() # Y 轴为 PB 数据
Z = df['trade'].tolist() # Z 轴为 股价数据
#给三个坐标轴注明
ax.set_xlabel('PE', color='r')
ax.set_ylabel('PB', color='g')
ax.set_zlabel('trade', color='b')
ax.scatter(X, Y, Z)
plt.show()
其统计结果如下图所示:
观察以上散点图,除了个别异常数据,主要数据集中在一起,不方便直观观察,下面我们根据数据情况进行异常值剔除。
剔除 PE、PB 异常值后的分析
根据上图分析,PE 数据分布范围比较大,但主要集中在 -500 至 1000之间,PB数据比较集中,但有个别异常值,股价(trade)数据主要集中在 0 至 100 之间,有一个异常值500多,应该是 贵州茅台(sh600519)吧。下面我们剔除异常值,只选择 PE 在 -100 到 200之间、股价在 0 至 100之间,PB 在0至 10 之间的数据,
import matplotlib.pyplot as plt
import numpy as np
import tushare as ts
import pandas as pd
from mpl_toolkits.mplot3d import Axes3D #绘制三D图形
# 获取股票基本信息,包括 PE、PB 值
df_base = ts.get_stock_basics()
df_base['code'] = df_base.index
# 获取股票当天数据,包括当前股价
df_todays = ts.get_today_all()
df_todays['code'] = df_todays.index
# 整合股价与 PE、PB 数据
df = pd.merge(df_todays, df_base, how='left', on=['code'])
df.dropna()
# 剔除异常值
result = df[(-100
统计结果的 3D 散点图如下图所示,纵坐标为股价:
3D 散点图还是不能非常清楚的看到 PE、PB 与股价的关系,我们稍稍调整一下角度,先查看 PE 与股价的关系,如下图所示:
再调整角度,查看 PB 值与 股价的关系,我们加了两条辅助线,以说明其相关性,如下图所示:
直观的已经可以看到,PE、PB 与股价有一定的相关性,至于具体有什么样的关系,以后我们会做进一步的拟合分析。
分析 PB、ROE 对股价的影响
通过以上的分析,我们看到 PB值 与股价的线性关系相对明显,下面我们对 PB、ROE 对股价的影响做进一步的分析,至于 PE 与 ROE 的分析,各位可以参考代码自行修改。 PB、ROE与股价关系 3D散点图如下所示: 同样,变换角度来观察 ROE 与股价的关系,如下图所示: 以上,我们 对 PE、PB、ROE 与股价的关系,做了直观 的图形分析,发现效果并不是非常明显。今后,我们会进一步深入分析,如进一步细分数据范围、引入更多参数、进行主成分分析等,并做相应函数拟合,以期挖掘出更多有价值的结论。
PB 、ROE 与股价的分析 ,同样剔除异常值,数据选择范围 0import matplotlib.pyplot as plt
import numpy as np
import tushare as ts
import pandas as pd
from mpl_toolkits.mplot3d import Axes3D #绘制三D图形
# 获取股票基本信息,包括 PE、PB 值
df_base = ts.get_stock_basics()
df_base['code'] = df_base.index
# 获取股票当天数据,包括当前股价
df_todays = ts.get_today_all()
df_todays['code'] = df_todays.index
df_roe = ts.get_report_data(2018,3)
df_roe['code'] = df_roe.index
# 整合股价与 PE、PB 数据
df = pd.merge(df_todays, df_base, how='left', on=['code'])
df = pd.merge(df, df_roe, how='left', on=['code'])
df.dropna()
result = df[(0
后续工作