1. 为什么你需要一个全球ETF动量交易系统?
如果你对投资有点兴趣,可能听说过“不要把鸡蛋放在一个篮子里”这句话。但现实是,很多人的“篮子”其实都差不多——A股、基金,或者顶多再加点港股。市场好的时候大家一起涨,市场不好的时候,大家一起跌,这种同涨同跌的体验,相信经历过这几年市场的朋友都深有体会。
那有没有办法,能真正把“篮子”分散到全世界呢?比如,当A股震荡的时候,美股可能正创新高;当科技股调整时,黄金和国债或许在走强。这种全球化的资产配置,能有效平滑我们的投资曲线,降低整体风险。但问题来了,我们普通人怎么去实时跟踪全球这么多市场,又怎么判断该买哪个、卖哪个呢?手动操作几乎不可能。
这就是我今天想跟你分享的,用QMT平台和xtquant库,亲手搭建一个自动化全球ETF动量交易系统。它的核心逻辑很简单:让数据说话,让趋势做主。系统会自动计算全球几十只主流ETF(比如跟踪纳斯达克、标普500、德国DAX、日本日经、黄金、国债的ETF)在过去一段时间的“势头”(也就是动量),然后定期(比如每天收盘前)把资金切换到当前势头最强的几只ETF上。这相当于你拥有了一个不知疲倦的全球市场“扫描仪”和“执行者”。
我刚开始接触量化时,也觉得这玩意儿很高深,全是数学公式和代码。但实际用QMT做下来发现,它其实很“接地气”。你不需要从零搭建复杂的交易接口,QMT的xtquant库已经帮你封装好了对接券商的标准方法;你也不用自己处理繁琐的行情数据,平台提供了稳定的数据源。你要做的,就是把“动量选ETF”这个聪明的想法,用清晰的逻辑写成代码,然后交给系统去7x24小时执行。接下来,我就带你一步步拆解这个系统的代码,从原理到实盘,让你也能拥有自己的“全球资产巡航舰”。
2. 系统核心:动量因子是怎么算出来的?
动量策略听起来高大上,但它的内核非常直观:买涨得好的,卖涨得差的。在我们的系统里,就是定期找出过去一段时间内,上涨趋势最强劲、最稳定的几只ETF。那么,如何用数学来量化这个“强劲且稳定的上涨趋势”呢?这就是动量因子的计算。
我们不会用简单的价格涨跌幅,因为它波动太大,容易受到单日暴涨暴跌的干扰。在提供的策略代码中,使用了一个更稳健的方法:对数价格线性回归的年度化收益率,并结合了拟合优度(R²)。别被名词吓到,我用人话给你解释一下。
假设我们看某只ETF过去60天的收盘价。我们不是直接比较第1天和第60天的价格,而是把这60个价格点画在图上,然后尝试画一条最贴合这些点的、向上或向下的“趋势线”。这条线的斜率,就代表了价格平均每天的增长速度。然后,我们把这个日增长速度复利放大到一年(假设一年250个交易日),就得到了一个“年度化收益率”的估计值。这衡量了趋势的“强度”。
但光有强度还不够。如果价格上蹿下跳,但最终巧合地回到了一个更高的位置,这样画出的趋势线可能斜率也很高,但它的参考意义不大。所以,我们还需要看这条趋势线“拟合”得好不好,也就是所有价格点是不是都老老实实地分布在这条线附近。这个衡量拟合好坏的指标就是R²,它的值在0到1之间,越接近1,说明趋势越稳定、越可靠。
最后,我们把“强度”(年度化收益率)和“可靠性”(R²)乘在一起,得到一个综合“分数”。这个分数高的ETF,就是那种既涨得好、又涨得稳的“优等生”。我们的系统,就定期给池子里的所有ETF打这个分数,然后买入分数最高的前几名。
让我们结合代码片段具体看看:
def get_rank(C, etf_pool):
score_list = []
# 计算过去C.m_days天(例如60天)的起始和结束时间
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:
# 获取该ETF过去C.m_days天的日线收盘价数据
data = C.get_market_data_ex(fields=["close"],stock_code=[etf], period = "1d",
start_time = start_time, end_

1094

被折叠的 条评论
为什么被折叠?



