什么是美林时钟呢?
著名的美林时钟是美林证券提出的一个资产配置框架,用于指导投资者根据宏观经济周期(经济增长和通胀变化)的不同阶段,调整股票、债券、商品和现金等资产的配置比例。其核心逻辑是将经济周期分为四个阶段,告诉你什么时候该买啥:
复苏期(经济好、通胀低):买股票
过热期(经济好、通胀高):买大宗商品
滞胀期(经济差、通胀高):囤现金
衰退期(经济差、通胀低):买长期债券
什么是动量轮动呢?
动量轮动是一种投资策略,核心思想是“追涨杀跌”——买近期涨得猛的资产,卖掉涨不动的,靠趋势赚钱。
具体怎么玩?
1、选轮动组合:比如股票、债券、大宗商品等。
2、比谁强:定期(比如每周)看哪些资产最近涨得最好。
3、调仓:买入排名靠前的“动量强者”,卖掉跌出前排的“弱鸡”。
如果把美林时钟和动量轮动结合会怎么样呢?
轮动组合:创业板,纳指,黄金,国债。创业板和纳指代表美林时钟中的股票,黄金代表商品,国债代表债券。
轮动规则:比较创业板、纳指和黄金近20日涨幅,取排名第一的,当向上突破20日高点时买入,向下突破20日低点时卖出。如果三个都不符合买入条件,就持有国债。美林时钟的难点是周期切换难以精准判断,结合动量轮动后直接用是否形成突破来判断,简单粗暴有效。
看下QMT历史实盘回测效果:
代码讲解:
#encoding:gbk
import numpy as np
import pandas as pd
import math
class A():
pass
a=A()
#初始化函数
def init(C):
print('运行')
C.acct = '39130129'
C.acct_type = 'STOCK'
C.etf_pool = ['513100.SH','159915.SZ','159937.SZ']
C.stock = '511130.SH'
#C.etf_pool = C.get_stock_list_in_sector('上证50')
#print(C.etf_pool)
for i in C.etf_pool:
download_history_data(i,'1d','','')
download_history_data(C.stock,'1d','','')
C.m_days = 20 #动量参考天数
C.Num = 1 #购买股票数量
C.run_time('trade','1nDay',"2021-07-25 14:57:00")
def handlebar(C):
#pass
trade(C) #每天运行确保即时捕捉动量变化
print('运行中')
#trade(C) #每天运行确保即时捕捉动量变化
交易逻辑:
def get_rank(C,etf_pool):
score_list = []
px=-1
start_time = timetag_to_datetime(C.get_bar_timetag(C.barpos-C.m_days),'%Y%m%d')
end_time = timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d')
for etf in etf_pool:
data = C.get_market_data_ex(fields=["close","high"],stock_code=[etf], period = "1d", start_time = start_time, end_time = end_time,count=C.m_days)
df = data[etf]
pre_line2 =np.mean(df.close[-21: -1])
if df.close[-1]>pre_line2:
px = 1
y = df['log'] = np.log(df.close)
x = df['num'] = np.arange(df.log.size)
slope, intercept = np.polyfit(x, y, 1)
annualized_returns = math.pow(math.exp(slope), 250) - 1
r_squared = 1 - (sum((y - (slope * x + intercept))**2) / ((len(y) - 1) * np.var(y, ddof=1)))
score = annualized_returns * r_squared * px
score_list.append(score)
"""
print(df.close.pct_change(20)[-1])
score = df.close.pct_change(20)[-1]*px
score_list.append(score)
"""
df = pd.DataFrame(index=etf_pool, data={'score':score_list})
df = df.sort_values(by='score', ascending=False)
rank_list = list(df.index)
print(df)
print('最大',df['score'].max())
if df['score'].max()<0:
rank_list = ['511130.SH']
return rank_list
else:
return rank_list
本策略采用梅林时钟策略,叠加动量策略,所有选取品种,都是历史长期优势品种,基本面稳定。
总结:
通过本文的学习,相信你已经掌握如何在QMT学会美林时钟策略了。希望本文可以帮助你!