遊離態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年全年,效果尚可:
在這裏插入圖片描述
該模型還有很多問題,爲了測試神奇公式對布林帶的擇時應用沒有很嚴格,僅僅防止了下穿;同時神奇公式本身對很多突然崛起的科技股沒有什麼敏感度,更傾向於購買內在價值高但被低估的白馬,而忽略表面價值低但是由於科技發展突然翻身的黑馬。還有很多地方可以改進。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章