“该策略涉及购买品牌价值最低的15只美国股票,等权重,每年重新平衡。对于拥有多个品牌的公司(如大众汽车),品牌价值相加。”

I. 策略概要

投资范围包括Interbrand.com品牌价值数据库中列出的美国股票。该策略每月买入品牌价值最低的15只股票。投资组合为等权重,并在每年进行一次再平衡。对于隶属于同一上市公司的多个品牌(例如,大众、奥迪、宝马、保时捷),将其品牌价值相加,以确定该公司的总品牌价值。该方法侧重于被低估的品牌,旨在从品牌认知度或市场估值较低的股票中捕捉潜在价值。

II. 策略合理性

品牌价值反映了长期受欢迎程度的特征,其中较低的品牌价值(不受欢迎的公司)会获得受欢迎程度溢价的回报,而较高的品牌价值(受欢迎的公司)则提供较低的回报。这种溢价可以用行为经济学来解释,即投资者的偏好和认知偏差导致这些股票的错误定价。该策略侧重于财务稳定的跨国公司,正如Interbrand的100个最有价值品牌名单所定义的那样。这些公司必须满足特定标准,包括超过30%的收入来自其国内以外的国家,并且在至少三个大洲开展业务。股票还必须在具有可用财务数据的受监管交易所上市。

III. 来源论文

 Popularity: A Bridge between Classical and Behavioral Finance [点击查看论文]

<摘要>

受欢迎程度是一个涵盖任何事物被喜爱、认可或渴望程度的词汇。受欢迎程度驱动需求。在本书中,我们将这一概念应用于资产和证券,以解释证券市场,尤其是股票市场中的溢价和所谓的异常现象。大多数资产和证券在短期或中期内的供应相对固定。受欢迎程度代表对证券的需求——或者可能是证券被如此程度需求的一系列原因——因此,在给定一组预期现金流的情况下,它是价格的重要决定因素。金融文献中的一个普遍观点是,市场溢价是证券风险的回报——即它们是“风险”溢价。在经典金融学中,投资者是风险厌恶型的,并且通常假设不存在市场摩擦。在最广泛的背景下,风险是不受欢迎的。最大的风险溢价是股票风险溢价(即投资于股票而非债券或无风险资产的额外预期回报)。其他风险溢价包括,例如,利率期限溢价(因为长期债券的风险更大)和债券市场的违约风险溢价。市场上有许多可能与风险相关或不相关的溢价,但都与投资于某种不受欢迎的事物有关。我们认为溢价是系统性不受欢迎的特征的结果——也就是说,在其他条件相同的情况下,受欢迎程度会使证券的价格更高,预期回报更低。影响相对受欢迎程度的偏好会随着时间的推移而变化。这些溢价包括规模溢价、价值溢价、流动性溢价、严重下跌溢价、低波动性和低贝塔溢价、ESG溢价和折扣、竞争优势、品牌和声誉。一般来说,任何具有容易被忽视或不受欢迎的特征的证券都可能具有溢价。本书的标题指的是经典金融学和行为金融学之间的桥梁。两种金融学方法都基于投资者偏好,我们将其视为受欢迎程度。

IV. 回测表现

年化回报11.95%
波动率16.73%
β值0.958
夏普比率0.71
索提诺比率0.563
最大回撤N/A
胜率81%

V. 完整的 Python 代码

from AlgorithmImports import *
import pandas as pd
from io import StringIO
#endregion
class InsiderTradingCombinedwithShareRepurchases(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2000, 1, 1)
        self.SetCash(100000)
        self.long: List[Symbol] = []
        self.brands_by_year_n: Dict[int, List[str]] = {}
        market: Symbol = self.AddEquity('SPY', Resolution.Daily).Symbol
        
        # Data source: https://interbrand.com/best-global-brands/
        csv_string_file = self.Download(f'data.quantpedia.com/backtesting_data/economic/brand_value_fifteen_lowest.csv')
        # take values of each column, expect first one in each row and does not take first row as a header
        separated_file = pd.read_csv(StringIO(csv_string_file), sep=';', header=None)
        
        for row in separated_file.itertuples():
            brand_tickers = []
            for ticker in row[2:]:
                brand_tickers.append(ticker)
            self.brands_by_year_n[int(row[1])] = brand_tickers
        self.selection_flag: boll = False
        self.UniverseSettings.Resolution = Resolution.Daily
        self.AddUniverse(self.FundamentalSelectionFunction)
        self.Settings.MinimumOrderMarginPortfolioPercentage = 0.
        self.Schedule.On(self.DateRules.MonthStart(market), self.TimeRules.AfterMarketOpen(market), self.Selection)
        self.settings.daily_precise_end_time = False
        
    def OnSecuritiesChanged(self, changes: SecurityChanges) -> None:
        for security in changes.AddedSecurities:
            security.SetFeeModel(CustomFeeModel())
    def FundamentalSelectionFunction(self, fundamental: List[Fundamental]) -> List[Symbol]:
        if not self.selection_flag:
            return Universe.Unchanged
        
        year_key: int = self.Time.year - 1
        if year_key in self.brands_by_year_n:
            self.long = [f.Symbol for f in fundamental if f.Symbol.Value in self.brands_by_year_n[year_key]]
        return self.long
    def OnData(self, slice: Slice) -> None:
        if not self.selection_flag:
            return
        self.selection_flag = False
        
        # rebalance
        portfolio:List[PortfolioTarget] = [PortfolioTarget(symbol, 1. / len(self.long)) for symbol in self.long if symbol in slice and slice[symbol]]
        self.SetHoldings(portfolio, True)
        self.long.clear()
            
    def Selection(self) -> None:
        self.selection_flag = True
class CustomFeeModel(FeeModel):
    def GetOrderFee(self, parameters):
        fee = parameters.Security.Price * parameters.Order.AbsoluteQuantity * 0.00005
        return OrderFee(CashAmount(fee, "USD"))

发表评论

了解 Quant Buffet 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读