构建股票每月的动量十分位投资组合的代码
以下是Python代码,根据每个月的动量十分位,构建股票投资组合:
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import yfinance as yf
# 设定回测时间段
start_date = datetime(2010, 1, 1)
end_date = datetime(2021, 12, 31)
# 设定动量计算的时间窗口
momentum_window = 12
# 设定每月调仓日
rebalance_day = 1
# 设定投资组合中股票数量
portfolio_size = 10
# 下载股票数据
tickers = ['AAPL', 'GOOG', 'MSFT', 'AMZN', 'FB', 'TSLA', 'NVDA', 'JPM', 'V', 'JNJ']
data = yf.download(tickers, start=start_date, end=end_date)['Adj Close']
# 计算每个月的动量十分位
momentum_df = pd.DataFrame(index=data.index)
for i in range(momentum_window, len(data)):
momentum_df.loc[data.index[i], 'momentum'] = (data.iloc[i] / data.iloc[i-momentum_window] - 1).mean()
momentum_df['momentum_percentile'] = momentum_df['momentum'].rank(pct=True)
# 构建投资组合
portfolio = pd.DataFrame(index=data.index)
for i in range(0, len(data), 30):
if i+momentum_window >= len(data):
break
month = data.index[i]
next_month = data.index[i+30]
holdings = momentum_df.loc[month:next_month].sort_values(by='momentum_percentile', ascending=False).head(portfolio_size).index
portfolio.loc[month:next_month, 'holdings'] = ','.join(holdings)
# 计算投资组合收益率
portfolio_returns = pd.DataFrame(index=data.index)
for i in range(0, len(data), 30):
if i+30 >= len(data):
break
month = data.index[i]
next_month = data.index[i+30]
holdings = portfolio.loc[month, 'holdings'].split(',')
returns = data.loc[month:next_month, holdings].pct_change().mean(axis=1)
portfolio_returns.loc[next_month, 'returns'] = (1 + returns).prod() - 1
# 输出投资组合每月收益率和累计收益率
print(portfolio_returns)
print('Cumulative Return:', (1+portfolio_returns['returns']).prod()-1)
该代码将下载股票数据,并计算每个月的动量十分位。然后根据每个月的动量十分位,选择动量最好的若干只股票构建投资组合。最后计算投资组合每月的收益率和累计收益率
原文地址: http://www.cveoy.top/t/topic/fgYs 著作权归作者所有。请勿转载和采集!