欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

游离态GLZ的股票量化实验(一)—— 基于神奇公式思想+布林带择时的投资策略

程序员文章站 2022-03-21 13:07:42
...

游离态GLZ的股票量化实验(一)—— 基于神奇公式思想+布林带择时的投资策略

量化断更了两年了,重新开写,希望各路大佬多批评指教。

最近上量化课学习了神奇公式,神奇公式是格林布拉特在其《股市稳赢》中提到的一种选股策略,其本人也依靠这个公式获得了长期年华40%的收益,赚的盆满钵满。

这个公式的思想简单来说就两步,一是寻找好公司;二是寻找便宜的股票。用量化行业的话来说就是一个双因子策略,选取的两个因子是资本回报率和股票收益率。由于国内这些指标不好查,用净资产收益率(ROE)代替资本回报率;用市盈率(PE)代替股票收益率。

基于这个思想来进行量化投资,但是注意到A股表现和美股比…算是一种双边行情,经常会有不可预测的跌势开启,因此加上布林带的择时,防止在股票下穿布林带开口的时候买入。

策略核心代码如下:

#排除市净率和净资产收益率小于0的,并选取流通市值top1%的
    df = df[(df['roe']>0) & (df['pb_ratio']>0)].sort_values(by='pb_ratio')
    df.index = df['code'].values #设置股票代号为index
    df = df[df['circulating_market_cap'] > df['circulating_market_cap'].quantile(0.99)]
    
    #选取roe大于8和pe小于60的
    df = df[(df['pe_ratio']<60) & (df['roe']>8)]
    
    #用rank作为指标,取roe(大)和pb(小)综合排名好的
    df['1/roe'] = 1/df['roe']
    df['score'] = df[['pb_ratio','1/roe']].rank().T.apply(sum)
    #通过考验的放入股票池
    pool = list((df.sort_values('score').index)[:g.stockNum])

布林带防止下穿,回避高风险股票买入时机:

for i in feasible_stock_list:
        for short_d, long_d in [(10, 50)]:
            price_short = get_price(i,end_date=context.previous_date,count=1+short_d,fields=['close'])['close']
            MA_short = price_short[-short_d:].mean()
            MA_short_pre = price_short[-1-short_d:-1].mean()

            price_long = get_price(i,end_date=context.previous_date,count=1+long_d,fields=['close'])['close']
            MA_long = price_long[-long_d:].mean()
            MA_long_pre = price_long[-1-long_d:-1].mean()

            if MA_short < MA_long and MA_short_pre > MA_long_pre and context.portfolio.positions[i].closeable_amount > 0:
                if i not in res_lst:
                    res_lst.append(i)

在聚宽平台回测了2019年全年,效果尚可:
游离态GLZ的股票量化实验(一)—— 基于神奇公式思想+布林带择时的投资策略
该模型还有很多问题,为了测试神奇公式对布林带的择时应用没有很严格,仅仅防止了下穿;同时神奇公式本身对很多突然崛起的科技股没有什么敏感度,更倾向于购买内在价值高但被低估的白马,而忽略表面价值低但是由于科技发展突然翻身的黑马。还有很多地方可以改进。

相关标签: 量化金融