偏愛小市值策略的,進來了解下這個策略

瞭解Alpha策略和Fama_French 三因子模型的人都知道,市值因子是一個長期有效的超額收益來源,對股票收益率有一定的解釋作用,小市值的股票更容易帶來超額收益。這也比較好理解,因爲小市值類股票往往表現活躍,容易引發炒作風潮。此外,還有IPO管制的原因(大量排隊企業選擇借殼),也有市場風險偏好提升的原因(市場惡性循環越來越偏愛小市值)。小市值通常選到的是剛起步的公司,具有較強的成長能力,在一定範圍領域內有較強實力(否則誰讓你上市的),特別是在發展中國家此類因子有強力的alpha。

策略邏輯:市值可以帶來超額收益

策略內容:每月買入市值最小的30只股票,持有至下個月月初再調倉。

資金管理:等權重買入

風險控制:無單隻股票倉位上限控制、無止盈止損

源代碼如下:

# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
from gm.api import *
from datetime import timedelta
"""
小市值策略
本策略每個月觸發一次,計算當前滬深市場上市值最小的前30只股票,並且等權重方式進行買入。
對於不在前30的有持倉的股票直接平倉。
回測時間爲:2018-07-01 08:00:00 到 2019-10-01 16:00:00 
"""
def init(context):
    # schedule 定時任務詳見: https://www.myquant.cn/docs/python/python_basic#7bce6621a1abafe8
    # 每月第一個交易日的09:40 定時執行algo任務
    schedule(schedule_func=algo, date_rule='1m', time_rule='09:40:00')
    # 使用多少的資金來進行開倉。
    context.ratio = 0.8
def algo(context):
    # 獲取當前時間
    now = context.now
    # 選取全A股(剔除停牌和st股和上市不足50日的新股和退市股和B股)
    date1 = (context.now - timedelta(days=100)).strftime("%Y-%m-%d %H:%M:%S")
    date2 = context.now.strftime("%Y-%m-%d %H:%M:%S")
    # 通過get_instruments獲取所有的上市股票代碼 詳見:https://www.myquant.cn/docs/python/python_select_api#8ba2064987fb1d1f
    all_stock = get_instruments(exchanges='SHSE, SZSE', sec_types=[1], fields='symbol, listed_date, delisted_date',
                                df=True)
    code = all_stock[(all_stock['listed_date'] < date1) & (all_stock['delisted_date'] > date2) &
                            (all_stock['symbol'].str[5] != '9') & (all_stock['symbol'].str[5] != '2')]
    # 獲取所有股票在這個時候的市值, 詳見: https://www.myquant.cn/docs/python/python_select_api#8ba2064987fb1d1f
    fundamental = get_fundamentals_n('trading_derivative_indicator', code['symbol'].to_list(),
                                     context.now, fields='TOTMKTCAP', order_by='TOTMKTCAP', count=1, df=True)
    # 對市值進行排序,並且獲取前30個。 最後將這個series 轉化成爲一個list即爲標的池
    trade_symbols = fundamental.reset_index(drop=True).loc[:29, 'symbol'].to_list()
    print('本次股票池有股票數目: ', len(trade_symbols))
    # 計算每個個股應該在持倉中的權重
    percent = 1.0 / len(trade_symbols) * context.ratio
    # 獲取當前所有倉位 詳見 https://www.myquant.cn/docs/python/python_concept#8079e2e4dad05879
    positions = context.account().positions()
    # 平不在標的池的倉位
    for position in positions:
        symbol = position['symbol']
        if symbol not in trade_symbols:
            order_target_percent(symbol=symbol, percent=0, order_type=OrderType_Market,
                                 position_side=PositionSide_Long)
            print('市價單平不在標的池的', symbol)
    # 將標中已有持倉的和還沒有持倉的都調整到計算出來的比例。
    for symbol in trade_symbols:
        order_target_percent(symbol=symbol, percent=percent, order_type=OrderType_Market,
                             position_side=PositionSide_Long)
        print(symbol, '以市價單調整至權重', percent)
if __name__ == '__main__':
    '''
    strategy_id策略ID,由系統生成
    filename文件名,請與本文件名保持一致
    mode實時模式:MODE_LIVE回測模式:MODE_BACKTEST
    token綁定計算機的ID,可在系統設置-密鑰管理中生成
    backtest_start_time回測開始時間
    backtest_end_time回測結束時間
    backtest_adjust股票復權方式不復權:ADJUST_NONE前復權:ADJUST_PREV後復權:ADJUST_POST
    backtest_initial_cash回測初始資金
    backtest_commission_ratio回測佣金比例
    backtest_slippage_ratio回測滑點比例
    '''
    run(strategy_id='strategy_id',
        filename='main.py',
        mode=MODE_BACKTEST,
        token='token_id',
        backtest_start_time='2010-07-01 08:00:00',
        backtest_end_time='2019-10-01 16:00:00',
        backtest_adjust=ADJUST_PREV,
        backtest_initial_cash=1000000,
        backtest_commission_ratio=0.0001,
        backtest_slippage_ratio=0.0001)

最終回測結果

當下小市值策略已經成爲了基金行業內部公開的“祕密”。誰也不知道未來能否繼續獲得超額收益,但誰也不能說未來一定會失效。

聲明:本文觀點僅供交流探討,不夠成任何投資建議,否則後果自負。

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