【Python代码】全市场估值-等权PE PB

感谢,转载自:https://www.joinquant.com/community/post/detailMobile?postId=1058&page=&limit=20&replyId=&tag=

感谢cjhren在他的基础上增加了等权PB。目前等权PBPE都全了。
目前市场大部分还在高位,只有大蓝筹便宜。

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import bisect

#指定日期的指数PE(等权重)
def get_index_pe_date(index_code,date):
    stocks = get_index_stocks(index_code, date)
    q = query(valuation).filter(valuation.code.in_(stocks))
    df = get_fundamentals(q, date)
    if len(df)>0:
        pe = len(df)/sum([1/p if p>0 else 0 for p in df.pe_ratio])
        return pe
    else:
        return float('NaN')

#指定日期的指数PB(等权重)
def get_index_pb_date(index_code,date):
    stocks = get_index_stocks(index_code, date)
    q = query(valuation).filter(valuation.code.in_(stocks))
    df = get_fundamentals(q, date)
    if len(df)>0:
        pb = len(df)/sum([1/p if p>0 else 0 for p in df.pb_ratio])
        return pb
    else:
        return float('NaN')
    
#指数历史PEPB
def get_index_pe_pb(index_code):
    start='2005-1-1'
    #start='2015-1-1'
    end = pd.datetime.today();
    dates=[]
    pes=[]
    pbs=[]
    for d in pd.date_range(start,end,freq='M'): #频率为月
        dates.append(d)
        pes.append(get_index_pe_date(index_code,d))
        pbs.append(get_index_pb_date(index_code,d))
    d = {'PE' : pd.Series(pes, index=dates),
            'PB' : pd.Series(pbs, index=dates)}
    PB_PE = pd.DataFrame(d)
    return PB_PE


all_index = get_all_securities(['index'])
index_choose =['000016.XSHG',                        
                         '000300.XSHG',
                         '000902.XSHG',
                         '000905.XSHG',
                         '399106.XSHE',               
                         '399316.XSHE',
               
                        '000036.XSHG',
                        '000037.XSHG',
                        '000038.XSHG',
                        '000039.XSHG',
                        '000158.XSHG'
                        ]
df_pe_pb = pd.DataFrame()
frames=pd.DataFrame()
today= pd.datetime.today()
for code in index_choose:
    index_name = all_index.ix[code].display_name  
    print u'正在处理: ',index_name   
    df_pe_pb=get_index_pe_pb(code)    

    
    
    
    
    results=[]
    pe = get_index_pe_date(code,today)
    q_pes = [df_pe_pb['PE'].quantile(i/10.0)  for i in range(11)]    
    idx = bisect.bisect(q_pes,pe)
    quantile = idx-(q_pes[idx]-pe)/(q_pes[idx]-q_pes[idx-1])   
    #index_name = all_index.ix[code].display_name
    results.append([index_name,'%.2f'% pe,'%.2f'% (quantile*10)]+['%.2f'%q  for q in q_pes]+[df_pe_pb['PE'].count()])
    
    pb = get_index_pb_date(code,today)
    q_pbs = [df_pe_pb['PB'].quantile(i/10.0)  for i in range(11)] 
    idx = bisect.bisect(q_pbs,pb)
    quantile = idx-(q_pbs[idx]-pb)/(q_pbs[idx]-q_pbs[idx-1])   
    #index_name = all_index.ix[code].display_name
    results.append([index_name,'%.2f'% pb,'%.2f'% (quantile*10)]+['%.2f'%q  for q in q_pbs]+[df_pe_pb['PB'].count()])
    
    
    df_pe_pb['10% PE']=q_pes[1]
    df_pe_pb['50% PE']=q_pes[5]
    df_pe_pb['90% PE']=q_pes[9]
    df_pe_pb['10% PB']=q_pbs[1]
    df_pe_pb['50% PB']=q_pbs[5]
    df_pe_pb['90% PB']=q_pbs[9]

    df_pe_pb.plot(secondary_y=['PB','10% PB','50% PB','90% PB'],figsize=(14,8),title=index_name,style=['k-.', 'k', 'g', 'y', 'r', 'g-.', 'y-.', 'r-.']) 
    columns=[u'名称',u'当前估值',u'分位点%',u'最小估值']+['%d%%'% (i*10) for i in range(1,10)]+[u'最大估值' , u"数据个数"]
    df= pd.DataFrame(data=results,index=['PE','PB'],columns=columns)
    frames = pd.concat([frames, df])
frames  
 
正在处理:  上证50
正在处理:  沪深300
正在处理:  中证流通
正在处理:  中证500
正在处理:  深证综指
正在处理:  巨潮小盘
正在处理:  上证消费
正在处理:  上证医药
正在处理:  上证金融
正在处理:  上证信息
正在处理:  上证环保
Out[8]:
 名称当前估值分位点%最小估值10%20%30%40%50%60%70%80%90%最大估值数据个数
PE上证5011.3117.999.7910.5911.4912.4913.9615.0316.0617.8224.8632.6547.33135
PB上证501.428.441.301.441.581.701.801.932.102.302.723.756.57135
PE沪深30020.2246.2812.1115.8916.7017.4618.7521.0822.8524.5032.0041.0554.96132
PB沪深3002.1144.441.331.531.721.862.012.242.602.813.173.926.80132
PE中证流通52.8976.559.3922.4527.8330.6632.1335.6840.3746.4656.2864.3677.09130
PB中证流通3.5668.251.451.842.122.262.442.953.313.623.974.405.76130
PE中证50039.6260.0717.3625.0927.0028.3231.0835.5239.5746.4154.1962.2672.21111
PB中证5002.8550.841.321.972.082.212.532.823.133.393.594.005.03111
PE深证综指63.9786.9117.4728.1831.3234.1637.6740.7147.0451.8758.7566.3192.41135
PB深证综指4.1875.351.431.762.222.402.563.003.503.964.364.946.38135
PE巨潮小盘46.3064.7818.6430.2531.6932.9235.1540.7043.7549.0956.7471.0986.67134
PB巨潮小盘3.1866.191.341.642.032.232.382.622.943.333.664.055.32134
PE上证消费32.5135.3923.7727.3929.3331.2533.5935.4939.0851.5957.6172.2378.0387
PB上证消费3.3039.092.452.732.953.103.323.473.754.214.645.025.7987
PE上证医药39.0186.3922.4527.5730.1331.9032.6333.5834.3335.0236.7540.2859.9487
PB上证医药3.8858.832.923.193.413.493.613.773.904.424.795.366.2287
PE上证金融9.0430.127.307.718.479.0210.0310.7211.8414.0015.0122.9132.2387
PB上证金融1.3928.231.081.181.271.411.511.611.752.022.332.934.0587
PE上证信息59.3165.3026.6533.7736.4743.2848.8854.0257.5060.9068.3580.31101.2387
PB上证信息5.4290.371.892.292.683.123.273.714.024.404.755.308.5487
PE上证环保32.2925.0227.0330.3131.4433.1333.5134.3535.3736.8240.1944.6854.8543
PB上证环保3.1170.971.902.172.352.412.462.622.913.083.373.844.9743
 
 
 
 
 
 
 
 
 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值