股市要反弹?Python 帮你选出好股票
共 15880字,需浏览 32分钟
·
2021-03-15 03:21
首先,看一眼今日的大盘各板块的涨跌云图[1]。一片大红,股市是要反弹了吗?
股市接下来怎么走?不好说,看月线的话,说不定接下来会走熊,当然也可能反弹起来继续走牛。
但不管怎么说,个股总有机会,问题在于我们怎么找出好股呢?本篇试图结合一定的策略来从数据中选择一些所谓的好股票。
1股票数据的获取
首先,我们要获取股票数据,可以调用第三方程序包的 API,如 baostock[2]、tushare[3] 等。但如果要获取当天的数据,也可以直接从相关网站上爬取。
这里我们选择雪球网,找一只股票来看一下对应的网页。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
我们要批量读取 A 股上市的股票数据,因此可以抓取下面这一页上的内容。
因为任务较简单,写一个函数就够了。
import requests,re,json,time,os
from bs4 import BeautifulSoup
def get_stock():
headers = {'User-Agent': 'User-Agent:Mozilla/5.0'}
c = ['股票代码','股票名称','净利润增长率','今年涨幅','滚动市净率','滚动市盈率','滚动净资产收益率']
df = pd.DataFrame(columns=c)
url = 'https://xueqiu.com/service/v5/stock/screener/quote/list?page='+str(1)+'&size=5000&order=desc&orderby=percent&order_by=percent&market=CN&type=sh_sz'
response = requests.get(url,headers=headers)
res_dict = json.loads(response.text)
list_lsit = res_dict['data']
db ={}
for item in list_lsit['list']:
db['股票代码'] = item['symbol']
db['股票名称'] = item['name']
db['净利润增长率'] = item['net_profit_cagr']
db['今年涨幅'] = item['current_year_percent']
db['滚动市净率'] = item['pb_ttm']
db['滚动市盈率'] = item['pe_ttm']
db['滚动净资产收益率'] = item['roe_ttm']
df = df.append(db,ignore_index=True)
return df
df = get_stock()
df.shape
(4304, 7)
# 将数据保存起来
df.to_csv('./沪深.csv', encoding='utf-8-sig')
# 去除带缺失值的股票
dfd = df.dropna()
# 取出 ROE_TTM PB_TTM
data = dfd[['滚动净资产收益率','滚动市净率']].astype(np.float64)
data.columns = ['ROE','PB']
# 补充几栏
data['ROE/PB'] = data['ROE']/data['PB']
data['CODE'] = dfd['股票代码']
data['NAME'] = dfd['股票名称']
data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2944 entries, 0 to 4286
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 ROE 2944 non-null float64
1 PB 2944 non-null float64
2 ROE/PB 2944 non-null float64
3 CODE 2944 non-null object
4 NAME 2944 non-null object
dtypes: float64(3), object(2)
memory usage: 138.0+ KB
# 看一下相关系数
corr = data.corr()
plt.subplots(figsize=(6,5))
sns.heatmap(corr, cmap='coolwarm', annot=True);
先不管三七二十一画出来总体看一下,发现有些离群值。
plt.subplots(figsize=(9, 5))
sns.scatterplot(x='ROE', y='PB', data=data);
ax.set_xlabel('ROE')
ax.set_ylabel('PB')
Text(17.199999999999996, 0.5, 'PB')
那么就不用客气删除它们,以方便观察正常数据。
# 剔除异常值
data_inliers = data[(data['PB']<50)&(-10<data['ROE'])&(data['ROE']<100)]
data_inliers.head()
ROE | PB | ROE/PB | CODE | NAME | |
---|---|---|---|---|---|
0 | 27.155422 | 3.1099 | 8.731928 | SH605122 | N四方 |
2 | 14.869350 | 9.2634 | 1.605172 | SZ300566 | 激智科技 |
3 | 7.097575 | 2.0384 | 3.481934 | SZ300428 | 四通新材 |
6 | 46.448091 | 20.2730 | 2.291131 | SZ300782 | 卓胜微 |
7 | 0.611650 | 0.9884 | 0.618828 | SH600192 | 长城电工 |
# 去掉异常值后重新绘制
plt.subplots(figsize=(9,5))
ax = plt.axes()
plt.scatter(data_inliers['ROE'],data_inliers['PB'],marker='o',c='#55bbff',s=40,alpha=0.9,edgecolors='k')
ax.set_xlabel('ROE')
ax.set_ylabel('PB')
ax.set_facecolor('#fff')
2价值投资之 ROE-PB 策略
一个投资者其实只需要学习两门功课:如何理解市场和如何估值。
—— 沃伦·巴菲特
可见,投资的一个重要内容是估值。那么用什么指标来对股票进行估值呢?
ROE(净资产收益率,是税后利润和所有者权益的比值),ROE 是衡量企业盈利能力的重要指标。
PB(市净率,是股票价格与每股净资产的比值),用来衡量估值的指标。
估值和盈利是反映和预测股票表现的两个重要维度,而市净率 PB 和净资产收益率 ROE 则是衡量估值水平和盈利能力的两个重要指标。
市净率 PB 衡量的是单位净资产的价格,PB 越低表明当前估值水平越低;净资产收益率 ROE 衡量的是单位净资产的收益率,ROE 越高表明企业利用净资产产生利润的能力越强。
股票价值投资旨在寻找当前价格低于内在价值的标的进行投资,ROE-PB 策略能够为价值投资提供良好的参考依据。中长期来看,投资者对股票的估值水平会随着公司盈利能力的增强而上升,即 PB 与 ROE 之间在理论上应当呈现正相关性。但实际中,往往存在错位的情况,即一些股票的 PB 值会高于或低于其 ROE 对应的理论水平,ROE-PB 策略可以帮助我们找出目前被市场低估的股票并进行价值投资。
ROE-PB 两个指标结合起来提供了一种投资策略。但实际上很难找到同时满足 PB 最小、ROE 最大的股票。但可以假设他们存在一个线性关系,回归线附近的点可以视为 PB、ROE 均衡水平。位于回归线右下方的股票都是 PB 被低估的,估价预期有一定的上升空间,而位于回归线上方的股票都是当前 PB 被高估的,未来很可能会下跌,因此投资可以选择位于回归线下方的股票。
☐鲁棒线性回归
下面我试图来把 ROE-PB 所在的回归线给找出来,简单说就是把它看成一个线性回归问题。但是这里往往并不是刚好形成一条直线,而且有很多点偏离主线。因此,我们使用鲁棒回归方法。所谓鲁棒,就是不受那些离群值的影响,能把数据中的主要部分的线性关系找出来,甚至可以抵御高达一半的离群值。
这里相当于要找一个主方向,那么使用 PCA 就能实现。我们这里是想找到 ROE-PB 潜在的回归直线,但它似乎并不是一条干净的直线,需要排除一些离群值。因此,我们使用最小协方差行列式(Minimum Covariance Determinent)来估计主方向。该方法可以更加鲁棒地计算出潜藏在大部分数据中的主方向。
from sklearn.covariance import MinCovDet
X = data_inliers[['ROE', 'PB']]
# 用最小协方差行列式(MCD)鲁棒估计来拟合数据
robust_cov = MinCovDet().fit(X)
robust_center = robust_cov.location_
w,v = np.linalg.eig(robust_cov.covariance_)
def mahadist(X, robust_cov):
D_maha_dist = robust_cov.mahalanobis(X)
return D_maha_dist
def drawmahadist(X_2d):
robust_cov = MinCovDet().fit(X_2d)
robus_center = robust_cov.location_
x_m = robus_center[0]
y_m = robus_center[1]
x = np.linspace(X_2d['ROE'].min(), X_2d['ROE'].max(), 100)
y = np.linspace(X_2d['PB'].min(), X_2d['PB'].max(), 100)
xx, yy = np.meshgrid(x, y)
X_grid = np.c_[xx.ravel(), yy.ravel()]
fig, ax = plt.subplots(figsize=(9,5))
# contour
zz = np.sqrt(mahadist(X_grid, robust_cov))
cnt=ax.contourf(x, y, zz.reshape(100,100), levels=30, alpha=0.8, cmap='coolwarm')
# point
ax.scatter(data_inliers['ROE'], data_inliers['PB'], marker='o',c='#ff5500',s=40,alpha=0.25,edgecolors='k')
# line
t = np.linspace(0,80)[:,None]
line_points = t*v[:,0:1].T + robust_center
sns.lineplot(x=line_points[:,0], y=line_points[:,1], color='b', ax=ax);
ax.grid(axis='both',linestyle=' ',color='#ffffff')
ax.set_xlabel('ROE')
ax.set_ylabel('PB')
drawmahadist(X)
上面图像中的一圈圈椭圆展示了距离场,只是这里的距离实际上是指马氏距离,而椭圆的长轴就是我们要找的主方向(如上图蓝色线段标示)。下面我们把位于这个主方向下面的股票挑出来。
def find_stock(data, c=None, v=None, roe_ttm=10):
a = v[1]/v[0]
X_c = data[['ROE','PB']]-c
s = X_c['PB']/X_c['ROE']
res = data[(0<s)&(s<a)]
return res[res['ROE']>roe_ttm]
igotu = find_stock(data_inliers,robust_center,v[:,0])
# 根据 ROE 从高到低排列
roepb = igotu.sort_values(by='ROE', ascending=False)
roepb
ROE | PB | ROE/PB | CODE | NAME | |
---|---|---|---|---|---|
2266 | 90.912636 | 3.6245 | 25.082807 | SH603301 | 振德医疗 |
1901 | 84.092639 | 3.8519 | 21.831470 | SZ300552 | 万集科技 |
1922 | 67.147535 | 3.0505 | 22.011977 | SZ300418 | 昆仑万维 |
1985 | 62.282311 | 4.5671 | 13.637168 | SZ002605 | 姚记科技 |
3368 | 57.231686 | 4.9274 | 11.614987 | SZ002838 | 道恩股份 |
2869 | 54.744852 | 2.1719 | 25.205973 | SZ002869 | 金溢科技 |
2012 | 54.272566 | 2.4334 | 22.303183 | SZ002124 | 天邦股份 |
625 | 50.287478 | 4.1907 | 11.999780 | SZ300951 | 博硕科技 |
148 | 48.043600 | 4.4892 | 10.702041 | SZ002681 | *ST奋达 |
2050 | 45.478192 | 4.1753 | 10.892197 | SZ002950 | 奥美医疗 |
2126 | 45.462367 | 3.8546 | 11.794315 | SZ300246 | 宝莱特 |
2002 | 42.648144 | 2.5474 | 16.741832 | SZ003021 | 兆威机电 |
1999 | 42.535969 | 2.4769 | 17.173067 | SZ000672 | 上峰水泥 |
917 | 38.921443 | 2.5307 | 15.379714 | SH601155 | 新城控股 |
4041 | 38.402240 | 2.4615 | 15.601154 | SZ300498 | 温氏股份 |
3068 | 34.483822 | 3.1276 | 11.025650 | SZ300658 | 延江股份 |
709 | 33.642009 | 2.3985 | 14.026270 | SH600685 | 中船防务 |
2524 | 32.190534 | 2.5223 | 12.762373 | SZ000897 | 津滨发展 |
918 | 32.136506 | 3.3352 | 9.635556 | SZ300432 | 富临精工 |
1575 | 30.695275 | 2.4906 | 12.324450 | SZ002768 | 国恩股份 |
3538 | 28.986902 | 2.5754 | 11.255301 | SH600053 | 九鼎投资 |
0 | 27.155422 | 3.1099 | 8.731928 | SH605122 | N四方 |
3896 | 26.032117 | 2.1432 | 12.146378 | SZ000011 | 深物业A |
3815 | 25.192530 | 2.9702 | 8.481762 | SZ300417 | 南华仪器 |
2999 | 24.479929 | 3.0372 | 8.060032 | SH600167 | 联美控股 |
1024 | 23.543785 | 2.2198 | 10.606264 | SZ002459 | 晶澳科技 |
1535 | 23.492150 | 2.6220 | 8.959630 | SZ300016 | 北陆药业 |
1636 | 23.261363 | 2.4296 | 9.574154 | SZ000876 | 新希望 |
2201 | 22.804934 | 2.3270 | 9.800144 | SZ300497 | 富祥药业 |
1635 | 22.450881 | 2.5647 | 8.753804 | SZ002182 | 云海金属 |
3737 | 22.303574 | 2.2049 | 10.115458 | SH600477 | 杭萧钢构 |
1606 | 21.777340 | 2.1927 | 9.931746 | SZ002382 | 蓝帆医疗 |
753 | 21.044091 | 2.4386 | 8.629579 | SZ000785 | 居然之家 |
23 | 20.783777 | 2.8056 | 7.407961 | SH605298 | 必得科技 |
2777 | 20.272516 | 2.1475 | 9.440054 | SZ002641 | 永高股份 |
459 | 19.661227 | 2.3649 | 8.313767 | SH605060 | 联德股份 |
1163 | 19.581738 | 2.2727 | 8.616068 | SH600663 | 陆家嘴 |
624 | 19.423666 | 2.5205 | 7.706275 | SZ300800 | 力合科技 |
1932 | 19.415225 | 2.1128 | 9.189334 | SZ000935 | 四川双马 |
2825 | 18.995449 | 2.7187 | 6.986960 | SH603587 | 地素时尚 |
1842 | 18.863163 | 2.1729 | 8.681100 | SH603808 | 歌力思 |
1082 | 18.624210 | 2.4813 | 7.505828 | SH605368 | 蓝天燃气 |
2770 | 18.622596 | 2.7418 | 6.792106 | SH603156 | 养元饮品 |
3374 | 18.229222 | 2.3227 | 7.848289 | SZ300569 | 天能重工 |
2151 | 18.138950 | 2.3486 | 7.723303 | SZ300511 | 雪榕生物 |
1405 | 18.033783 | 2.6338 | 6.847059 | SH600731 | 湖南海利 |
3256 | 17.781438 | 2.3164 | 7.676324 | SH603871 | 嘉友国际 |
1753 | 17.638695 | 2.6788 | 6.584551 | SH603886 | 元祖股份 |
114 | 17.552805 | 2.3205 | 7.564234 | SZ002487 | 大金重工 |
3138 | 17.479719 | 2.1659 | 8.070418 | SZ002035 | 华帝股份 |
4101 | 17.403295 | 2.5833 | 6.736846 | SH603319 | 湘油泵 |
2759 | 17.082254 | 2.2540 | 7.578640 | SZ000703 | 恒逸石化 |
1447 | 16.958351 | 2.5843 | 6.562067 | SZ002737 | 葵花药业 |
1141 | 16.674437 | 2.1950 | 7.596554 | SH688178 | 万德斯 |
2254 | 16.564496 | 2.1843 | 7.583435 | SZ000921 | 海信家电 |
1492 | 16.519428 | 2.5219 | 6.550390 | SH600783 | 鲁信创投 |
1716 | 16.316396 | 2.4012 | 6.795101 | SZ002697 | 红旗连锁 |
3025 | 16.168130 | 2.2428 | 7.208904 | SZ300771 | 智莱科技 |
3680 | 16.156674 | 2.3916 | 6.755592 | SZ300564 | 筑博设计 |
2761 | 16.141069 | 2.1123 | 7.641466 | SZ300259 | 新天科技 |
419 | 16.062803 | 2.4505 | 6.554909 | SH601615 | 明阳智能 |
2025 | 15.745594 | 2.4938 | 6.313896 | SZ002014 | 永新股份 |
673 | 15.690747 | 2.2846 | 6.868050 | SH603639 | 海利尔 |
1975 | 15.689557 | 2.4925 | 6.294707 | SZ002429 | 兆驰股份 |
1412 | 15.632832 | 2.1405 | 7.303355 | SZ000157 | 中联重科 |
3801 | 15.612517 | 2.4274 | 6.431786 | SZ300686 | 智动力 |
3091 | 15.605405 | 2.2795 | 6.845977 | SZ000628 | 高新发展 |
1237 | 15.546172 | 2.4790 | 6.271146 | SZ300801 | 泰和科技 |
2054 | 15.455564 | 2.4871 | 6.214292 | SZ002845 | 同兴达 |
2323 | 15.433054 | 2.2955 | 6.723178 | SH603393 | 新天然气 |
4175 | 15.398200 | 2.1506 | 7.159955 | SH603013 | 亚普股份 |
1540 | 15.276572 | 2.1260 | 7.185594 | SH601330 | 绿色动力 |
1365 | 15.274689 | 2.5149 | 6.073676 | SH603995 | 甬金股份 |
2650 | 15.185982 | 2.2182 | 6.846083 | SH603797 | 联泰环保 |
1004 | 15.042942 | 2.4761 | 6.075256 | SZ002940 | 昂利康 |
34 | 15.002590 | 2.4310 | 6.171366 | SH605208 | 永茂泰 |
890 | 14.988407 | 2.4982 | 5.999682 | SZ002911 | 佛燃能源 |
2480 | 14.707096 | 2.1529 | 6.831296 | SZ002616 | 长青集团 |
3481 | 14.676274 | 2.3597 | 6.219551 | SZ002853 | 皮阿诺 |
626 | 14.633317 | 2.2609 | 6.472342 | SZ002003 | 伟星股份 |
3099 | 14.594197 | 2.3131 | 6.309367 | SH600511 | 国药股份 |
3754 | 14.254131 | 2.3390 | 6.094113 | SH600398 | 海澜之家 |
2674 | 14.171587 | 2.3509 | 6.028154 | SZ002300 | 太阳电缆 |
3734 | 14.162771 | 2.4629 | 5.750445 | SH603657 | 春光科技 |
2563 | 14.026502 | 2.2171 | 6.326508 | SZ300031 | 宝通科技 |
47 | 13.990748 | 2.4349 | 5.745923 | SH603810 | 丰山集团 |
3342 | 13.869217 | 2.3581 | 5.881522 | SZ002293 | 罗莱生活 |
1188 | 13.861502 | 2.1982 | 6.305842 | SH603903 | 中持股份 |
2735 | 13.602489 | 2.1370 | 6.365226 | SZ002724 | 海洋王 |
839 | 13.490505 | 2.2816 | 5.912739 | SZ002757 | 南兴股份 |
3316 | 13.465657 | 2.1406 | 6.290599 | SH600285 | 羚锐制药 |
1537 | 13.423315 | 2.2254 | 6.031866 | SZ002142 | 宁波银行 |
3839 | 13.419236 | 2.2617 | 5.933252 | SZ300200 | 高盟新材 |
1284 | 13.336630 | 2.1476 | 6.210016 | SZ300599 | 雄塑科技 |
3711 | 13.293217 | 2.1671 | 6.134104 | SZ300735 | 光弘科技 |
966 | 13.239640 | 2.2333 | 5.928286 | SH603303 | 得邦照明 |
781 | 12.969642 | 2.2547 | 5.752269 | SH603041 | 美思德 |
1875 | 12.889160 | 2.1853 | 5.898119 | SZ300947 | 德必集团 |
1707 | 12.887115 | 2.3077 | 5.584398 | SZ002130 | 沃尔核材 |
1171 | 12.789784 | 2.3225 | 5.506904 | SH603681 | 永冠新材 |
1300 | 12.671041 | 2.1523 | 5.887209 | SH603081 | 大丰实业 |
1554 | 12.561061 | 2.3142 | 5.427820 | SZ300082 | 奥克股份 |
3233 | 12.455909 | 2.2047 | 5.649707 | SZ300547 | 川环科技 |
3349 | 12.443461 | 2.2642 | 5.495743 | SH603109 | 神驰机电 |
3399 | 12.378663 | 2.1111 | 5.863608 | SH603867 | 新化股份 |
3407 | 12.231600 | 2.2645 | 5.401457 | SH688228 | 开普云 |
3992 | 12.127870 | 2.2432 | 5.406504 | SZ002399 | 海普瑞 |
1528 | 11.823404 | 2.3228 | 5.090151 | SH603662 | 柯力传感 |
3922 | 11.823292 | 2.1393 | 5.526711 | SH601628 | 中国人寿 |
373 | 11.797143 | 2.2160 | 5.323620 | SH601388 | 怡球资源 |
2942 | 11.704367 | 2.2557 | 5.188796 | SZ300427 | 红相股份 |
3868 | 11.655137 | 2.1725 | 5.364850 | SZ000062 | 深圳华强 |
1633 | 11.528188 | 2.2158 | 5.202720 | SZ002373 | 千方科技 |
3569 | 11.489355 | 2.1143 | 5.434118 | SZ300692 | 中环环保 |
994 | 11.473076 | 2.1411 | 5.358496 | SH600233 | 圆通速递 |
720 | 11.331209 | 2.1750 | 5.209751 | SZ300580 | 贝斯特 |
3715 | 11.169045 | 2.1334 | 5.235326 | SH603898 | 好莱客 |
3144 | 10.964334 | 2.1365 | 5.131914 | SZ002498 | 汉缆股份 |
2128 | 10.780494 | 2.1949 | 4.911610 | SH600300 | 维维股份 |
1777 | 10.633779 | 2.2179 | 4.794526 | SH600295 | 鄂尔多斯 |
127 | 10.531628 | 2.1258 | 4.954195 | SZ300435 | 中泰股份 |
1740 | 10.284895 | 2.2248 | 4.622840 | SZ300440 | 运达科技 |
3684 | 10.221516 | 2.2197 | 4.604909 | SZ300594 | 朗进科技 |
☐说明
1、这里需要知道未来的 ROE,但实际上只有过去的数据,那么如何得到未来的值呢?根据已知的数据推测,如知道第一季度的数据,由它推测出整一年的数据。另外也需要弄清楚 ROE 是短期高呢还是能够长期保持高 ROE。这里简单起见,使用了滚动 ROE。
2、这里把所有股票放在一起了,实际上相同行业的股票才有可比性。可以收集感兴趣的同一行业或板块的股票,然后用 ROE-PB 分析、选择价值股。
3、另外,这里我们只使用了干巴巴的数字,实际上数字背后还有很多名堂需要去考虑。比如,这个 ROE 未来是否能保持呢?比如这里第一个股票,大家知道由于疫情的关系,这个股票去年的业绩是非亮眼,但是以后还能保持吗?或者说能保持多久?或者企业会不会趁机拓展相关业务呢?等等,值得去调查分析。如果对某些股票感兴趣,不妨去找找各家券商的研报。
☐聚类分析法
除了回归分析外,也可以使用聚类分析。该方法企图打破只选 PB 低估程度最大的选股方式,转而寻找受市场青睐的股票风格进行投资。
回归法假定 ROE-PB 坐标系中右下角的股票是最理想的投资标的,但实际上这部分股票的表现并非总是最优的。
不同区域代表了不同的股票风格,例如高 ROE、低 PB 区域以银行和周期股为主,高 ROE、高 PB 区域以消费板块为主,低 ROE、高 PB 区域以成长股为主等,每种区域的股票都有可能在一段时间内被市场青睐。
聚类法可以帮助我们将坐标系中的散点进行聚类,从而找出当前投资收益率最高的市场风格。
聚类法的原理示例如下图,这里代码略过,有兴趣可以在上面代码的基础上修改实现。
3PEG 策略
除了上面的 ROE-PB 策略,还有从市盈率和净利润增长率来估值的策略,即 PEG 策略。
这个策略也有来头,PEG(市盈率相对盈利增长比率)是 Jim Slater 发明的一个股票估值指标,在 PE(市盈率)估值的基础上发展起来的,它弥补了 PE 对企业动态成长性估计的不足。当时他在选股的时候就是选那些市盈率较低,同时它们的增长速度比较高的公司,这些公司有一个典型特点就是 PEG 会非常低。我们来看一下公式,
其中,
PE 着眼于股票的低风险,而 PEG 在考虎低风险的同时,又加入了未来成长性的因素,因此这个策略相比来说更全面地对新兴市场的股票进行估值,可以认为是对个股价值研判的一个有指导意义的策略。
由于 PEG 指标是以公司的市盈率比较公司的成长速度来衡量投资价值,所以我们在选股的时候就是要选那些市盈率与公司成长速度匹配的公司。简单说,低市盈率,如果成长性不足,也不能称之为好公司,反之,高市盈率,如果成长性充分,也可以是个好标的。
一般而言,PEG < 1 意味着企业进入投资价值区域(如果负值意味着亏损,则不考虑),简单说,PEG 越小企业投资价值越大。
PEG 策略的优点是将企业的当前价值和未来成长预期进行了结合,不用考虑单独的 PE 值的意义,而是需要对其未来的盈利增长率作出预测。
dfd = df.dropna()
data_peg = dfd[['净利润增长率','滚动市盈率']].astype(np.float64)
data_peg.columns = ['NPCAGR','PE']
data_peg['CODE'] = dfd['股票代码']
data_peg['NAME'] = dfd['股票名称']
data_peg['ROE'] = dfd['滚动净资产收益率']
data_peg['今年涨幅'] = dfd['今年涨幅']
def screen(data):
peg = data[data['NPCAGR']>0].copy()
peg['PEG'] = peg['PE']/peg['NPCAGR']
return peg
peg = screen(data_peg)
# 按 PEG 从大到小排列
peg_sort = peg.sort_values(by='PEG', ascending=True)
peg_sort
NPCAGR | PE | CODE | NAME | ROE | 今年涨幅 | PEG | |
---|---|---|---|---|---|---|---|
2505 | 597.059201 | 7.047 | SZ002157 | 正邦科技 | 61.383860 | -6.22 | 0.011803 |
859 | 677.679190 | 8.388 | SH600685 | 中船防务 | 33.642009 | -11.96 | 0.012378 |
1205 | 213.767332 | 2.654 | SZ002582 | 好想你 | 51.480165 | -8.78 | 0.012415 |
1413 | 334.500397 | 6.375 | SZ300552 | 万集科技 | 84.092639 | -15.29 | 0.019058 |
2542 | 349.125287 | 6.995 | SZ002124 | 天邦股份 | 54.272566 | 6.23 | 0.020036 |
2699 | 205.158905 | 5.923 | SH603301 | 振德医疗 | 90.912636 | -9.96 | 0.028870 |
... | ... | ... | ... | ... | ... | ... | ... |
1676 | 17.113186 | 10.733 | SH601318 | 中国平安 | 19.934096 | -3.40 | 0.627177 |
1703 | 15.562978 | 47.415 | SZ002253 | 川大智胜 | 4.398328 | -8.15 | 3.046653 |
我们可以看到中国平安的净利润增长率为 17.113186,这个值其实我们也可以自己计算,前提就是得知道它前几年的净利润数据。
我们按 2020 年、2019 年、2018 年、 2017 年四年的净利润来算,可以得出 G 值。
np.power(1431.0/890.9,1/3)-1
0.1711258260190378
当然,这个算法是拿过去的数据来简单预测将来,当然也可以多用几年,如我们按 2020 年、2019 年、2018 年、2017 年以及 2016 年五年的净利润来算,也可以得出一个 G 值。
np.power(1431.0/623.9,1/4)-1
0.23064038253781982
那么这么算得出的这个 G 值靠谱吗?有没有更好地近似计算方法呢。你想,这件事本身挺复杂的,一个公司往往在发展成长中的,怎么变化我们并没有考虑进来,例如期间净资产发生了变化,对增长率的计算肯定是有很大影响的。所以说,上面这样计算可以说是一种相当简化的办法了。
上面公式中的动态市盈率怎么计算呢?
市盈率是静态、动态和滚动三种计算方式。静态不考虑未来,动态纯粹是预测,而滾动结合了静态和动态的利弊,但是预测准不准谁也不知道。上面代码里我们使用了滚动市盈率。也许动态的市盈率更符合对未来的预测,但预测一个公司的净利润恐怕不是我们普通投资者能把握的,那我们可以去看各个证券公司的研报。
此外由于行业的区别,不同行业的市盈率一般差异较大,而 PEG 指标可以消除这一影响,对不同行业的个股价值进行相对对比。不过需要注意的是,这个策略最关键的还是对公司业绩的预期。
另外,也可以直接打开东方财富网中的下面这个网页查看各个股票的 PEG 估值。
☐注意
参考文献
涨跌云图: http://summary.jrj.com.cn/dpyt/
[2]baostock: http://baostock.com/baostock/index.php/Python_API%E6%96%87%E6%A1%A3
[3]tushare: http://tushare.org/
[4]https://zhuanlan.zhihu.com/p/350900240
[5]https://www.ko123.com/gupiaojingyan/f12862.html
[6]https://xueqiu.com/6882170213/149115035