将A股市场1500只股票的月收益率从大到小排序进行十等分构建股票每月的动量十分位投资组合的代码
以下是构建股票每月的动量十分位投资组合的代码:
import pandas as pd
import numpy as np
# 读取A股市场1500只股票的月收益率数据
df = pd.read_csv('A股市场1500只股票的月收益率数据.csv', index_col=0)
# 对月收益率进行排序
sorted_df = df.apply(lambda x: x.sort_values(ascending=False).values)
# 将排序后的月收益率划分为十等分
n = 10
step = int(len(df) / n)
quantile_df = pd.DataFrame(index=df.columns)
for i in range(n):
start = i * step
end = (i+1) * step if i != n-1 else len(df)
quantile_df[i+1] = sorted_df.iloc[start:end].mean()
# 计算每个股票在每个月的十分位数
quantile_rank = pd.DataFrame(index=df.index, columns=df.columns)
for date in df.columns:
for stock in df.index:
quantile_rank.at[stock, date] = np.searchsorted(quantile_df.loc[date], df.loc[stock, date]) + 1
# 构建每月的动量十分位投资组合
momentum_portfolio = pd.DataFrame(index=df.columns, columns=range(1, n+1))
for date in df.columns:
ranks = quantile_rank.loc[:, date]
ranks = ranks[ranks.notna()]
ranks = ranks.sort_values()
top_n = ranks.iloc[:int(len(ranks)*0.1)]
for i in range(1, n+1):
momentum_portfolio.at[date, i] = top_n[top_n <= i].index.tolist()
print(momentum_portfolio)
解释一下代码的逻辑:
- 首先读取A股市场1500只股票的月收益率数据,并进行排序。
- 将排序后的月收益率数据划分为十等分,得到每个股票每个月的十分位数。
- 构建每个股票在每个月的十分位数数据框
quantile_rank。 - 对于每个月,选出排名前10%的股票构建动量十分位投资组合
momentum_portfolio。
需要注意的是,这里的动量策略是根据每个股票在每个月的表现来决定,因此每个月的动量投资组合可能会有所不同。如果想要固定投资组合,可以将 momentum_portfolio 的计算放在循环外面,只计算一次即可
原文地址: https://www.cveoy.top/t/topic/fgZl 著作权归作者所有。请勿转载和采集!