当 MACD 与布林带在 Elasticsearch中结合时, …

转载来自作者在博客园的王博分享

移动平均收敛发散 (MACD) 是基于趋势和动量的指标,而布林带 (BB) 是基于波动率的指标。 当MACD与BB结合时,一些专业人士称其为MACD BB,另一些专业人士称其为BB MACD,本文使用名称 MACD BB。 两个技术分析指标的组合继承了原本的两个能力,提供对市场趋势的洞察力。 从密集的网络搜索来看,没有一处记载说是谁发明了这个指标。 如果有读者知道,请分享来源。然而,许多交易平台和论坛都提供此指标并且视为高级功能。 建议读者阅读我之前发表的两篇文章,可以快速对这两个指标以及使用 Elasticsearch 的实现有一个基本的了解。根据使用Elasticsearch构建MACD直方图文中描述的方程, MACD 涉及每日价格(Daily)的短期和长期指数加权移动平均线 (EWMA)。 这两个周期的常见用法是 12 和 26。
在这里插入图片描述

使用Elasticsearch计算布林带宽度指标一文中, BB根据每日价格的简单移动平均线(SMA)和标准差(SD)来构建上轨道线(BBU)和下轨道线(BBL),而中线是SMA。 从 MACD BB 的术语直观可知,它使用 MACD 而不是每日价格。 BBL 和 BBU 的计算方法如下,其中window为滑动窗口 ,n为 标准差。
在这里插入图片描述

基本上,将MACD、BBU 和 BBL一起绘制在图表上,用户可以容易观察到 MACD 和两个轨道线的交叉点。 当MACD上升越过BBU时,意味着强劲的上升趋势信号。 同样,当MACD下降越过BBL时,意味着强烈的下行信号。 若使用图形来描述含义要容易得多。 本文尝试将 MACD BB 应用Tushare大数据开放社区提供的股票型公募基金,并专注于将 Elasticsearch 作为分析工具。 下面的例子随机选择了"工银前沿医疗股票C基金" (代码为010685.OF)。 数据选自提供的 2021年01月01日到2021年04月30日之间的时间范围。根据很多网上文章的实现方法,在计算BB时,MACD选用的SMA周期是10,而标准差是1。
下图绘制了 MACD 及其 BBL、BBU 和 SMA。 如果 MACD 值高于 BBU 并且与前一个时间戳中的MACD值相比是一个增量,使用水蓝色点。 如果 MACD 值高于 BBU 且为减量,则为蓝色点。 如果 MACD 值低于 BBL 且为减量,则为红色点。 如果 MACD 值低于 BBL 并且是一个增量,则为橙色点。 对于其他情况,则为灰色点。 读者可以很容易地观察到红色/橙色线低于 BBL,蓝色/水蓝色线高于 BBU。 此外,当 MACD 值从零以下上升并越过零时,(产生看涨信号),在大多数情况下紧随其后会出现相应的水蓝色点。 同理,当 MACD 值从零上方跌破零时(产生看跌信号),相应的红色点将随之而来。 线的斜率表示趋势的动量。
在这里插入图片描述
  然而,当尝试结合每日价格来解释MACD值从BBU或BBL越过零点时,它与价格的上升或下降趋势不一定匹配,如下图所示。因此,波动性增加的潜在迹象促进未来可能的交易机会并不容易捕捉到,有候时判断方向会与结果完全不同。大多数股票交易学习和实践平台都提供MACD BB指标,并给出相同的评价“这个指标不适合新手”。
在这里插入图片描述
  本文所使用的 Elasticsearch 实例显示无缝整合且易于理解。假设已经有一个存在数据的 Elasticsearch 索引,使用的数据映射与之前发表的文章(使用Elasticsearch计算布林带宽度指标)相同。 以下步骤演示了 REST API 请求正文。

  1. 通过搜索操作收集所有相关文档
    使用带有必要条件(must)子句的布林查询(bool query)来收集基金代码为010685.OF,和公告截止日期从2021年01月01日到2021年04月30日的文档。 由于需要计算26天的移动平均值,因此增加了一个月的数据(从2020年12月01日到2020年12月31日)。
{
    "query": {
        "bool": {
            "must": [
                {"range": {"end_date": {"gte": "20201201", "lte": "20210430"}}},
               {"term": {"ts_code": "010685.OF"}}
            ]
        }
    },
  1. 提取每日的复权单位净值
    使用名为MACD_Histogram日期直方图(date_histogram)存储桶聚合,并配合参数field(字段)为end_date和interval(间隔)为 1d(1天),提取每日的复权单位净值(adj_nav)。由于子聚合使用管道(pipeline)聚合而无法直接采用文档字段,所以额外使用平均值(avg)聚合获取每日的复权单位净值,聚合名称为Daily。(若当天基金没有公布的值,其值的计算方法是从其前后公布的值推算而来。)
    "aggs": {
        "MACD_Histogram": {
            "date_histogram": {
                "field": "end_date",
                "interval": "1d",
                "format": "yyyyMMdd"
            },
            "aggs": {
                "Daily": {
                    "avg": {"field": "adj_nav"}
                },
  1. 提取存储桶的日期
    由于增加了一个月的数据,而后续操作需要过滤掉额外的文档,因此以存储桶的日期作为筛选限制条件。我们可以使用名为DateStr的最小值聚合间接取得日期,Elasticsearch的日期用新纪元时间(Epoch Time) 表示,并且以毫秒为单位,时区为UTC。
                "DateStr": {
                    "min": {"field": "date"}
                },
  1. 计算12 天和 26 天的指数加权移动平均值
    使用名为EWMA12的移动函数(moving_fn)聚合,并配合参数window为12和参数buckets_path(存储桶路径)为Daily来计算adj_nav的12天简单移动平均值。指数加权平均函数使用(MovingFunctions.ewma)并配合参数alpha为2/(window+1)来计算。
                "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"}
                },
  1. 计算MACD
    使用名为MACD的存储桶脚本(bucket_script)聚合,并配合参数buckets_path指定使用EWMA12和EWMA26聚合的值,并根据前述方程来计算MACD指标。
               "MACD": {
                    "bucket_script": {
                        "buckets_path": {
                            "EWMA12": "EWMA12",
                            "EWMA26": "EWMA26"
                        },
                        "script": "params.EWMA12 - params.EWMA26"
                    }
                },
  1. 计算MACD每日的简单移动平均值
    使用名为SMA10的移动函数(moving_fn)聚合,并配合参数window为10和参数buckets_path(存储桶路径)为MACD来计算10天简单移动平均值。SMA10使用未加权平均函数(MovingFunctions.unweightedAvg)来计算。
                "SMA10": {
                    "moving_fn" : {"script":"MovingFunctions.unweightedAvg(values)", "window":10, "buckets_path":"MACD"}
                },
  1. 计算每日MACD的标准差
    使用名为SD的移动函数(moving_fn)聚合,并配合参数window为10和参数buckets_path为MACD的值来计算10天的标准差。SD10使用标准差函数(MovingFunctions.stdDev)来计算。
                "SD10": {
                    "moving_fn": {"script":"MovingFunctions.stdDev(values, MovingFunctions.unweightedAvg(values))", "window":10, "buckets_path":"MACD"}
                },
  1. 计算 MACD BB
    使用名为BBU10和BBL10的存储桶脚本(bucket_script)聚合,并配合参数buckets_path指定使用SMA10聚合的值、SD10聚合的值和1个标准差的值来计算布林带上下轨道线的值。
                "BBU10": {
                    "bucket_script": {
                        "buckets_path": {
                            "SMA": "SMA10",
                            "SD": "SD10"
                        },
                        "script": "params.SMA + params.SD"
                    }
                },
                "BBL10": {
                    "bucket_script": {
                        "buckets_path": {
                            "SMA": "SMA10",
                            "SD": "SD10"
                        },
                        "script": "params.SMA - params.SD"
                    }
                },
  1. 确定MACD 值是在上升趋势还是下降趋势内
      a) 使用名为MACD_Diff的导数(derivative)聚合,并配合参数buckets_path指定MACD聚合的值来确定它与前一个时间戳的MACD值,是增量还是减量。
                "MACD_Diff": {
                    "derivative": {
                        "buckets_path": "MACD" 
                     }
                },

b) 使用名为MACDType的存储桶脚本(bucket_script)聚合,并配合参数buckets_path指定使用BBL10、 BBU10、 MACD和MACD_Diff聚合的值,对 MACD 值的类型进行分类。
 ♦ 如果MACD < BBL并且MACD_Diff是减量,则为类型1
 ♦ 如果MACD < BBL并且MACD_Diff是增量,则为类型 2
 ♦ 如果MACD > BBU并且MACD_Diff是增量,则为类型 3
 ♦ 如果MACD > BBU并且MACD_Diff是减量,则为类型 4
 ♦ 其他情况为类型 0

                "MACDType": {
                    "bucket_script": {
                        "buckets_path": {
                            "BBL": "BBL10",
                            "BBU": "BBU10",
                            "MACD": "MACD",
                            "MACD_Diff": "MACD_Diff"
                        },
                       "script": "(params.MACD > params.BBU) ? (params.MACD_Diff > 0 ? 3:4) : (params.MACD < params.BBL) ? (params.MACD_Diff > 0 ? 2:1):0"
                    }
                }, 
  1. 输出前过滤掉额外的文档
    使用名为 MACD_BB 的“bucket_selector”聚合,并配合参数“buckets_path”为“DateStr”,“script”语句中指定存储桶的选择条件。 选择标准是日期在 2021 年 2月 1 日及之后的存储桶(以毫秒为单位指定纪元时间 1612137600000)。
                "MACD_BB": {
                "bucket_selector": {
                          "buckets_path": {"DateStr":"DateStr"},
                          "script": "params.DateStr >= 1609459200000L"
                    }
                }
            }
        }
    },
    "size": 0
}
  1. 收集结果后,可以绘制如前图所示。类型 1 为红色点,类型 2 为橙色点,类型 3为水蓝色点,类型 4 为蓝色点,其他则为灰色点。

读者可以进一步参考Gitee上的开源项目(当 MACD 与布林带在 Elasticsearch中结合时) 。

备注:
I. 感谢Tushare大数据开放社区提供相关数据及Gitee开源社区提供存储开源项目。
II. 本文基于公开发布技术和研究观点,并不构成任何投资建议,读者在使用时须自行承担责任。
III. 文中可能还存在疏漏和错误之处,恳请广大读者批评和指正。
IV. 作者的中文著作Elasticsearch 数据分析与实战应用(ISBN 978-7-113-27886-1号)将于2021 年 7 月出版。
V. 作者的英文著作Advanced Elasticsearch 7.0(ISBN 978-1-789-95775-4号)被bookauthority评为 2021 年最值得阅读的 4 本 Elasticsearch 新书之一。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值