投资范围包括股票市场指数数据可用且穆斯林人口比例超过50%的国家,主要通过指数ETF跟踪。这项策略参考了14个穆斯林国家的情况。投资者在斋月期间持有等权重的ETF投资组合,而在其他时间则投资于现金。斋月的日期基于月亮的运动和日落时间计算。

策略概述

投资范围包括股票市场指数数据可用且穆斯林人口比例超过50%的国家。大多数国家可以通过指数ETF轻松跟踪。该策略参考的研究论文使用了14个穆斯林国家。

斋月是伊斯兰历的第九个月,基于月亮的运动。斋月的日期可以通过天文日历中的月相和日落时间信息或公共资源中的斋月日期信息来计算。

该交易策略非常简单。投资者在斋月期间持有等权重的ETF投资组合,而在其他时间则投资于现金。

策略合理性

学术研究认为,斋月带来的愉悦感可能会影响伊斯兰市场中投资者的行为。斋月期间的积极情绪提升了投资者的信心,对伊斯兰国家的股票市场产生了正面的估值效应。

论文来源

Piety and Profits: Stock Market Anomaly during the Muslim Holy Month [点击浏览原文]

<摘要>

斋月是全球超过15亿穆斯林庆祝的最重要的宗教仪式之一。我们调查了1989年至2007年期间14个主要穆斯林国家在斋月的股票收益。结果表明,斋月期间的股票收益几乎是其他时间段的九倍,且波动性较低。交易量没有显著差异。我们发现这些结果与斋月对投资者心理的积极影响一致,因为它促进了全球穆斯林的团结感和社会认同感,从而延伸到乐观的投资决策中。

回测表现

年化收益率6.7%
波动率N/A
Beta0.049
夏普比率-0.241
索提诺比率-0.075
最大回撤11%
胜率65%

完整python代码

from AlgoLib import *
from pandas.tseries.offsets import BDay

class RamadanEffect(XXX):

    def Initialize(self):
        self.SetStartDate(2010, 1, 1)
        self.SetCash(100000)
        
        self.symbols: List[Symbol] = [
            self.AddEquity(x, Resolution.Daily).Symbol for x in ['TUR', 'GULF', 'GAF', 'PAK', 'UAE', 'QAT', 'EGPT', 'EWM', 'EIDO', 'KSA']
        ]

        # Source: https://www.infoplease.com/calendars/holidays/islamic-holidays
        csv_string_file: str = self.Download('data.quantpedia.com/backtesting_data/calendar/ramadan_dates.csv')
        date_pairs_str: List[str] = csv_string_file.split('\r\n')
        self.date_ranges: List[List] = []

        for pair in date_pairs_str:
            split: List[str] = pair.split(';')
            
            self.date_ranges.append(
                pd.date_range(start=datetime.strptime(split[0], "%d.%m.%Y").date(), 
                end=datetime.strptime(split[1], "%d.%m.%Y").date())
            )

    def OnData(self, slice: Slice) -> None:
        if any(str(self.Time.date()) in self.date_ranges[i] for i in range(len(self.date_ranges))):
            # open trades
            if not self.Portfolio.Invested:
                portfolio: List[PortfolioTarget] = [
                    PortfolioTarget(symbol, 1. / len(self.symbols)) for symbol in self.symbols if symbol in slice and slice[symbol]
                ]
                self.SetHoldings(portfolio, True)
        else:
            # close trades
            if self.Portfolio.Invested:
                self.Liquidate()

Leave a Reply

Discover more from Quant Buffet

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

Continue reading