该策略专注于股票的空头利息,即投资者对做空某只股票的兴趣,通常用做空股份占流通股的比例来衡量。每月筛选空头利息最低的股票做多,同时做空空头利息最高的股票。组合每月重新平衡,以反映最新数据,试图通过捕捉市场情绪差异获利。

策略概述

该策略专注于股票的空头利息(Short Interest),即市场中投资者对做空某只股票的兴趣和程度。空头利息通常用做空股份占流通股的比例来衡量。该策略的核心是基于空头利息的变化进行多空交易。每月对投资池中的股票进行筛选,选择空头利息最低的股票进行做多操作,同时选择空头利息最高的股票进行做空操作。该组合每月重新平衡,以确保与最新的空头利息数据保持一致。

通常,空头利息较高的股票表明市场对其未来表现持悲观态度,而空头利息较低的股票则被认为有较大的上涨潜力。该策略试图通过捕捉这种情绪差异来获利。

策略合理性

空头利息效应背后的经济逻辑在于,市场上存在信息不对称或过度反应。高空头利息的股票通常由于负面新闻或市场情绪而被大量做空,这往往导致股票价格暂时下跌。当这种情绪消退时,股票价格可能会反弹,因此通过做空这些股票有助于利用市场情绪的过度反应。相反,低空头利息的股票通常代表市场对其持乐观态度,并且股票价格可能会上涨。

实证研究表明,高空头利息的股票往往表现较差,而低空头利息的股票表现较好。该策略利用空头利息的预测能力,从多空两端捕捉回报——通过做空大量被做空的股票获利,并通过做多空头利息较低的股票获取收益。

论文来源

Why Do Short Interest Levels Predict Stock Returns? [点击浏览原文]

<摘要>

本文研究了空头利息与股票回报之间的关系。研究发现,空头利息是股票未来回报的一个显著预测因素。高空头利息的股票在未来的表现通常不佳,而空头利息较低的股票表现较好。通过结合空头利息与股票动量的多空策略,投资者能够显著提高投资回报率。研究还表明,空头利息的效应不仅仅受到市场流动性或其他风险因素的影响,而是反映了投资者的非理性情绪和信息不对称。

回测表现

年化收益率19.7%
波动率17.14%
Beta-0.025
夏普比率-0.157
索提诺比率N/A
最大回撤30.2%
胜率51%

完整python代码

from AlgoLib import *

class ShortInterestEffect(XXX):

    def Initialize(self):
        self.SetStartDate(2010, 1, 1)
        self.SetCash(100000)

        # NOTE: We use only s&p 100 stocks so it's possible to fetch short interest data from quandl.
        self.symbols = [
            'AAPL','MSFT','AMZN','FB','GOOGL','GOOG','JPM','JNJ','V','PG','XOM','UNH','BAC','MA','T','DIS','INTC','HD','VZ','MRK','PFE',
            'CVX','KO','CMCSA','CSCO','PEP','WFC','C','BA','ADBE','WMT','CRM','MCD','MDT','BMY','ABT','NVDA','NFLX','AMGN','PM','PYPL','TMO',
            'COST','ABBV','ACN','HON','NKE','UNP','UTX','NEE','IBM','TXN','AVGO','LLY','ORCL','LIN','SBUX','AMT','LMT','GE','MMM','DHR','QCOM',
            'CVS','MO','LOW','FIS','AXP','BKNG','UPS','GILD','CHTR','CAT','MDLZ','GS','USB','CI','ANTM','BDX','TJX','ADP','TFC','CME','SPGI',
            'COP','INTU','ISRG','CB','SO','D','FISV','PNC','DUK','SYK','ZTS','MS','RTN','AGN','BLK'
            ]
        
        for symbol in self.symbols:
            data = self.AddEquity(symbol, Resolution.Daily)
            data.SetFeeModel(CustomFeeModel())
            data.SetLeverage(5)
            
            self.AddData(QuandlFINRA_ShortVolume, 'FINRA/FNSQ_' + symbol, Resolution.Daily)
        
        self.recent_month = -1

    def OnData(self, data):
        if self.recent_month == self.Time.month:
            return
        self.recent_month = self.Time.month
        
        short_interest = {}
        for symbol in self.symbols:
            sym = 'FINRA/FNSQ_' + symbol
            if sym in data and data[sym] and symbol in data and data[symbol]:
                short_vol = data[sym].GetProperty("SHORTVOLUME")
                total_vol = data[sym].GetProperty("TOTALVOLUME")
                
                short_interest[symbol] = short_vol / total_vol
        
        long = []
        short = []
        if len(short_interest) >= 10:
            sorted_by_short_interest = sorted(short_interest.items(), key = lambda x: x[1], reverse = True)
            decile = int(len(sorted_by_short_interest) / 10)
            long = [x[0] for x in sorted_by_short_interest[-decile:]]
            short = [x[0] for x in sorted_by_short_interest[:decile]]
                    
        # trade execution
        stocks_invested = [x.Key.Value for x in self.Portfolio if x.Value.Invested]
        for symbol in stocks_invested:
            if symbol not in long + short:
                self.Liquidate(symbol)

        for symbol in long:
            if symbol in data and data[symbol]:
                self.SetHoldings(symbol, 1 / len(long))
        for symbol in short:
            if symbol in data and data[symbol]:
                self.SetHoldings(symbol, -1 / len(short))

class QuandlFINRA_ShortVolume(PythonQuandl):
    def __init__(self):
        self.ValueColumnName = 'SHORTVOLUME'    # also 'TOTALVOLUME' is accesible

# Custom fee model.
class CustomFeeModel(FeeModel):
    def GetOrderFee(self, parameters):
        fee = parameters.Security.Price * parameters.Order.AbsoluteQuantity * 0.00005
        return OrderFee(CashAmount(fee, "USD"))

Leave a Reply

Discover more from Quant Buffet

Subscribe now to keep reading and get access to the full archive.

Continue reading