Quantopian 做多大市值科技和消費週期股,做空小市值和消費週期股回測

源碼

from quantopian.pipeline import Pipeline
from quantopian.algorithm import attach_pipeline, pipeline_output
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.factors import SimpleMovingAverage
from quantopian.pipeline.classifiers.morningstar import Sector
from quantopian.pipeline.data import morningstar as morningstar
from quantopian.pipeline.filters.morningstar import Q500US, Q1500US
from quantopian.pipeline.factors.morningstar import MarketCap
from quantopian.pipeline.data import Fundamentals  
import quantopian.algorithm as algo


def make_pipeline():
    q500 = Q500US()  
    mktcap = MarketCap()
    sector = morningstar.asset_classification.morningstar_sector_code.latest
    sectors_311 = sector.element_of([102, 311])
    mkt_cap = morningstar.valuation.market_cap.latest
    growth = Fundamentals.revenue_growth.latest
    forward_pe_ratio = Fundamentals.forward_pe_ratio.latest
    current_pe = Fundamentals.pe_ratio.latest
    
    pipe = Pipeline()
    attach_pipeline(pipe, 'pipeline_tutorial')
    pipe.add(Sector(), 'Sector')
    pipe.add(mktcap, 'mktcap')
    pipe.add(growth, 'growth')
    pipe.add(forward_pe_ratio, 'forward_pe_ratio')
    pipe.add(current_pe, 'current_pe')
    
    # log.info(current_pe / forward_pe_ratio)
    
    pipe.set_screen(sectors_311 & q500)
    # pipe.set_screen(q500)
    return pipe


def initialize(context):
    set_benchmark(symbol('QQQ'))
    
    algo.schedule_function(
        rebalance,
        algo.date_rules.month_start(),
        algo.time_rules.market_open(hours=1),
    )
   
    algo.attach_pipeline(make_pipeline(), 'pipeline')
    #購買持倉數量
    context.buy_stock_count = 10
    #槓桿大小
    leverage = 1.0
    context.buy_stock_percent = float(leverage / context.buy_stock_count)
    cash = context.portfolio.cash
    context.purchase_value = cash / context.buy_stock_count
    context.stocks_sold = []

def before_trading_start(context, data):
    output = pipeline_output('pipeline_tutorial')
    context.my_short_universe = output.sort('mktcap', ascending=True).iloc[0:context.buy_stock_count]
    context.my_long_universe = output.sort('mktcap', ascending=False).iloc[0:context.buy_stock_count]
    

 
    
def rebalance(context, data):
    """
    Execute orders according to our schedule_function() timing.
    """

    if True:
        # purchase_value = cash /  left_buy_count
        for stock in context.my_long_universe.index:
            if stock != symbol('QQQ'):
                order_target_percent(stock, context.buy_stock_percent * 1.3)
        for stock in context.my_short_universe.index:
            if stock != symbol('QQQ'):
                order_target_percent(stock, -context.buy_stock_percent * 0.5)
    
        for stock in context.portfolio.positions:
            if stock != symbol('QQQ'):
                if stock not in context.my_long_universe.index and stock not in context.my_long_universe.index:
                    order_target_value(stock, 0)
    pass

大市值科技股因子回測

1.持有大市值規則:

在標普500成分股中,選擇科技板塊(Technology)和消費類週期股(Consumer Cyclical)(主要亞馬遜被分到這了)選擇市值最大的10只股票,每月調整一次。
在這裏插入圖片描述

可以看出基本跟基準QQQ的走勢差不多。在金融危機跌幅也巨大。
在這裏插入圖片描述

最新持倉 AAPL,CSCO,DIS,HD,INTC,MSFT,ORCL,AMZN,GOOG_L,FB
在這裏插入圖片描述

1.1板塊暴露風險(Sector Exposures):

在這裏插入圖片描述

最高有96%的科技板塊暴露風險,最近的話是63%的科技板塊暴露,28%的消費週期板塊暴露。

1.2 因子暴露

在這裏插入圖片描述
因爲規則是用市值進行篩選,所以毫無意外,在市值(Size)中暴露風險最大

1.3 跟Spy的相關性

在這裏插入圖片描述
可以看出最低也有跟Spy 0.8的相關性,高有1.4的相關性。

2.持有小市值規則

在這裏插入圖片描述
在標普500成分股中,選擇科技板塊(Technology)和消費類週期股(Consumer Cyclical)(主要亞馬遜被分到這了)選擇市值最小的10只股票,每月調整一次。

可以看出小市值的科技和消費公司,在2015年後有一波大跌,甚至走勢跟QQQ相反。

在這裏插入圖片描述
主要的因子暴露是波動性。小市值有較高的波動性。

3.做多130% 20只大市值科技和消費類週期股,做空50% 20只小市值科技和消費類週期股

在這裏插入圖片描述
在這裏插入圖片描述

在小幅度增加最大回撤的情況下,小幅度跑贏QQQ

在這裏插入圖片描述
因子上暴露比較明顯,主要是正的大市值,負的波動性。

在這裏插入圖片描述
跟Spy 的相關性還是維持在0.8以上,最高1.48

4.結論

過去10年是大市值科技股的黃金時間,不保證未來大市值科技股還有這樣高的收益。大市值科技股在金融危機這樣的情況下,回撤也會驚人。過去4年做空小市值科技和消費類週期股,有較好收益,不保證未來還有這樣高的收益,做空要謹慎。

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