天天看點

阿裡雲InfluxDB®教你玩轉A股資料

阿裡雲 InfluxDB®

目前已經商業化,專注于處理高寫入和查詢負載的時序資料,用于存儲大規模的時序資料并進行實時分析,包括來自DevOps監控、車聯網、智慧交通、金融和IOT傳感器資料采集。

本文首先介紹時序資料庫的發展,然後具體介紹阿裡雲InfluxDB®的功能。由于金融中股票交易具有高頻和時間屬性,非常符合InfluxDB的應用場景,最後提供了一個在阿裡雲InfluxDB® 建立的TIG(Telegraf/InfluxDB/Grafana)執行個體資訊,采集了部分滬深股票交易資訊,供使用者登陸操作實踐,更深入地了解時序資料和阿裡雲InfluxDB®。

時序資料

時序資料發展

時序資料發展到當下,主要經曆了三個階段:基于關系型資料庫的存儲,基于通用大資料的存儲系統,以及垂直型時序資料庫系統。每個階段均出現代表性産品,如

RRDTool

,

OpenTSDB InfluxDB

等。

  • 基于關系型資料庫存儲:這類系統處理的資料模型比較單一,缺乏針對時間的特殊優化,單機容量受限,處理時序資料的效率相對不高;
  • 基于通用大資料存儲:伴随着大資料和Hadoop的發展,借助HBase等存儲系統,利用時序的特性規避部分通用存儲的劣勢,在資料模型設計方面做了很多的改進,但時序的發展與存儲發展路線不統一,缺乏定制化,往往會受制于底層存儲,如索引技術,查詢過濾機制等。
  • 垂直型時序資料庫:随着kubenetes, 微服務,IOT市場的崛起,針對時序資料的存儲産品慢慢湧現,如InfluxDB專門針對時序的TSM存儲引擎,Gorilla壓縮,以及面向時序的視窗計算函數p99等。
    阿裡雲InfluxDB®教你玩轉A股資料

目前時序資料庫呈現百家争鳴的狀态,傳統資料庫朝着分布式方向發展,如

TimeScaleDB

;OpenTSDB緊跟大資料的存儲計算分離架構;InfluxDB TICK內建資料采集、分析和告警等。上圖是DB Engine給出的關于時序資料庫的排名,InfluxDB位于最受喜愛的時序資料庫行列,也是阿裡雲将其開源托管的重要原因。

時序資料模型

下面将針對于InfluxDB資料模型來介紹時序資料。

阿裡雲InfluxDB®教你玩轉A股資料
  • 時間線(time series): 測量值(measurement)與标簽(tagset)的組合
  • 時間點(time series point): 一個具體的時間戳下,某條時間線中,某些field的值。

    時間線用于在寫入和查詢時對資料做快速比對,關聯時序資料索引,是以時間線的膨脹會引起時序索引結構膨脹,占用過多記憶體空間和比對效率降低。在股票交易資料結構中,由于股票代碼(code), 股票名稱(name), 所屬行業(industry)并不經常改變,是以在模型設計的過程中,可以将這些設為tagkey;成交價格(price),成交手(volume),成交金額(amount)這些要記錄的值随時間會不斷變動,我們将其放入field中,進行數值存儲和函數計算。上圖中:

時間線:

tick_data,industry=銀行,name=平安銀行,code=000001.SZ           

時間點:

tick_data,industry=銀行,name=平安銀行,code=000001.SZ price=10.86,volume=2295,amount=2492370 2015-09-23T09:25:01Z
tick_data,industry=銀行,name=平安銀行,code=000001.SZ price=10.85,volume=128,amount=138847 2015-09-23T09:30:32Z           

時序資料寫入

關于阿裡雲InfluxDB®執行個體的購買和時序資料的寫入具體可以參考

阿裡雲官方文檔

阿裡雲InfluxDB®教你玩轉A股資料

如上圖所示的存儲結構中,為了更好管理曆史資料,InfluxDB推出了資料保留政策(Retention Policies),用來定義資料的保留時間。資料保留政策(RP) 用來定義資料在InfluxDB中存放的時間,或者定義儲存某個期間的資料。在阿裡雲InfluxDB®管理控制台,我們可以自定義曆史資料的保留時長。

下面為采集A股日成交(daily)和日行情(tick_data)的時間線情況:

> use stock
Using database stock
> show series limit 10
key
---
daily,area=上海,industry=IT裝置,list_date=19901219,name=方正科技,symbol=600601,code=600601.SH
daily,area=上海,industry=IT裝置,list_date=20170607,name=恒為科技,symbol=603496,code=603496.SH
daily,area=上海,industry=專用機械,list_date=20150320,name=創力集團,symbol=603012,code=603012.SH
daily,area=上海,industry=專用機械,list_date=20150527,name=華銘智能,symbol=300462,code=300462.SZ
daily,area=上海,industry=專用機械,list_date=20150630,name=沃施股份,symbol=300483,code=300483.SZ
daily,area=上海,industry=專用機械,list_date=20160607,name=上海滬工,symbol=603131,code=603131.SH
daily,area=上海,industry=專用機械,list_date=20160812,name=上海亞虹,symbol=603159,code=603159.SH
daily,area=上海,industry=專用機械,list_date=20161018,name=古鳌科技,symbol=300551,code=300551.SZ
daily,area=上海,industry=專用機械,list_date=20170113,name=至純科技,symbol=603690,code=603690.SH
daily,area=上海,industry=專用機械,list_date=20170314,name=克來機電,symbol=603960,code=603960.SH
> use tick
Using database tick
> show series limit 10
key
---
tick_data,area=上海,industry=區域地産,list_date=19961210,name=榮豐控股,symbol=000668,code=000668.SZ
tick_data,area=上海,industry=區域地産,list_date=19970925,name=三湘印象,symbol=000863,code=000863.SZ
tick_data,area=雲南,industry=中成藥,list_date=19931215,name=雲南白藥,symbol=000538,code=000538.SZ
tick_data,area=雲南,industry=全國地産,list_date=19961205,name=美好置業,symbol=000667,code=000667.SZ
tick_data,area=雲南,industry=房産服務,list_date=19940202,name=我愛我家,symbol=000560,code=000560.SZ
tick_data,area=雲南,industry=機械基件,list_date=19990415,name=雲内動力,symbol=000903,code=000903.SZ
tick_data,area=雲南,industry=銅,list_date=19980602,name=雲南銅業,symbol=000878,code=000878.SZ
tick_data,area=雲南,industry=鋁,list_date=19980408,name=雲鋁股份,symbol=000807,code=000807.SZ
tick_data,area=内蒙,industry=化工原料,list_date=19970131,name=遠興能源,symbol=000683,code=000683.SZ
tick_data,area=内蒙,industry=煤炭開采,list_date=19970606,name=平莊能源,symbol=000780,code=000780.SZ           

函數分析

InfluxDB提供了豐富的

計算函數

幫助我們進一步挖掘資料的價值。InfluxQL函數分為四大類:聚合(aggregate)、選擇(select)、轉換(transform)和預測(predict)。

聚合

阿裡雲InfluxDB®支援的聚合函數有:

COUNT()

DISTINCT() INTEGRAL() MEAN() MEDIAN() MODE() SPREAD() STDDEV() SUM()

查詢某支股票2019-10-21日共成交了多少手:

> select sum(volume) from tick_data where code='000001.SZ' and time >= '2019-10-21T00:00:00Z' and time <= '2019-10-21T23:59:59Z'
name: tick_data
time                 sum
----                 ---
2019-10-21T00:00:00Z 945952           

查詢某支股票2019-10-21日每小時的成交額(元):

> select sum(amount) from tick_data where code='000001.SZ' and time >= '2019-10-21T00:00:00Z' and time <= '2019-10-21T23:59:59Z' group by time(1h)
name: tick_data
time                 sum
----                 ---
2019-10-21T00:00:00Z
2019-10-21T01:00:00Z
2019-10-21T02:00:00Z
2019-10-21T03:00:00Z
2019-10-21T04:00:00Z
2019-10-21T05:00:00Z
2019-10-21T06:00:00Z
2019-10-21T07:00:00Z
2019-10-21T08:00:00Z
2019-10-21T09:00:00Z 363351603
2019-10-21T10:00:00Z 531834212
2019-10-21T11:00:00Z 88167896
2019-10-21T12:00:00Z
2019-10-21T13:00:00Z 207135153
2019-10-21T14:00:00Z 372167894
2019-10-21T15:00:00Z 26619332
2019-10-21T16:00:00Z
2019-10-21T17:00:00Z
2019-10-21T18:00:00Z
2019-10-21T19:00:00Z
2019-10-21T20:00:00Z
2019-10-21T21:00:00Z
2019-10-21T22:00:00Z
2019-10-21T23:00:00Z           

選擇

BOTTOM() FIRST() LAST() MAX() MIN() PERCENTILE() SAMPLE() TOP()

查詢某支股票2019-10-21日P99的成交價格:

> select percentile(price, 90) from tick_data where code='000001.SZ' and time >= '2019-10-21T00:00:00Z' and time <= '2019-10-21T23:59:59Z'
name: tick_data
time                 percentile
----                 ----------
2019-10-21T10:27:42Z 16.91           

随機對某支股票2019-10-21日9:00am~3:00pm成交價格進行平均采樣:

> select sample(price, 10) from tick_data where code='000001.SZ' and time >= '2019-10-21T09:00:00Z' and time <= '2019-10-21T15:00:00Z'
name: tick_data
time                 sample
----                 ------
2019-10-21T10:27:18Z 16.93
2019-10-21T11:02:48Z 16.82
2019-10-21T11:11:36Z 16.87
2019-10-21T13:19:21Z 16.78
2019-10-21T13:22:24Z 16.77
2019-10-21T13:41:09Z 16.78
2019-10-21T13:44:18Z 16.78
2019-10-21T14:19:15Z 16.83
2019-10-21T14:19:21Z 16.83
2019-10-21T14:22:30Z 16.85           

轉換

阿裡雲InfluxDB®支援的轉換函數有:

ABS() ACOS() ASIN() ATAN() ATAN2() CEIL() COS() CUMULATIVE_SUM() DERIVATIVE() DIFFERENCE() ELAPSED() EXP() FLOOR() HISTOGRAM() LN() LOG() LOG2() LOG10() MOVING_AVERAGE() NON_NEGATIVE_DERIVATIVE() NON_NEGATIVE_DIFFERENCE() POW() ROUND() SIN() SQRT() TAN()

計算某支股票2019-10-21日每15分鐘成交價格的變化:

> select derivative(mean(price)) from tick_data where code='000001.SZ' and time >= '2019-10-21T00:00:00Z' and time <= '2019-10-21T23:59:59Z' group by time(15m)
name: tick_data
time                 derivative
----                 ----------
2019-10-21T09:30:00Z 0.18167224080267985
2019-10-21T09:45:00Z 0.049361092530652684
2019-10-21T10:00:00Z 0.13140000000000995
2019-10-21T10:15:00Z 0.10268372352284771
2019-10-21T10:30:00Z 0.02356981183064022
2019-10-21T10:45:00Z -0.02005673170050315
2019-10-21T11:00:00Z -0.056542594898782994
2019-10-21T11:15:00Z 0.02164948213387774
2019-10-21T11:30:00Z -0.0037370242214223026
2019-10-21T13:00:00Z -0.009116331096188665
2019-10-21T13:15:00Z -0.026667201136095997
2019-10-21T13:30:00Z -0.010301478953412158
2019-10-21T13:45:00Z 0.03505827505824399
2019-10-21T14:00:00Z 0.029964323811768168
2019-10-21T14:15:00Z 0.012986349675813358
2019-10-21T14:30:00Z 0.02997171129489118
2019-10-21T14:45:00Z 0.026839533796877646
2019-10-21T15:00:00Z -0.013153526970953067           

計算某支股票2019年10月的月K線情況:

> SELECT moving_average(last("close"), 30) FROM "daily" WHERE ("code" = '000001.SZ') AND time >= '2019-09-01T00:00:00Z' and time <= '2019-10-31T00:00:00Z' GROUP BY time(1d) fill(previous)
name: daily
time                 moving_average
----                 --------------
2019-10-01T00:00:00Z 14.985999999999994
2019-10-02T00:00:00Z 15.023999999999994
2019-10-03T00:00:00Z 15.066999999999991
2019-10-04T00:00:00Z 15.105333333333325
2019-10-05T00:00:00Z 15.13899999999999
2019-10-06T00:00:00Z 15.16499999999999
2019-10-07T00:00:00Z 15.19099999999999
2019-10-08T00:00:00Z 15.237333333333321
2019-10-09T00:00:00Z 15.289333333333323
2019-10-10T00:00:00Z 15.345666666666656
2019-10-11T00:00:00Z 15.420666666666655
2019-10-12T00:00:00Z 15.491666666666655
2019-10-13T00:00:00Z 15.562666666666654
2019-10-14T00:00:00Z 15.64733333333332
2019-10-15T00:00:00Z 15.730666666666654
2019-10-16T00:00:00Z 15.808666666666655
2019-10-17T00:00:00Z 15.890666666666654
2019-10-18T00:00:00Z 15.960666666666652
2019-10-19T00:00:00Z 16.01633333333332
2019-10-20T00:00:00Z 16.05533333333332
2019-10-21T00:00:00Z 16.10699999999999
2019-10-22T00:00:00Z 16.14299999999999
2019-10-23T00:00:00Z 16.177666666666656
2019-10-24T00:00:00Z 16.21899999999999
2019-10-25T00:00:00Z 16.241333333333323
2019-10-26T00:00:00Z 16.264999999999993
2019-10-27T00:00:00Z 16.282333333333327
2019-10-28T00:00:00Z 16.29966666666666
2019-10-29T00:00:00Z 16.316999999999997
2019-10-30T00:00:00Z 16.344666666666665
2019-10-31T00:00:00Z 16.372333333333334           

預測

阿裡雲InfluxDB®支援的預測函數有:

HOLT_WINTERS()

HOLT_WINTERS采用季節性方法傳回N個預測的Field Value。HOLT_WINTERS可用于:

  • 預測時間什麼時候會超過給定的門檻值
  • 将預測值與實際值進行比較,檢測資料中的異常

    對降雨量和氣溫的預測我們常常可以采用此方法,由于股票交易周期性不明顯,在此便不再贅述。

報表展示

Grafana接入阿裡雲InfluxDB®可以

參考文檔

,下圖在Grafana上展示了某支股票近5年的交易情況:

阿裡雲InfluxDB®教你玩轉A股資料

資料告警

Grafana告警

如下圖所示,Grafana支援簡單的資料告警,使用者可以根據需求自定義告警規則:

阿裡雲InfluxDB®教你玩轉A股資料

Kapacitor告警

Kapacitor

作為TICK生态中的資料處理架構,用于告警、ETL(Extract-Transform-Load)和檢測異常。主要特性包含:

  • 既可以處理流資料(streaming data),也可以處理批量資料(batch data)
  • 定期從InfluxDB查詢資料,執行InfluxQL支援的函數,并将處理結果存回InfluxDB
  • 支援添加使用者自定義的函數檢測異常
  • 與HipChat、OpsGenie、Alerta、Sensu、PagerDuty和Slack等內建

    下面的price.tick腳本以batch的方式處理某支股票的成交價格并設定告警提示:

batch
    |query('''
        SELECT max(price) AS mprice
        FROM "tick"."rp1"."tick_data"
        WHERE "code" = "000001.SZ"
    ''')
        .period(1d)
        .cron('*/5 * * * *')
    |alert()
        .warn(lambda: "mprice" >= 18.5)
    |influxDBOut()
        .database('alert')
        .measurement('price')
        .tag('kapacitor', 'true')           

運作kapacitor define max-price -tick price.tick -type batch -dbrp tick.rp1 和kapacitor enable max-price便會每5分鐘以batch的方式擷取股票最高成交價格并告警提示,在alert中可以添加email或者hook推送報警。

總結

目前內建TIG(Telegraf/InfluxDB/Grafana)生态的阿裡雲InfluxDB®已經上線,使用者可以在

阿裡雲官網

直接購買。目前我們采集了一些滬深股票的日線、曆史交易日的分筆資料,以及執行個體運作主機的cpu、磁盤、記憶體監控,提供展示Demo供使用者實踐更好地了解時間序列資料和阿裡雲InfluxDB®。

阿裡雲InfluxDB®教你玩轉A股資料

參考文獻

  1. 淺談時序資料庫那些事
  2. TSDB for InfluxDB®與自建InfluxDB對比優勢
  3. 阿裡雲時序資料庫InfluxDB®首頁
  4. 5分鐘快速完成系統監控搭建實踐

繼續閱讀