移动平均收敛散度 (MACD) 是基于趋势和动量的指标,而 Bollinger 波段 (BB) 是一个基于波动率的指标。 当MACD与BB结合时,一些专业人士称其为MACD BB,另一些专业人士称其为BB MACD。 在本文中,使用名称 MACD BB。 两个技术分析指标的组合继承了两个指标的能力,提供了对市场趋势的洞察。 从我密集的网络搜索来看,无处可说是谁发明了这个指标。 如果有人知道,请分享来源。 但是,许多交易平台和论坛都将此指标作为高级功能提供。 建议读者阅读我之前的两篇文章,快速对这两个指标以及它们使用 Elasticsearch 的实现有一个基本的了解。
根据文章“使用 Elasticsearch 构建 MACD 直方图”,MACD涉及短期和长期指数加权移动平均线(EWMA)。 这两个术语的常见做法是 12 和 26。
在文章“通过 Elasticsearch 计算布林带宽度”,BB根据每日价格的简单移动平均线(SMA)和标准差(SD)构建上带(BBU)和下带(BBL)。 BB 的中线是 SMA。 从 MACD BB 的术语来说,它使用 MACD 而不是价格。 BBL 和 BBU 的计算解释如下,其中滑动窗口(window)为 20 或 26,标准差(n)为 1 或 2,通常做法。
基本上,MACD、BBU 和 BBL 将绘制在图表上,用户可以观察 MACD 和两个波段的交点。 当MACD突破BBU时,显示出强劲的上升趋势信号。 同样,当MACD突破BBL时,显示出强烈的下行信号。 使用图表来描述含义要容易得多。 在本文中,我们尝试将 MACD 和 BB 应用于免佣金交易所交易基金 (ETF),并专注于将 Elasticsearch 作为分析工具。 下面的例子随机选择了“富达国际多因子ETF”。 其股票代码为FDEV。 数据选自投资者交易所 IEX 提供的 1 年 2021 月 31 日至 2021 年 12 月 26 日之间的时间范围。 MACD最常用的参数是短期的10和长期的1。 根据很多网络文章,在计算BB时,SMA的周期是XNUMX,BB的标准差是XNUMX。
在下图中,绘制了 MACD 及其 BBL、BBU 和 SMA。 如果 MACD 值高于 BBU 并且与前面时间戳中的值相比是一个增量,则它是一个水蓝色点。 如果 MACD 值高于 BBU 且为递减,则为蓝点。 如果 MACD 值低于 BBL 且为递减,则为红点。 如果 MACD 值低于 BBL 并且是一个增量,则它是一个橙色点。 对于其他情况,它是一个灰点。 读者可以很容易地观察到红色/橙色线低于 BBL,蓝色/水蓝色线高于 BBU。 此外,当 MACD 值从零以下上升并越过零时(考虑由 MACD 产生的看涨信号),在大多数情况下会紧随其后出现相应的水蓝色点。 同理,当 MACD 值从零上方跌破零时(考虑 MACD 产生的看跌信号),相应的红点将随之而来。 线的斜率表示趋势的动量。
但是,当我们尝试结合典型值来解释MACD值从BBU或BBL突破的点时,它似乎与价格的上升或下降趋势不匹配,如下图所示。 波动性增加的潜在迹象和未来可能的交易机会不容易捕捉,有时方向会逆转。
尽管大多数交易平台都提供MACD BB指标并给出相同的评论,“它不适合新手交易者”,但其Elasticsearch实现显示无缝集成且易于理解。 假设有一个填充有数据的 Elasticsearch 索引,其使用的数据映射与上一篇论文中描述的相同。 以下步骤演示了 REST API 请求正文的代码。
通过搜索操作收集所有相关文件
使用带有“must”子句的“bool”查询来收集符号为FDEV且日期在1年2021月31日至2021年26月1.5日之间的文档。由于计算了15个交易日移动平均线,因此调整了附加数据2021个月(1年2021月XNUMX日至XNUMX年XNUMX月XNUMX日)
{
“询问”: {
“布尔”:{
“必须”: [
{“范围”:{“日期”:{“gte”:“2020-12-15”,“lte”:“2021-05-31”}}},
{"term": {"symbol": "FDEV"}}
]
}
},
计算基金的每日典型值
使用名为 MACD 的“date_histogram”聚合,参数“field”为“date”,参数“interval”为“1d”来提取基金每天的价格。 然后是一个名为 TP 的“scripted_metric”聚合,计算典型价格,它等于最高价、最低价和收盘价的平均价格。
“aggs”:{
“MACD_BB”:{
“日期直方图”:{
"字段": "日期",
"间隔": "1d",
“格式”:“yyyy-MM-dd”
},
“aggs”:{
“TP”:{
“scripted_metric”:{
"init_script": "state.totals=[]",
"map_script": "state.totals.add((doc.high.value+doc.low.value+doc.close.value)/3)",
"combine_script": "double total=0; for (t in state.totals) {total += t} return total",
"reduce_script": "返回状态[0]"
}
},
提取桶的日期
由于额外的数据,后续操作需要稍后过滤掉超出范围的部分。 名为“DateStr”的“min”聚合用于获取存储桶的日期。 在 Elasticsearch 服务器中,日期以纪元时间存储。 时间单位为毫秒,时区为UTC。
“日期字符串”:{
“分钟”:{“字段”:“日期”}
},
选择包含 1 个以上文档的存储桶
为了过滤掉空桶(非交易日),使用名为 STP 的“bucket_selector”聚合来选择文档计数大于 0 的桶。
“STP”:{
“bucket_selector”:{
"buckets_path": {"count":"_count"},
“脚本”:“params.count > 0”
}
},
计算典型值的每日12个交易日和26个交易日的EWMA
使用“moving_fn”聚合,命名为EWMA12,参数window为12,参数“buckets_path”为TP.value,计算典型值的12个交易日EWMA。 EWMA 是使用函数 MovingFunctions.ewma 计算的,参数 alpha 为 2/(window+1)。 EWMA26 聚合可以用同样的方式完成。
“EWMA12”:{
"moving_fn": {"script": "MovingFunctions.ewma(values, 2/(12+1))", "window": 12, "buckets_path": "TP.value"}
},
“EWMA26”:{
"moving_fn" : {"script": "MovingFunctions.ewma(values, 2/(26+1))", "window": 26, "buckets_path": "TP.value"}
},
计算MACD
使用名为 macd 的“bucket_script”聚合和参数“buckets_path”来指定来自 EWMA12 和 EWMA26 的结果。 然后根据脚本中的公式计算 MACD 指标。
“MACD”:{
“bucket_script”:{
“buckets_path”:{
"EWMA12": "EWMA12",
"EWMA26": "EWMA26"
},
“脚本”:“params.EWMA12 - params.EWMA26”
}
},
计算典型值的每日10天简单移动平均线
使用“moving_fn”聚合,命名为SMA10,参数窗口为10,参数“buckets_path”为MACD,计算MACD值的10天SMA。 SMA 使用未加权平均函数 (MovingFunctions.unweightedAvg) 计算。
“SMA10”:{
"moving_fn" :{"script": "MovingFunctions.unweightedAvg(values)", "window":10, "buckets_path":"MACD"}
},
计算典型值的每日 10 天标准差
使用名为 SD10 的“moving_fn”聚合,参数窗口为 10,参数“buckets_path”为 MACD,计算 10 天 MACD 标准偏差。 SD 使用标准偏差函数 (MovingFunctions.stdDev) 计算。
“SD10”:{
"moving_fn": {"script":"MovingFunctions.stdDev(values, MovingFunctions.unweightedAvg(values))", "window":10, "buckets_path":"MACD"}
},
计算MACD BB
使用两个名为 BBU10 和 BBL10 的“bucket_script”聚合,使用参数“buckets_path”来指定来自 SMA10 聚合和 SD10 聚合的结果。 然后,根据 SMA10 加上或减去 SD10 的值计算 BBL10 和 BBU10。
“BBU10”:{
“bucket_script”:{
“buckets_path”:{
"SMA": "SMA10",
“SD”:“SD10”
},
“脚本”:“params.SMA + params.SD”
}
},
“BBL10”:{
“bucket_script”:{
“buckets_path”:{
"SMA": "SMA10",
“SD”:“SD10”
},
“脚本”:“params.SMA - params.SD”
}
},
识别MACD值的类型
a) 使用名为 MACD_Diff 的“衍生”聚合,并带有参数“buckets_path”来指定 MACD 的值,以确定它是从前面时间戳的 MACD 增加还是减少。
“MACD_Diff”:{
“衍生物”:{
"buckets_path": "MACD"
}
},
b) 使用名为 MACDType 的“bucket_script”聚合,参数“buckets_path”指定来自 BBL10、BBU10、macd 和 MACD_Diff 聚合的结果,以对 MACD 值的类型进行分类。
➤ 如果 MACD_Diff 是递减且 macd 值 < BBL,则键入 1
➤ 如果 MACD_Diff 是增量且 MACD 值 < BBL,则键入 2
➤ 如果 MACD_Diff 是增量且 macd 值,则键入 3 > BBU
➤ 如果 MACD_Diff 是递减且 macd 值,则键入 4 > BBU
➤ 其他情况输入 0
“MACD 类型”:{
“bucket_script”:{
“buckets_path”:{
"BBL": "BBL10",
"BBU": "BBU10",
"MACD": "MACD",
"MACD_Diff": "MACD_Diff"
},
"脚本": "(params.MACD > params.BBU) ? (params.MACD_Diff > 0 ? 3:4) : (params.MACD < params.BBL) ? (params.MACD_Diff > 0 ? 2:1):0 ”
}
},
过滤掉额外的输出文件
使用名为 SMACD_BB 的“bucket_selector”聚合,参数“buckets_path”为“DateStr”,以选择“script”语句中指定的正确存储桶。 选择标准是日期在 1 年 2021 月 1612137600000 日或之后的那些桶(纪元时间 XNUMX,以毫秒为单位)。
“SMACD_BB”:{
“bucket_selector”:{
"buckets_path": {"DateStr":"DateStr"},
“脚本”:“params.DateStr >= 1612137600000L”
}
}
}
}
},
“尺寸”:0
}
收集结果后,我们可以绘制如前所示的图形。 类型 3 的点颜色为水蓝色,类型 4 为蓝色,类型 1 为红色,类型 2 为橙色,其他为灰色。
读者可以进一步参考GitHub上的开源项目(MACD_BB)
备注:
一、感谢IEX(Investors Exchange)提供ETF数据,也感谢GitHub提供开源项目存储。
二、 本文基于技术思想,不构成任何投资建议。 读者在使用时须自行承担责任。
三、 文章可能还有错误,还望各位读者指正。
四、 那些有兴趣的读者可以参考作者所著的书籍,了解 Elasticsearch 的所有基本技能。 “Advanced Elasticsearch 7.0”,2019 年 9781789957754 月,Packt,ISBN:XNUMX。