不同行业的PE&PB动态选股策略比较分析
2017-03-27 22:48
393 查看
财务数据用来反应公司价值(理论上),也是预测股价的根据之一。此文根据市盈率和市净率两个指标在不同行业内进行动态选股,从而比较市盈率&市净率选股对不同行业的敏感性。
下面介绍下基本的原理。
1.市盈率&市净率的定义
市盈率(Price earnings ratio,即P/E ratio)也称“本益比”、“股价收益比率”或“市价盈利比率(简称市盈率)”。市盈率是最常用来评估股价水平是否合理的指标之一,由股价除以年度每股盈余(EPS)得出(以公司市值除以年度股东应占溢利亦可得出相同结果)。计算时,股价通常取最新收盘价,而EPS方面,若按已公布的上年度EPS计算,称为历史市盈率(historical P/E);计算预估市盈率所用的EPS预估值,一般采用市场平均预估(consensus estimates),即追踪公司业绩的机构收集多位分析师的预测所得到的预估平均值或中值。何谓合理的市盈率没有一定的准则。
市盈率是某种股票每股市价与每股盈利的比率。市场广泛谈及市盈率通常指的是静态市盈率,通常用来作为比较不同价格的股票是否被高估或者低估的指标。用市盈率衡量一家公司股票的质地时,并非总是准确的。一般认为,如果一家公司股票的市盈率过高,那么该股票的价格具有泡沫,价值被高估。当一家公司增长迅速以及未来的业绩增长非常看好时,利用市盈率比较不同股票的投资价值时,这些股票必须属于同一个行业,因为此时公司的每股收益比较接近,相互比较才有效。
市盈率是很具参考价值的股市指针,一方面,投资者亦往往不认为严格按照会计准则计算得出的盈利数字真实反映公司在持续经营基础上的获利能力,因此,分析师往往自行对公司正式公布的净利加以调整。
市净率指的是每股股价与每股净资产的比率。 市净率可用于投资分析,一般来说市净率较低的股票,投资价值较高,相反,则投资价值较低;但在判断投资价值时还要考虑当时的市场环境以及公司经营情况、盈利能力等因素。
2.选股原理和方式
根据市盈率的定义不难看出,市盈率越低的企业盈利能力越强,相对于股价是个利好,所以选择持有。从市净率来看,市净率越低,单位股价代表资产越多,越具有投资价值,选择持有。
于是确定好某一行业之后,每天对市盈率和市净率进行比较,首先选出市盈率低于平均水平的股票,然后在已经选出的股票中选出市净率低于平均水平的股票选择持有。卖出持有股票中不符合持有条件的股票,对于符合条件但是已经持有的股票,不再加仓。
3.程序实现
a.初始化设置,比如设置好benchmark、初始化持有股票池
b.每天开盘前对股票池进行更新,获取要买入得股票
c.剔出停牌的股票,分别得到买入卖出股票池
d.卖出股票,包含被选取的benchmark剔除的股票
e.买入股票
f.停盘后更新持有股票池
4.结果展示
I1:中证消费
I2:中证金融
I3:所有银行
ps:自定义曲线是策略收益与benchmark收益之差
下面介绍下基本的原理。
1.市盈率&市净率的定义
市盈率(Price earnings ratio,即P/E ratio)也称“本益比”、“股价收益比率”或“市价盈利比率(简称市盈率)”。市盈率是最常用来评估股价水平是否合理的指标之一,由股价除以年度每股盈余(EPS)得出(以公司市值除以年度股东应占溢利亦可得出相同结果)。计算时,股价通常取最新收盘价,而EPS方面,若按已公布的上年度EPS计算,称为历史市盈率(historical P/E);计算预估市盈率所用的EPS预估值,一般采用市场平均预估(consensus estimates),即追踪公司业绩的机构收集多位分析师的预测所得到的预估平均值或中值。何谓合理的市盈率没有一定的准则。
市盈率是某种股票每股市价与每股盈利的比率。市场广泛谈及市盈率通常指的是静态市盈率,通常用来作为比较不同价格的股票是否被高估或者低估的指标。用市盈率衡量一家公司股票的质地时,并非总是准确的。一般认为,如果一家公司股票的市盈率过高,那么该股票的价格具有泡沫,价值被高估。当一家公司增长迅速以及未来的业绩增长非常看好时,利用市盈率比较不同股票的投资价值时,这些股票必须属于同一个行业,因为此时公司的每股收益比较接近,相互比较才有效。
市盈率是很具参考价值的股市指针,一方面,投资者亦往往不认为严格按照会计准则计算得出的盈利数字真实反映公司在持续经营基础上的获利能力,因此,分析师往往自行对公司正式公布的净利加以调整。
市净率指的是每股股价与每股净资产的比率。 市净率可用于投资分析,一般来说市净率较低的股票,投资价值较高,相反,则投资价值较低;但在判断投资价值时还要考虑当时的市场环境以及公司经营情况、盈利能力等因素。
2.选股原理和方式
根据市盈率的定义不难看出,市盈率越低的企业盈利能力越强,相对于股价是个利好,所以选择持有。从市净率来看,市净率越低,单位股价代表资产越多,越具有投资价值,选择持有。
于是确定好某一行业之后,每天对市盈率和市净率进行比较,首先选出市盈率低于平均水平的股票,然后在已经选出的股票中选出市净率低于平均水平的股票选择持有。卖出持有股票中不符合持有条件的股票,对于符合条件但是已经持有的股票,不再加仓。
3.程序实现
a.初始化设置,比如设置好benchmark、初始化持有股票池
b.每天开盘前对股票池进行更新,获取要买入得股票
c.剔出停牌的股票,分别得到买入卖出股票池
d.卖出股票,包含被选取的benchmark剔除的股票
e.买入股票
f.停盘后更新持有股票池
4.结果展示
I1:中证消费
I2:中证金融
I3:所有银行
ps:自定义曲线是策略收益与benchmark收益之差
import pandas as pd import numpy as np from pandas import Series,DataFrame benchmark='000300.XSHG' set_benchmark(benchmark) #建立全局变量存储benchmark第一天价格 g.initial_price=0 #建立全局变量来判断是否为第一天 g.day=1 #全局变量存储持有股票 g.stocks_hold=[] #每日开盘前运行 #设定参数,PE,PB分位数 g.pe=0.5 g.pb=0.5 #止损 g.loss=0.93 def before_trading_start(context): #得到所有银行股 #g.stocks=get_all_securities() #g.stocks=[code].upper().endswith('银行')] g.stocks=get_index_stocks('000935.XSHG') set_universe(g.stocks) #得到low PE&PB 股票 if g.stocks: g.df = get_fundamentals( query( valuation.code,valuation.pe_ratio,valuation.pb_ratio ).filter( valuation.code.in_(g.stocks) ).order_by( valuation.pe_ratio.asc() )) #获取低于平均市盈率的股票 #获取低于平均市净率的股票 #g.df.dropna() #g.df = g.df[g.df.pe_ratio < 100] g.df[g.df.pe_ratio < 0]['pe_ratio']=1000 #print "g.df, %s" % g.df g.df=g.df[g.df.pe_ratio<g.df.pe_ratio.quantile(g.pe)] g.df=g.df[g.df.pb_ratio<g.df.pb_ratio.quantile(g.pb)] #print "after g.df, %s" % g.df g.df_tobuy=g.df #获取不停牌的股票 def unpaused(stockspool,data): current_data=get_current_data() return [s for s in stockspool if not current_data[s].paused] def handle_data(context,data): current_data=get_current_data() #获取第一天价格 if g.day==1: g.initial_price=attribute_history(benchmark, 1, unit='1d', fields=('close'),skip_paused=True, df=False)['close'][0] g.day=g.day+1 #获取当前天价格 current_price=attribute_history(benchmark, 1, unit='1d', fields=('close'),skip_paused=True, df=False)['close'][0] #获取待买待卖股票池 stocks_tobuy=list(set(g.df_tobuy.code)-set(g.stocks_hold)) stocks_tosell=list(set(g.stocks_hold)-set(g.df_tobuy.code)) stocks_tobuy=unpaused(stocks_tobuy,data) stocks_tosell=unpaused(stocks_tosell,data) # print "buy: %s , sell: %s" %(stocks_tobuy, stocks_tosell) num_tobuy=len(stocks_tobuy) #卖出股票 for s in stocks_tosell: order_target(s, 0) #买入股票 if num_tobuy>0: cash=context.portfolio.cash/num_tobuy if cash>0: for s in stocks_tobuy: order_target_value(s,cash) for stock in context.portfolio.positions: p = context.portfolio.positions[stock] if p.price/p.avg_cost <= g.loss: order_target(stock,0) #记录投资组合收益与benchmark收益之差 yy=context.portfolio.returns benchmark_yy=(current_price-g.initial_price)/g.initial_price spread=yy-benchmark_yy record(spread=spread) def after_trading_end(context): g.stocks_hold=context.portfolio.positions.keys()
相关文章推荐
- 人民币升值对不同行业影响的比较分析
- "陷阱"技术探秘──动态汉化Windows技术的分析
- 插件系统[8]·系统组装策略分析
- 不同数据整合方案的比较分析
- 35种基于比较的内部排序算法的动态图示分析和演示 推荐
- 增加 addDataScheme("file") 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略
- OOAD&UML_OOAD概述_UML_OO设计原则_OO设计模式_分析阶段静态建模_分析阶段动态建模_设计阶段静态建模_设计阶段动态建模
- [DEV] "陷阱"技术探秘 ──动态汉化Windows技术的分析
- (转)poll, select & epoll 原理比较分析
- 主流嵌入式Linux动态扩展技术比较分析
- poll, select & epoll 原理比较分析
- "陷阱"技术探秘 ──动态汉化Windows技术的分析
- 插件系统[8]·系统组装策略分析
- 插件系统[8]·系统组装策略分析
- 彼得林奇持股分析与选股策略研究
- C/C++面试之算法系列--从"反转32 位数"算法题分析面试策略
- 插件系统[8]·系统组装策略分析
- 异常流量分析&amp;响应系统与类似产品技术的比较
- 主流嵌入式Linux动态扩展技术比较分析
- .Net中cookie读写方法介绍 & 两个Cookie类的分析与比较