使用Elasticsearch计算布林带宽度指标
布林帶寬度(Bollinger Band Width)是美國股市分析家約翰·布林于2010年發明,用于測量布林帶(Bollinger Bands于1980年發明)上下軌道線之間的相對距離。它隨帶寬變窄而減小,而隨著帶寬放寬而增加。因為布林帶基于標準差,所以帶寬的波動幅度可以反映波動性,并且可視為波動率指標。布林帶由三條不同的線組成,包括簡單移動平均線及正負距離兩個標準差的上下軌道線。可為日常股票交易決策提供參考依據,是金融市場常用的技術指標之一。
要計算布林帶寬度,第一步要先計算布林帶,計算方法如下:
在公式中:
-
p = 價格
-
window = 移動平均線涉及的滑動窗口(通常為20或26)
-
SMA = 使用簡單模型的移動平均值
-
SD = 標準差
-
n = 數字(通常為2,即2倍標準差)
-
BBU =布林帶上軌道線
-
BBL = 布林帶下軌道線
-
BBW = 布林帶寬
一般來說,布林帶指標常用于股票市場,在本文中,我們嘗試將其用于股票型公募基金,以復權單位凈值代替價格。 并且使用Elasticsearch作為分析的計算工具。以下示例使用基金名稱工銀高端制造股票基金,代碼為000793.OF,日期從2021年01月01日到2021年04月30日的數據。假設我們的 Elasticsearch 服務器有一個索引,包括三個字段,基金代碼(ts_code)、復權單位凈值(adj_nav)和公告截止日期(end_date)。數據映射如下:
以下步驟說明操作流程,同時演示REST API請求主體的代碼:
使用帶有必要條件(must)子句的布林查詢(bool query)來收集基金代碼為000793.OF,和公告截止日期從2020年12月01日到2021年04月30日的文檔。 由于需要計算移動平均值,因此多增加了前一個月的數據(從2020年12月01日到2020年12月31日)。
使用名為BBI的日期直方圖(date_histogram)存儲桶聚合,并配合參數field(字段)為end_date和interval(間隔)為 1d(1天),提取每日的復權單位凈值(adj_nav)。由于子聚合使用管道(pipeline)聚合而無法直接采用文檔字段,所以額外使用平均值(avg)聚合獲取每日的復權單位凈值,聚合名稱為Daily。(Elasticsearch中的數據提取自Tushare大數據開放社區,若當天沒有公布的值,其值的計算方法是從其前后公布的值推算而來。)
由于增加了一個月的數據,而后續操作要計算布林帶寬度的平均值,因此需要存儲桶的日期作為篩選的限制條件。我們可以使用名為DateStr的最小值聚合間接取得日期,Elasticsearch的日期用新紀元時間(Epoch Time) 表示,并且以毫秒為單位,時區為UTC。
使用名為SMA的移動函數(moving_fn)聚合,并配合參數window為26和參數buckets_path(存儲桶路徑)為Daily來計算adj_nav的26天簡單移動平均值。SMA使用未加權平均函數(MovingFunctions.unweightedAvg)來計算。
使用名為SD的移動函數(moving_fn)聚合,并配合參數window為26和參數buckets_path為Daily的值來計算SMA的26天簡單移動平均值的標準差。SD使用標準差函數(MovingFunctions.stdDev)來計算。
使用名為BBU和BBL的存儲桶腳本(bucket_script)聚合,并配合參數buckets_path指定使用SMA聚合的值、SD聚合的值和2個標準差的值來計算布林帶上下限的值。
使用名為BBW的存儲桶腳本(bucket_script)聚合,并配合參數buckets_path指定使用BBU聚合的值、BBL聚合的值和SMA聚合的值來計算布林帶寬度指標。
在特定情況下,布林帶寬度指標可用于識別交易信號,例如使用布林帶擠壓指標(Bollinger Band Squeeze)來辨認該標的是否進入盤整狀態,但本文不會涉及和討論它。在本文的開頭曾經提到布林帶寬度可被視為波動率指標,在這里,我們嘗試使用布林帶寬度覆蓋的區域面積來表示該基金在該段期間內的波動程度。而區域的面積可以使用帶寬的平均值替代,平均值越大表示該標的在該段期間內波動性越大。操作流程延續步驟7(計算布林帶寬度),在使用桶平均值(avg_bucket)聚合前一個階段結果之前,使用名為SBBW的桶選擇器(bucket_selector)聚合過濾掉額外一個月的文檔(日期從2020年12月01日到2020年12月31日的數據)。過濾條件為儲桶日期等于或大于2020年01月01日以毫秒為單位的新紀元時間(1609459200000) ,時區為UTC。下面顯示代碼片段:
"SBBW": {"bucket_selector": {"buckets_path": {"DateStr":"DateStr"},"script": "params.DateStr >= 1609459200000L"}}}},選擇合適的時間范圍后,再進行名為avg_BBW的桶平均值聚合,并配合參數buckets_path指定BBI>BBW來計算布林帶寬度平均值,工銀高端制造股票基金在該期間內的桶平均值聚合結果為0.13690832010057521。以下演示相關代碼:
"avg_BBW": {"avg_bucket": {"buckets_path": "BBI>BBW"}} }假若我們收集了各種類型相關基金在該段期間內的布林帶寬度指標的平均值,并且將這些數據文檔索引到名為 bbw 的索引。那么我們可以對該索引使用百分位等級(percentiles)聚合計算該值在相關股票基金的百分比排名。索引bbw的數據映射可以設計如下,其中包括六個字段,基金代碼(ts_code)、布林帶寬度指標的平均值(avg_bbw)、(fund_type)、(invest_type)和開始及結束日期(start_end_date)。以下演示相關的代碼:
"mappings": {"dynamic": "false","properties": {"ts_code": { "type": "keyword" },"management": { "type": "keyword" },"avg_bbw": { "type": "float" },"fund_type": { "type": "keyword" },"invest_type": { "type": "keyword" },"start_end_date": {"type": "keyword"}}}以下演示基金管理公司為工銀瑞信基金所管理的54支股票型基金,在2021年01月01日到2021年04月30日期間內的百分位分布狀況與工銀高端制造股票基金的百分位等級請求代碼:
{"query":{"bool":{"must": [{"term": { "management":"工銀瑞信基金" }},{"term": { "fund_type" : "股票型" }},{"term": { "start_end_date" : "20210101_20210430" }}]}},"aggs" : {"BBW_Dist" : {"percentiles" : {"field" : "avg_bbw"}},"Rank" : {"percentile_ranks" : {"field":"avg_bbw", "values":[ 0.13690832010057521]}}} }結果得出的百分比排名約為88%。與同一銀行管理的股票基金相比,該基金在此期間的波動性較高。布林帶寬度平均值的分布情況如下:
"BBW_Dist": {"values": {"1.0": 0.044885078072547914,"5.0": 0.04725874215364456,"25.0": 0.0701846033334732,"50.0": 0.09941961616277695,"75.0": 0.11936021596193314,"95.0": 0.1485669195652008,"99.0": 0.15173230290412903}},"Rank": {"values": {"0.13690832010057521": 88.1280778188255}}對于一組相關標的的基金樣本,將布林帶寬度平均值的相對百分比,作為局部時間段的相關波動性的參考值是非常有趣的新試驗。根據文中使用 的Elasticsearch實現代碼,顯示可以無縫對接而且容易理解。感興趣的讀者可以進一步參考gitee的開源項目使用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 新書之一。
總結
以上是生活随笔為你收集整理的使用Elasticsearch计算布林带宽度指标的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python二重积分_用python求一
- 下一篇: 社保二季度亲自加仓三股遭套