著名的Graham公式:
![][equtation]
[equtation]: http://latex.codecogs.com/svg.latex?\sqrt{22.5(EarningPerShare)(BookValuePer~Share)}
据说巴菲特早期就是用这个公式选股的,至于赚不赚不知道。
插句话,想起小时候我爸炒股的时候,就是还有深发展的那个时代,电视上就有人在讲巴菲特怎么买可口可乐的,记忆最深的是那人吹“美国宪法都有修正案,但可口可乐的配方不能改”(实际上也改过)。最近也看了看被抓大佬徐翔的报道。
我的大致感受是,其实这种人买股票对小资金的参考意义不大。巴菲特建仓某个股票可以直接换掉公司管理层;徐翔炒股也靠内幕消息可以赌重大利好。我能干嘛?写代码跑回测找bug。
不说了上代码(ricequant):
import pandas as pd
import numpy as np
import datetime
import math
def init(context):
scheduler.run_monthly(rebalance,8)
#按月调仓,每月第八个交易日
def handle_bar(context, bar_dict):
pass
def before_trading(context):
num_stocks = 10
#删选股票
fundamental_df = get_fundamentals(
query(
fundamentals.eod_derivative_indicator.pb_ratio,
fundamentals.eod_derivative_indicator.pe_ratio,
fundamentals.financial_indicator.inc_earnings_per_share,
fundamentals.financial_indicator.inc_profit_before_tax,
fundamentals.financial_indicator.quick_ratio,
fundamentals.financial_indicator.earnings_per_share,
fundamentals.financial_indicator.book_value_per_share,
)
.filter(
fundamentals.eod_derivative_indicator.pe_ratio<15
)
.filter(
fundamentals.eod_derivative_indicator.pb_ratio<1.5
)
.filter(
fundamentals.financial_indicator.inc_earnings_per_share>0
)
.filter(
fundamentals.financial_indicator.inc_profit_before_tax>0
)
.filter(
fundamentals.financial_indicator.current_ratio>2
)
.filter(
fundamentals.financial_indicator.quick_ratio>1
)
.order_by(
fundamentals.eod_derivative_indicator.market_cap.desc()
).limit(
num_stocks
)
)
context.fundamental_df = fundamental_df
context.stocks = context.fundamental_df.columns.values
def rebalance(context,bar_dict):
#调仓
for stock in context.portfolio.positions:
if stock not in context.fundamental_df:
order_target_percent(stock, 0)
#仓中不符合条件的股票全部卖出
weight = update_weights(context, context.stocks)
for stock in context.fundamental_df:
if weight != 0 and stock in context.fundamental_df:
order_target_percent(stock,weight)
#新选进来的股票按比例建仓
def update_weights(context,stocks):
if len(stocks) == 0:
return 0
else:
weight = .95/len(stocks)
return weight
回测结果如下:
发现四年间的收益还是很不错的,但是最大回撤有些受不了。
同样我测了一下16年初到现在的情况:
发现在15、16年上半年,出现了很长时间的空仓,筛不出来符合条件的股票,当然我们也可以买国债。但我们也可以修正一下参数,毕竟pe<15和pb<1.5或许只是符合七十年代的美股。
如果我们把参数改到了20和1.8:
被现实打了脸,还不如原来的。
原来15、16空仓期的确很危险!
反思
回到策略,这个公式的大致思路是还是只买便宜的,可以认为是一种非常保守的价投策略。由上一篇文章我们可以知道,单纯的市盈率因子是很有问题的,那么结合了PB之后的Graham呢?看看知乎大神是怎么说的。我们挑选两个看上去比较有价值的回答粘在这里。
@leon:
P/E只是一种估值方式,重点不在倍率本身,而在和同业的P/E比较、和公司历史上的P/E比较,行业景气度。在内地股市,行业龙头的估值相对低廉,反映市场投机倾向明显,小盘股的机构投资者占比相对少,波动大,久而久之估值也较高。
市盈率长期处于低位暗示着较大的discount,恰恰说明存在不少负面因素。我举几个例子银行:低P/E+低P/B反映投资人对地产泡沫,透明度(港股投资人担忧中央政府不按套路出牌),SOE性质(没有约束机制,完全可以忽视中小投资人利益),不成熟的金融系统,企业治理,过速扩张导致资产质量下滑,互联网金融等的诸多担心。资源:资源价格的超级下降周期仍未结束,环保议题削弱需求预期。地产:分歧加大,退化成低成长性行业,商业地产应使用NAV估值。家电:普及期结束,更换周期变长,即便挖掘新功能仍伴随单价下降,投资人的兴趣下降。高速公路:非常稳定,应使用DCF法估值。
@冯迅(果仁老板):
很多人认为市盈率越低,股票越便宜,股票越安全,未来收益会越好。这个观点在A股是否适用,做一些量化分析很容易验证。我的分析方法是将2千多只A股按照PE由小到大排名, PE越小的股票得分越高,并按照排名的先后分成10个排名段,每个排名段大约有2百只股票,然后计算每个股票排名段的年化收益(假设股票在排名段中是等权重), 再比较各个排名段的收益。回测区间从2011年8月3日开始到2016年8月3日。 每隔20 个交易日,对所有股票重新排名,调整排名分段中的股票。在下图中,最右面90-100分段里的股票PE最小也就是最便宜的股票,最左面0-10分段里的股票PE最大或者干脆就是负数,也就是投机最强的股票。最左面的红色柱子是沪深300在过去五年的年化收益, 蓝色柱子是各个PE分段在过去5年的年化收益。比较蓝色柱子的收益,我们可以看出PE最小的股票的收益率并不是最好的,收益最好是得分80-90分段的股票,也就是PE较小但不是最小的股票。而PE最大股票收益是最差的。(细心的朋友会观察到所有股票分段的收益都超过红色的沪深300收益,这里面的原因,是大盘股在过去5年的收益远不如小盘股。)
所以一个简单的结论是我们应该回避PE最高的股票, 但是买PE最低的股票并不能给我们带来特好的收益。但是如果我们把投资域限制在沪深300内,则会见到完全不一样的图形。沪深300的市盈率和市净率分段收益我将沪深300按PE排名分成10段,每段大约30只股票。在下图中,最左面90-100分段里的股票PE最小,最右面0-10分段里的股票PE最大。
我们可以看到沪深300中PE最小的股票(最右面分段)的收益率最高,而PE最高分段的收益率最低,在过去4年为负数。 这确实印证了市盈率越低越有投资价值的观点。沪深300大都是成熟的股票, 对于成熟的股票,选股使用PE这样的基本面指标更靠谱些。最后的结论是投资者应回避PE最高的或者是盈利是负数的股票。投资沪深300,选取PE小的股票会的得到更好的收益, 而投资一般的A股, PE最小的股票不一定最有优势。
我个人的看法:
Graham策略在长期来看能保证在25%左右的年收益率,如果在价值投资的角度来看,其实已经是一种堪用的策略,但回撤基本和大盘保持一致,或者说容灾能力不够强,遇上大跌会被客户按在车库打。
现在我们来做一件很枯燥的事情,如果我们认为按月调仓太乏味,我们可以改为按周调仓,回测了2016-01-01至2017-5-11的数据,然后分别将调仓时间由每周第一个交易日到第五个交易日跑了一遍,发现一个事情:
调仓频率,第n个交易日 | 回测年化收益 | 基准年化收益 | Alph | Beta | Sharpe | Volatility | 最大回撤 |
---|---|---|---|---|---|---|---|
weekly,1 | 28.951% | -2.815% | 0.274 | 0.545 | 1.1932 | 0.2135 | 14.727% |
weekly,2 | 28.895% | -2.501% | 0.2318 | 0.5177 | 0.9963 | 0.216 | 14.725% |
weekly,3 | 12.275% | -2.501% | 0.1273 | 0.4612 | 0.5684 | 0.198 | 14.742% |
weekly,4 | 17.982% | -2.501% | 0.1809 | 0.5286 | 0.7889 | 0.2078 | 14.73% |
weekly,5 | 13.01% | -2.815% | 0.1342 | 0.4431 | 0.6043 | 0.1963 | 14.728% |
有意思的事情发生了,收益差这么多!但最大回撤基本上保持了一致。
看看持仓记录,原来第一笔交易:威孚高科(000581) 在一月份正在涨,选择后面几天建仓就踏空了。
说明的问题:
- 拍脑门决定调仓日是不行的,应该包含一个合适的择时策略!!
- 单纯的Graham策略基本可以保证让利润奔跑,但无法截断亏损!!可贵的利润都在大盘回调中吐了出来,甚至在四月底这次大跌中都没有及时调整仓位,一个与大盘相关的仓位控制系统是保证胜利果实的关键。
- 在合乎条件的股票数量不多时,该系统选择了一两只股票全仓杀进杀出,没有合理分散风险,这是非常愚蠢的。
所以说接下来的工作,我们可以将精力放在与之配套的择时策略和仓位控制策略上。