整理 course 目录:原课程归入同名文件夹,新增学习资料/动手练习分类
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
"""04 | 动量轮动策略
|
||||
目标:从"单票择时"升级到"多标的轮动"。
|
||||
策略:每月末看过去 N 日涨幅,持有最强的一只。
|
||||
"""
|
||||
import pandas as pd, numpy as np
|
||||
from lib_quant import get_daily, net_value, stats
|
||||
|
||||
POOL = {"600519": "贵州茅台", "000001": "平安银行", "300750": "宁德时代",
|
||||
"601318": "中国平安", "000858": "五粮液"}
|
||||
LOOKBACK, FREQ = 20, 20 # 回看20日,每20个交易日调仓
|
||||
|
||||
px = {}
|
||||
for c in POOL:
|
||||
d = get_daily(c, "20200101", "20241231")[["日期", "收盘"]].set_index("日期")
|
||||
px[c] = d["收盘"]
|
||||
prices = pd.DataFrame(px).dropna()
|
||||
mom = prices.pct_change(LOOKBACK)
|
||||
|
||||
rets = []
|
||||
cur = None
|
||||
for i in range(LOOKBACK, len(prices) - 1):
|
||||
if (i - LOOKBACK) % FREQ == 0: # 调仓日
|
||||
cur = mom.iloc[i].idxmax() # 动量最强
|
||||
if cur is not None:
|
||||
r = prices[cur].iloc[i + 1] / prices[cur].iloc[i] - 1
|
||||
rets.append(r)
|
||||
else:
|
||||
rets.append(0.0)
|
||||
|
||||
s = pd.Series(rets)
|
||||
print("== 动量轮动 ==", stats(s))
|
||||
print("== 等权买入持有 ==", stats(prices.pct_change().mean(axis=1).iloc[LOOKBACK:]))
|
||||
|
||||
# 思考题:
|
||||
# 1) 换 LOOKBACK (10/60/120) 看结果——动量在A股有效吗?
|
||||
# 2) 为什么不持有全部、按动量加权?(提示: 集中 vs 分散)
|
||||
Reference in New Issue
Block a user