评估一只票当前股价是否合理,应结合其历史合理PE与当前PE的位置关系来参考评价
例如茅台上了1000元,而其PE还没有18年高
1、纯属研究自用,非关键代码未做优化,也没有修改成函数,股票代码和时间段自己调即可
2、聚宽获取PE的函数个人觉得较麻烦,故计算量较大,测试了一下,查4年(约1000个交易日)时长,用Numpy的ndarry库,比Panda的DataFrame要快1秒左右(大约耗时10秒)
3、曲线图只画了自己感兴趣的PE(ttm)、价格、PE三条线。3条曲线没放一张图里是觉得y轴标尺混在一起会把某条线弄得比较平,曲线的波动效果不好
4、此曲线图对蓝筹白马股有较大参考意义,对小票意义不大个人见解
图例是贵州茅台9年多(2300多个交易日)的示例图
#绘制一只票的起止时间段内的PE曲线图import pandas as pdimport numpy as npimport datetimeimport matplotlib.pyplot as pltfrom jqdata import *ta=int(round(time.time() * 1000))#设置基本变量sec='600519'start_date='2010-01-01'end_date='2019-07-16'out='PE_TTM'if sec[0:2]=='60':ns=sec+'.XSHG'else:ns=sec+'.XSHE'#起止日期间的有效交易日idx_days(数据类型:ndarray)idx_days=get_trade_days(start_date,end_date)lndays=len(idx_days)np2=np.zeros((lndays,4))np3=np.column_stack((np2,idx_days))#查询语句PE(TTM)、PE、PB、PSq=query( valuation.pe_ratio,valuation.pe_ratio_lyr,valuation.pb_ratio,valuation.ps_ratio).filter( valuation.code==ns)#把每个交易日的PE、PB按照日期填充进np3n=0while (n<lndays):np3[n,0:4]=get_fundamentals(q,idx_days[n]).iloc[0].tolist()n=n+1plt.figure(figsize=(18,20))#PE曲线图plt.subplot(311)plt.grid()plt.title(get_security_info(ns).display_name+'('+sec+')',fontsize = 18)plt.ylabel(out,fontsize=16)#x轴:日期#y轴:np[:,m] m=0(PE_ttm)、1(PE)、2(PB)、3(PS)plt.plot(np3[:,4],np3[:,0])#价格曲线图plt.subplot(312)plt.grid()dfp=get_price(ns,start_date,end_date,frequency='daily',skip_paused=True)plt.xlabel('DATA['+start_date+' 至 '+end_date+' / '+str(lndays)+'个交易日]',fontsize=14)plt.ylabel('Price',fontsize=16)plt.plot(dfp.index,dfp['close'],color='red')#PE曲线图plt.subplot(313)plt.grid()plt.ylabel('PE',fontsize=16)plt.plot(np3[:,4],np3[:,1])#运行用时tb=int(round(time.time() * 1000))print('*erage PPE(ttm):'+str(round(np3[:,0].mean(),2)))print('用时(ns):'+str(tb-ta))
*erage PPE(ttm):24.09
用时(ns):15886