[量化学院]大师系列之价值投资选股策略
国外证券市场比较悠久,曾出现过本杰明·格雷厄姆、彼得·林奇、詹姆斯·奥肖内西、查尔斯·布兰德斯等多位投资大师,这些投资大师有一个共同点,他们在证券市场上保持了常年的稳定持续盈利,他们的投资法则及选股标准在一些著作中有详细的描述。值得欣慰的是,申万宏源证券研究所发布了<申万宏源-申万大师系列价值投资篇>系列第一季共20篇研究报告。学习这些报告主要有两个目的:
-
一是我们自身想去认真的学习经典,复制这些策略本身就是自我学习过程,我们深信向这些被市场证明长期优秀,被后世尊为经典的投资大师学习,必然值得,必有所得;
-
二是复制和验证大师策略的过程, 会自然的驱使我们更多的从投资逻辑和投资思维上思考收益之源,而不再是不停的数据挖掘和数理分析。大师系列的尝试,于我们是一个求道,而非求术的旅程。
本贴主要是帮助用户怎样开发大师系列的策略,让大家更了解我们的平台,同时帮助大家在我们的平台上开发更丰富的策略。因此我们介绍一种简单的价值投资法来选取股票,规则如下:
-
策略逻辑:当股票处于价值洼地时,具备投资价值
-
策略内容:每月月初买入市盈率小于15倍、市净率小于1.5倍的30只股票,持有至下个月月初再调仓
-
资金管理:等权重买入
-
风险控制:无单只股票仓位上限控制、无止盈止损
第一步:获取数据, 整理换仓时的买入股票列表
BigQuant人工智能量化投资平台具有丰富的金融数据,包括行情数据和财报数据,并且具有便捷、简单的API调用接口。
def prepare(context):
start_date = context.start_date # 开始日期
end_date = context.end_date # 结束日期
context.instruments = D.instruments(context.start_date, context.end_date, market='CN_STOCK_A')
# 获取市盈率、市净率、成交额数据。history_data是我们平台获取数据的一个重要API。fields参数为列表形式,传入的列表即为我们想要获取的数据。
history_data = D.history_data(instruments, context.start_date, context.end_date, ['pb_lf', 'pe_ttm','amount'])
context.daily_buy_stock = history_data.groupby('date').apply(seek_symbol) # 按交易日groupby,获取每个交易日选出的股票列表
def seek_symbol(df):
selected = df[(df['pb_lf'] < 1.5)
& (df['pe_ttm'] < 15)
& (df['amount'] > 0)
& (df['pb_lf'] > 0)
& (df['pe_ttm'] > 0)]
# 按pe_ttm和pb_lf 升序排列
selected = selected.sort_values(['pe_ttm', 'pb_lf'])
return list(selected.instrument)[:30] # 记得转化成list
第二步:回测主体函数
我们平台策略回测有丰富的文档介绍,请参考:帮助文档
def initialize(context):
# 设置交易费用,买入是万三,卖出是千分之1.3,如果不足5元按5元算
context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
# 设置换仓规则,即每个月月初换仓,持有至下个月,再换仓
context.schedule_function(rebalance, date_rule=date_rules.month_start(days_offset=0))
def handle_data(context,data):
pass
# 换仓
def rebalance(context, data):
# 日期
date = data.current_dt.strftime('%Y-%m-%d')
# 买入股票列表
stock_to_buy = context.daily_buy_stock.ix[date]
# 目前持仓列表
stock_hold_now = [equity.symbol for equity in context.portfolio.positions]
# 继续持有股票列表
no_need_to_sell = [i for i in stock_hold_now if i in stock_to_buy]
# 卖出股票列表
stock_to_sell = [i for i in stock_hold_now if i not in no_need_to_sell]
# 执行卖出
for stock in stock_to_sell:
if data.can_trade(context.symbol(stock)):
context.order_target_percent(context.symbol(stock), 0)
# 如果当天没有买入就返回
if len(stock_to_buy) == 0:
return
# 等权重
weight = 1 / len(stock_to_buy)
# 执行买入
for cp in stock_to_buy:
if data.can_trade(context.symbol(cp)):
context.order_target_percent(context.symbol(cp), weight)
第三步:回测接口
# 使用该回测接口,需要传入多个策略参数
m = M.trade.v3(
instruments=None,
start_date='2013-01-01',
end_date='2018-02-02',
prepare=prepare,
# 必须传入initialize,只在第一天运行
initialize=initialize,
# 必须传入handle_data,每个交易日都会运行
handle_data=handle_data,
# 买入以开盘价成交
order_price_field_buy='open',
# 卖出也以开盘价成交
order_price_field_sell='open',
# 策略本金
capital_base=1000000,
# 比较基准:沪深300
benchmark='000300.INDX',
)
好嘞,策略就完全写好了。我们运行完曲线如下:
整体来看,该策略是正收益系统策略,长期坚持该策略收益是不错的。
是不是发现我们平台很方便开发策略?之前朋友问我,为什么Python运行速度不是最快但会成为量化的主流语言。其实对于量化研究人员来说,虽然速度是一方面考虑,但更多的是为了验证策略思想,Python语言的优势就是在此,有一个思想就可以很快的将思想验证,然而C++虽然速度快,但要验证一个简单的思想却要编写大量的代码。好比为什么飞机速度快,但市里面上班开汽车就足够了(不考虑其他因素),因为汽车足够灵活。所以,还在犹豫选择什么语言从事量化投资的小伙伴们,Python就是你比较好的选择。
本文到此就要结束了,感兴趣的朋友可以点击下方原文链接,一键 克隆策略,进行进一步研究。
- 实现平台:BigQuant—人工智能量化投资平台
- 源码地址:《大师系列之价值投资选股策略》