动量因子(Momentum factor)——投资组合分析(EAP.portfolio_analysis)

本文探讨了动量因子(Momentum factor)在投资组合分析中的应用,特别是在金融市场的实证研究。通过分析历史数据,发现动量效应在全球股票、商品和债券市场中普遍存在,但在某些特定市场如中国股市存在争议。文章使用Python进行数据处理,构建动量效应代理变量,并对数据进行预处理,最终得出在单变量和双变量分析中,动量因子未能显著提供超额收益的结论。

实证资产定价(Empirical asset pricing)已经发布于Github. 包的具体用法(Documentation)博主将会陆续在CSDN中详细介绍。

Github: GitHub - whyecofiliter/EAP: empirical asset pricing
 

动量因子始于Jegadeesh and Titman(1993)。此效应广泛存在于全球股票市场(Jegadeesh and Titman, 2001;Rouwenhorst, 1998, 1999; De Groot et al., 2012;Asness et al., 2013)以及其他市场,如商品市场(Narayan et al., 2015)和债券市场(Isreal et al., 2018)。然而,在中国股市中,有人认为不存在这种影响(Liu and Lee, 2001; Li et al., 2010)。

动量效应很直观,过去表现良好的股票将在未来继续表现良好,反之亦然。动量效应的传统替代变量是过去12个月到过去1个月的总收益率(不包括当月)。由于可能存在短期反转效应,不包括上月收益率。

在本demo中,选择了前面文本中的常规代理变量。数据集始于2000年1月,从CSMAR数据集中收集。警告:请勿将此演示中的数据集用于任何商业目的。

# %% import package
import pandas as pd
import sys, os

sys.path.append(os.path.abspath(".."))

# %% import data
# Monthly return of stocks in
本表以Fama-French三因子资产定价模型为依据,提供市场溢酬因子(Rm-Rf),市值因子(SMB)和账面市值比因子(HML)的月序列数据。 表中计算所用的无风险收益数据选择标准为:开始--2002年8月6日用三个月期定期银行存款利率; 2002年8月7日--2006年10月7日用三个月期中央银行票据的票面利率; 2006年10月8日--当前,用上海银行间3个月同业拆放利率。 三因子数据包括: 市场溢酬因子__流通市值加权 Rm-Rf 市值因子__流通市值加权 SMB 账面市值比因子__流通市值加权 HML 市场溢酬因子__总市值加权 Rm-Rf 市值因子__总市值加权 SMB 账面市值比因子__总市值加权 HML 有以下3种方式计算的月惯性因子(又称动量因子)。 计算方法1:惯性因子=前n个月累积收益最高的30%的所有股票组合加权收益率-前n个月累积收益最低的30%的所有股票组合加权收益率。 计算方法2:惯性因子=前n个月累积收益最高的10%的所有股票组合加权收益率-前n个月累积收益最低的10%的所有股票组合加权收益率。 计算方法3:惯性因子=前n个月累积收益大于零的所有股票组合加权收益率-前n个月累积收益小于零所有股票组合加权收益率。 其中,n=3、4、5、6、7、8、9、10、11、12、18、24;加权方式为等权、流通市值加权、总市值加权。 在Carhart四因子模型经典文献中,惯性因子=前11个月累积收益最高的30%的股票组合等权收益率-前11个月累积收益最低的30%的股票组合等权收益率。
import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression import backtrader as bt class MultiFactorAlphaStrategy(bt.Strategy): params = ( ('momentum_period', 20), ('value_period', 60), ('quality_period', 120), ('rebalance_days', 21), ) def __init__(self): # 多因子模型:动量、价值、质量 self.momentum_factor = {} self.value_factor = {} self.quality_factor = {} self.combined_alpha = {} for data in self.datas: self.momentum_factor[data] = bt.indicators.ROC(data.close, period=self.params.momentum_period) self.value_factor[data] = bt.indicators.PE_Ratio(data) # 假设有市盈率数据 self.quality_factor[data] = bt.indicators.ROE(data) # 假设有ROE数据 def next(self): # 每月调仓 if len(self.data) % self.params.rebalance_days != 0: return alphas = [] stocks = [] for data in self.datas: if len(data) < max(self.params.momentum_period, self.params.value_period, self.params.quality_period): continue # 计算综合alpha得分 momentum_score = self.momentum_factor[data][0] value_score = -self.value_factor[data][0] # 低估值更好 quality_score = self.quality_factor[data][0] # 标准化因子 combined_alpha = (0.4 * momentum_score + 0.35 * value_score + 0.25 * quality_score) alphas.append(combined_alpha) stocks.append(data) # 选择alpha最高的20%做多,最低的20%做空 if len(alphas) < 10: return alpha_series = pd.Series(alphas, index=range(len(alphas))) long_threshold = alpha_series.quantile(0.8) short_threshold = alpha_series.quantile(0.2) # 执行交易 for i, (alpha, stock) in enumerate(zip(alphas, stocks)): position = self.getposition(stock) if alpha >= long_threshold and not position: self.buy(data=stock, size=1000) elif alpha <= short_threshold and not position: self.sell(data=stock, size=1000) elif (long_threshold > alpha > short_threshold) and position: self.close(data=stock)
最新发布
10-12
以下是一个使用 `pandas`、`numpy`、`sklearn`、`backtrader` 库,包含动量、价值、质量因子,每月调仓的多因子量化交易策略代码示例,同时会提供代码检查与优化的思路。 ```python import pandas as pd import numpy as np import yfinance as yf import backtrader as bt from sklearn.preprocessing import StandardScaler import datetime # 自定义策略类 class MultiFactorStrategy(bt.Strategy): params = ( ('monthly_rebalance', True), ) def __init__(self): self.inds = dict() self.months_passed = 0 for i, d in enumerate(self.datas): # 动量因子:过去12个月的收益率 self.inds[d]['momentum'] = (d.close / d.close(-12) - 1) # 价值因子:市净率倒数 self.inds[d]['value'] = 1 / (d.close / d.book_value) # 质量因子:净资产收益率 self.inds[d]['quality'] = d.roe def next(self): if self.p.monthly_rebalance and self.datetime.date().month != self.datetime.date(-1).month: self.months_passed += 1 if self.months_passed > 12: # 确保有足够的数据计算动量因子 factors = [] for i, d in enumerate(self.datas): factors.append([ self.inds[d]['momentum'][0], self.inds[d]['value'][0], self.inds[d]['quality'][0] ]) factors = np.array(factors) scaler = StandardScaler() factors = scaler.fit_transform(factors) # 简单等权重合成因子 combined_factor = factors.sum(axis=1) sorted_indices = np.argsort(combined_factor)[::-1] top_stocks = sorted_indices[:int(len(sorted_indices) * 0.2)] # 选取前20%的股票 for i, d in enumerate(self.datas): if i in top_stocks: self.order_target_percent(d, target=1 / len(top_stocks)) else: self.order_target_percent(d, target=0) # 创建 Cerebro 引擎 cerebro = bt.Cerebro() # 添加数据 tickers = ['AAPL', 'MSFT', 'GOOG'] for ticker in tickers: data = yf.download(ticker, start='2020-01-01', end='2023-01-01') data = bt.feeds.PandasData(dataname=data) # 这里简单假设 book_value 和 roe 数据,实际中需要从数据源获取 data.book_value = pd.Series(np.random.rand(len(data)), index=data.index) data.roe = pd.Series(np.random.rand(len(data)), index=data.index) cerebro.adddata(data) # 添加策略 cerebro.addstrategy(MultiFactorStrategy) # 设置初始资金 cerebro.broker.setcash(100000.0) # 运行回测 print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) cerebro.run() print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) ``` ### 代码检查与优化思路 #### 代码检查 1. **数据完整性**:确保从数据源获取的股票价格、市净率、净资产收益率等数据完整,没有缺失值。可以使用 `pandas` 的 `isnull()` 方法检查数据是否存在缺失值。 2. **因子计算逻辑**:检查动量、价值、质量因子的计算逻辑是否正确,是否符合金融理论。 3. **调仓逻辑**:确保每月调仓逻辑正确,不会出现调仓时间错误或调仓次数过多的问题。 #### 代码优化 1. **因子合成方法**:当前代码使用简单等权重合成因子,可以考虑使用机器学习方法,如线性回归、主成分分析等,对因子进行加权合成,提高因子的预测能力。 2. **风险控制**:在策略中添加风险控制机制,如止损、止盈等,降低投资风险。 3. **参数优化**:使用网格搜索、遗传算法等方法,对策略中的参数进行优化,如调仓频率、因子权重等,提高策略的收益表现。
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值