乔尔·格林布拉特的神奇公式

2005年,格林布拉特将自己长达20年的投资经验浓缩成一本仅有150页的小书——《股市稳赚》(The Little Book That Beats The Market),他创造的这一投资方法因此广为流传,并被称为“神奇公式”。
格林布拉特的投资理念来源于价值投资,他要做的就是找到物美价廉的公司,尤其是在市场出现特殊情况的背景下低价买入拥有好业务的公司。价廉物美简单说就是一方面寻找好的业务,另一方,面寻找便宜的股票。在《股市稳赚》中,格林布拉特指出:好的业务是指有形资本回报率高的公司,而便宜的股票则是指净收益率高的股票。乔尔·格林布拉特认为,好企业就是资本回报率高(ROIC)的企业,便宜也就是低估值,可以用PE、PB、EBIT/EV等来衡量。
神奇公式筛选股票函数实现

排除不适合ROIC衡量的企业,例如银行等。
将股票以ROIC与EP排序,再将ROIC和EP的序数相加。
最后得到序数之和选取最大的30只股票。
import numpy as np
import pandas as pd
import datetime
def MagicFormulaSelect(universe,date):

"""
给定股票列表和日期,返回神奇公式评分最高的股票的30只股票
Args:
    universe (list of str): 股票列表(有后缀)
    date (str or datetime): 常见日期格式支持
Returns:
    list: 神奇公式评分最高的股票的30只股票

Examples:
    >> universe = set_universe('HS300')
    >> buy_list = MagicFormulaSelect(universe,'20160909')
"""

trade_date = date if isinstance(date,datetime.datetime) else parse(date)
trade_date = trade_date.strftime('%Y%m%d')
df_roic = DataAPI.MktStockFactorsOneDayProGet(tradeDate=trade_date,secID=universe,
                                              ticker=u"",field=u"secID,tradeDate,ROIC",pandas="1")
df_roic = df_roic.dropna()
df_roic = df_roic.reset_index()
df_roic['rank_roic'] = df_roic['ROIC'].rank()
df_pe = DataAPI.MktStockFactorsOneDayProGet(tradeDate=trade_date,secID=df_roic['secID'].tolist(),
                                        ticker=u"",field=u"secID,tradeDate,PE",pandas="1")
df_pe['EP'] = 1.0/df_pe['PE']
df_pe['rank_ep'] = df_pe['EP'].rank()
df_rank = pd.concat([df_roic[['secID','rank_roic']],df_pe[['rank_ep']]],axis=1)
df_rank['rank_sum'] = df_rank['rank_roic'] + df_rank['rank_ep']
return df_rank.sort_values(['rank_sum'],ascending=False)['secID'].tolist()[0:30]

start = ‘2013-01-01’ # 回测起始时间
end = ‘2016-09-19’ # 回测结束时间
benchmark = ‘HS300’ # 策略参考标准
universe = DynamicUniverse(‘A’) # 证券池,支持股票和基金
capital_base = 1000000 # 起始资金
freq = ‘d’ # 策略类型,’d’表示日间策略使用日线回测,’m’表示日内策略使用分钟线回测
refresh_rate = 20 # 调仓频率,表示执行handle_data的时间间隔,若freq = ‘d’时间间隔的单位为交易日,若freq = ‘m’时间间隔为分钟

def initialize(account): # 初始化虚拟账户状态
pass

def handle_data(account): # 每个交易日的买入卖出指令

buy_list = MagicFormulaSelect(account.universe,account.previous_date)

for stk in account.avail_security_position:
    if stk not in buy_list:
        order_to(stk, 0)
if len(buy_list) > 0:
        weight = min(0.1,1.0/len(buy_list))
else:
    weight = 0
for stk in buy_list:
    if stk not in account.security_position:
        order_pct_to(stk,weight)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值