您的位置:首页 > 其它

不同行业的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收益之差

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: