中国股市历史价格理性的简单探讨

由:sddy008 发布于:2022-09-30 分类:股票知识 阅读:103 评论:0

通过本专栏前面数期的讨论,一个基于上市公司定期报告业绩数据的股权价值计算体系已经基本成型,本期我们利用该体系对中国股市历史价格理性程度做一个简单的分析。我们可以按市场某年各证券历史价格在此后数年的业绩数据模型的兑现程度(价格证实程度)来衡量该年市场的价格理性。以下是进行该计算的示例代码:

Author: YE KAIWEN
 Copyright (c) 2022 YE KAIWEN. All Rights Reserved.

import pandas as pd
import numpy as np
import datetime
import valuequant as vq
import matplotlib.pyplot as plt

循环证券列表获取各证券历史价格兑现率数据
def stocklistloop():
    vq.login(,<账号密码>)valuequant账号可登陆www.boomevolve.com注册
    stocklist=<获取证券列表信息的函数>
    for inx,row in stocklist.iterrows():
        getstockhistory(row[<六位证券代码字段>],row[<证券上市日期字段>])

获取某证券各历史报告期模型下的历史价格兑现率数据
def getstockhistory(stockcode,listdate):
    dateinx=pd.date_range(start=max(pd.to_datetime(listdate),pd.to_datetime(2006-01-01)),end=pd.to_datetime(datetime.datetime.now()),freq=A-DEC).strftime(%Y-%m-%d)
    for item in dateinx:
        以移动平均严格状态更新模型证券时间序列集分析模板框架为例建立模型
        modelset=vq.StockFrameSets.ma_strict_latest_status_frameset(stockcode=stockcode,reportdate=item,mawindow=4,minstep=8,seasonal=True,conservative=True)
        if hasattr(modelset,_modelset):
            try:
                分别计算贴现率为3%,6%,9%的兑现率数据
                acrdata=pd.DataFrame()
                acrdata[acr3]=modelset.batchachieverate_trade(dimension=综合收益总额,pricemode=close,startdate=listdate,enddate=item,r=0.03)
                acrdata[acr6]=modelset.batchachieverate_trade(dimension=综合收益总额,pricemode=close,startdate=listdate,enddate=item,r=0.06)
                acrdata[acr9]=modelset.batchachieverate_trade(dimension=综合收益总额, pricemode=close, startdate=listdate,enddate=item,r=0.09)
                acrdata.to_csv(<存储路径>)
                print(stockcode,报告,item,已计算)
            except Exception as e:
                print(stockcode,报告,item,acr计算出错,e)
        else:
            print(stockcode, 报告, item, 模型未计算)

获取某年市场各证券年平均价格在此后第N年业绩模型的兑现率
def getmarketpriceacr(priceyear,pvgap):
    pvyear=priceyear+pvgap
    reportdate=str(pvyear)+-12-31
    marketstart=str(priceyear)+-01-01
    marketend=str(priceyear)+-12-31
    acrstats=pd.DataFrame()
    stocklist=<获取证券列表信息的函数>
    for inx, row in stocklist.iterrows():
        if (pd.to_datetime(marketend)>=pd.to_datetime(row[<证券上市日期字段>])):
            try:
                df=pd.read_csv(<某证券reportdate报告期的兑现率数据存储路径>,index_col=[0])
                df.index=pd.to_datetime(df.index)
                df=df.sort_index(ascending=True)
                if len(df.loc[marketstart:marketend])>0:
                    yearacr=df.loc[marketstart:marketend].mean()
                    yearacr.name=row[stockcode]
                    acrstats=acrstats.append(yearacr)
            except Exception as e:
                pass
    acrstats.to_csv(<存储路径>)
    print(价格%s现值%s已统计 % (str(priceyear), str(pvyear)))

循环统计市场各年各证券年平均价格在此后各年业绩模型的兑现率
def statisticsloop():
    for priceyear in range(2000,2022):
        for pvgap in range(max(0,2007-priceyear),min(10,2021-priceyear)+1):
            getmarketpriceacr(priceyear,pvgap)

计算对市场证券某年平均价格在此N年后业绩模型的兑现率数据进行区间统计
def histstatistics(priceyear,pvgap):
    pvyear=priceyear+pvgap
    df=pd.read_csv(,index_col=[0])
    bins=[(-oo,0),[0,0.5),[0.5,1),[1,5),[5,10),[10,oo)]
    histdata=pd.DataFrame(index=bins,columns=df.columns)
    for col in df.columns:
        histdata.loc[(-oo,0),col]=df[col][df[col]<0].count()
        histdata.loc[[0,0.5), col] = df[col][(df[col]>=0)&(df[col]<0.5)].count()
        histdata.loc[[0.5,1), col] = df[col][(df[col] >=0.5) & (df[col] <1)].count()
        histdata.loc[[1,5), col] = df[col][(df[col] >= 1) & (df[col] < 5)].count()
        histdata.loc[[5,10), col] = df[col][(df[col] >= 5) & (df[col] < 10)].count()
        histdata.loc[[10,oo), col] = df[col][(df[col] >= 10)].count()
    return histdata

循环计算存储histstatistics
def histloop():
    for priceyear in range(2000,2022):
        for pvgap in range(max(0,2007-priceyear),min(10,2021-priceyear)+1):
            histdata=histstatistics(priceyear,pvgap)
            pvyear = priceyear + pvgap
            histdata.to_csv(<存储路径>)

histdata的可视化图表分析
def histvisual(priceyear,pvgap):
    pvyear = priceyear + pvgap
    path=
    df=pd.read_csv(path,index_col=[0])
    rdf=df/(df.sum())
    x=np.arange(len(df))
    plt.cla()
    plt.grid(linestyle=:)
    for colnum in [3,6,9]:
        col=acr+str(colnum)
        plt.bar(x=x+colnum/12-1/2,height=df[col],width=1/4)
        for i in x:
            plt.text(i + 1.8*(colnum / 12 - 5 / 8), df[col].iloc[i],str(int(np.round(rdf[col].iloc[i], 2) * 100)) + %, fontsize=8)
    plt.xticks(x,df.index)
    if pvgap>0:
        plt.title(str(priceyear)+年平均价格+str(pvgap)+年后业绩模型的兑现率)
    else:
        plt.title(str(priceyear) + 年平均价格当年后业绩模型的兑现率)
    plt.show()

按上述代码获取的历年价格的模型兑现信息,我们取2009年价格在当年、此后第5年(2014年)、此后第10年(2019年)年底业绩模型的兑现率区间统计数据,2014年价格在当年、此后第5年(2019年)的兑现率区间统计数据,以及2019年当年的兑现率区间统计数据,进行图示讨论,其中蓝、橙、绿分别是贴现率为3%、6%、9%时的数据。

分析以上示例图表发现,市场历年价格在此后数年的业绩模型的兑现率的区间分布有着相似的形态。存在盈利危机(即兑现率小于0)的公司占比基本在20%~30%之间,意味着市场对业绩难以取信的公司有一定的容忍度。只有在贴现率处于较低的3%水平时,有较可观比例(40%~50%)公司的业绩模型能够兑现历史价格,即兑现率不小于1。而我们也可以参照现在的银行利率做一个粗略的参考,比如2022年2月21日的5年LPR是4.6%,意味着市场上多数具有较高风险的股权资产的内部收益率背书尚不如银行长期贷款利率(严谨的分析应当使用对应各年的利率基准进行贴现分析)。观察同年价格数年后业绩模型的兑现率情况,各年的分布变化不会有太大的差异;历史上被高估的公司能够通过后期业绩兑现当年市场狂热的情况很少出现。然而,市场长期以来并没有修正上述现象,基本上是处于一种脱离真实价值的非理性状态。

相关阅读

评论

精彩评论