テクニカル分析(テクニカル分析)インジケーターライブラリとは

TA-Libは、C言語で実装された金融取引テクニカル分析の多くの一般的に使用されるインジケーターをカプセル化するPythonライブラリです。ユーザーがDolphinDBでこれらのテクニカルインジケーターを計算しやすくするために、DolphinDBスクリプトを使用して、TA-Libに含まれるインジケーター関数を実装し、DolphinDB taモジュール (ta.dos)にカプセル化しますtaモジュールを使用するに は、DolphinDB Database Server1.10.3以降必要です

1.関数とパラメーターの命名と使用仕様

  • TA-Libのすべての関数名を大文字で、すべてのパラメーター名を小文字で指定するのとは異なり、taモジュールでは、関数名とパラメーター名はキャメルケースの命名方法を採用しています。

たとえば、TA-LibのDEMA関数の構文はDEMA(close, timeperiod=30)です。taモジュールの対応する関数はdema(close, timePeriod)です。

  • TA-Libの一部の関数には、オプションのパラメーターがあります。taモジュールでは、すべてのパラメーターが必須です。
  • 意味のある結果を得るには、taモジュールの関数のパラメーターtimePeriodが少なくとも2である必要があります。

2.使用例

2.1スクリプトでのインジケーター関数の直接使用

taモジュールのwma関数を使用してベクトルを直接計算します

ta 
close = 7.2 6.97 7.08 6.74 6.49 5.9 6.26 5.9 5.35 5.63 
x = wma(close、5);を使用します。

2.2SQLステートメントのグループでの使用

多くの場合、ユーザーはデータテーブルの各グループで複数のデータセットを計算する必要があります。次の例では、2つの株式を含むデータテーブルを作成します。

close = 7.2 6.97 7.08 6.74 6.49 5.9 6.26 5.9 5.35 5.63 3.81 3.935 4.04 3.74 3.7 3.33 3.64 3.31 2.69 2.72 
date =(2020.03.02 + 0..4 join 7..11).take(20)
symbol = take( `F 、10)join take( `GPRO、10)
t = table(symbol、date、close)

taモジュールのwma関数を使用して、各在庫を計算します

シンボルによるtセットwma = wma(close、5)コンテキストの更新

2.3複数の列の結果を返す

関数など、一部の関数は複数の列に結果を返しますbBands

直接使用の例:

close = 7.2 6.97 7.08 6.74 6.49 5.9 6.26 5.9 5.35 5.63 
low、mid、high = bBands(close、5、2、2、2);

SQLステートメントで使用される例:

close = 7.2 6.97 7.08 6.74 6.49 5.9 6.26 5.9 5.35 5.63 3.81 3.935 4.04 3.74 3.7 3.33 3.64 3.31 2.69 2.72 
date =(2020.03.02 + 0..4 join 7..11).take(20)
symbol = take( `F 、10)join take( `GPRO、10)
t = table(symbol、date、close)  
select *、bBands(close、5、2、2、2)as` high`mid`low from t context by symbol 

symbol dateクローズハイ
ミッドロー-------- ---------- ----- -------- -------- -------- 
F 2020.03.02 7.2 
F 2020.03.03 6.97 
F 2020.03.04 7.08 
F 2020.03.05 6.74 
F 2020.03.06 6.49 7.292691 6.786 6.279309 
F 2020.03.09 5.9 7.294248 6.454 5.613752 
F 2020.03.10 6.26 7.134406 6.328667 5.522927
F 2020.03.11 5.9 6.789441 6.130667 5.471892
F 2020.03.12 5.35 6.601667 5.828 5.054333 
F 2020.03.13 5.63 6.319728 5.711333 5.102939 
GPRO 2020.03.02 3.81 
GPRO 2020.03.03 3.935 
GPRO 2020.03.04 4.04 
GPRO 2020.03.05 3.74 
GPRO 2020.03.06 3.7 4.069365 3.817333 3.565302 
GPRO 2020.03.09 3.33 4.133371 3.645667 3.157962 
GPRO 2020.03.10 3.64 4.062941 3.609333 3.155726 
GPRO 2020.03.11 3.31 3.854172 3.482667 3.111162 
GPRO 2020.03.12 2.69 3.915172 3.198 2.480828 
GPRO 2020.03.13 2.72 3.738386 2.993333 2.24828

3.パフォーマンスの説明

TA-Libの対応する関数と比較すると、taモジュールの関数は、直接使用した場合の平均速度は同じですが、グループ計算では、taモジュールの関数のパフォーマンスはTA-Libの対応する関数をはるかに上回っています。このセクションのパフォーマンス比較では、wma関数を例として取り上げます。

3.1直接使用のパフォーマンス比較

DolphinDBの場合:

use ta 
close = 7.2 6.97 7.08 6.74 6.49 5.9 6.26 5.9 5.35 5.63 
close = take(close、1000000)
timer x = wma(close、5);

長さが1,000,000のベクトルに対して、taモジュールのwma関数を直接使用するには、3ミリ秒かかります。

対応するPythonステートメントは次のとおりです。

close = np.array([7.2,6.97,7.08,6.74,6.49,5.9,6.26,5.9,5.35,5.63,5.01,5.01,4.5,4.47,4.33])
close = np.tile(close、100000)

インポート時間
start_time = time.time()
x = talib.WMA(close、5)
print( "---%s秒---"%(time.time()-start_time))

TA-LibのWMA関数は11ミリ秒かかります。これはwmaDolphinDBtaモジュールの関数の3.7倍です

3.2グループ化のパフォーマンス比較

DolphinDBで、全長1,000,000の1000株を含むデータテーブルを作成します。

n = 1000000 
close = rand(1.0、n)
date = take(2017.01.01 + 1..1000、n)
symbol = take(1..1000、n).sort!()
t = table(symbol、date、 close)
timer update t set wma = wma(close、5)context by symbol;

taモジュールのwma関数を使用して、各在庫を計算します。これには17ミリ秒かかります。

対応するPythonステートメントは次のとおりです。

close = np.random.uniform(size = 1000000)
symbol = np.sort(np.tile(np.arange(1,1001)、1000))
date = np.tile(pd.date_range( '2017-01-02 '、' 2019-09-28 ')、1000)
df = pd.DataFrame(data = {' symbol ':symbol、' date ':date、' close ':close})

import time 
start_time = time.time()
df ["wma"] = df.groupby( "symbol")。apply(lambda df:talib.WMA(df.close、5))。to_numpy()
print( "---%s秒---"% (time.time()-start_time))

TA-LibのWMA関数を使用して各株式を計算するのに535ミリ秒かかりますwma。これは、taモジュールの関数の31.5倍です

4.ベクトル化の実装

TA-Libと同様に、taモジュールのすべての関数はベクトル関数です。入力はベクトルであり、出力結果も同じ長さのベクトルです。TA-Libの最下層はC言語で実装されており、非常に効率的です。taモジュールはDolphinDBのスクリプト言語で実装されていますが、組み込みのベクトル化関数と高階関数を最大限に活用し、ループを回避し、非常に効率的です。実装された57の関数のうち、28の関数はTA-Libよりも高速に実行され、最速の関数はTA-Libの約3倍のパフォーマンスであり、29の関数はTA-LIBよりも低速であり、最も遅いパフォーマンスは少なくともTA-Libの1/3。

taモジュールでの関数の実装も非常に簡潔です。ta.dosには合計765行あり、関数ごとに平均約14行あります。コメント、空白行、関数定義の開始行と終了行、および入力パラメーターの先頭のnull値を削除するパイプラインコードを除くと、各関数のコアコードは約4行です。ユーザーは、taモジュールの機能コードを参照し、効率的なベクトル化されたプログラミングのためにDolphinDBスクリプトを使用する方法を学ぶことができます。

4.1.null値の処理

TA-Libの入力ベクトルにnull値が含まれ始めた場合、計算は最初の空でない位置から開始されます。taモジュールは同じ戦略を使用します。ローリング/累積ウィンドウ関数の計算中に、ウィンドウの長さに達していない初期値の各グループについて、対応する位置での結果は空です。この点で、TA-Libモジュールとtaモジュールの結果は一貫しています。ただし、その後、null値がある場合、この位置とTA-Lib関数内の後続のすべての位置の結果がnull値になる可能性があります。ウィンドウ内の非null値データの数がインジケーターを計算するのに十分でない場合(たとえば、分散を計算するときに非null値が1つしかない場合)、null値の数はの生成に影響しませんtaモジュール関数の結果。

// dolphindbでtaを使用
close = [99.9、NULL、84.69、31.38、60.9、83.3、97.26、98.67] 
ta :: var(close、

5、1 [,,,, 670.417819,467.420569,539.753584,644.748976] 

/ / pythonでtalibを使用
close = np.array([99.9、np.nan、84.69、31.38、60.9、83.3、97.26、98.67])
talib.VAR(close、5、1)

array([ nan、nan、nan 、 in、in、in、in、in])

上記の全体的な分散計算では、closeの2番目の値がnull値であるため、taモジュールとTA-Libの出力が異なり、TA-Libの出力はすべてnullになります。null値を81.11に置き換えると、taモジュールとTA-Libは同じ結果になります。最初の要素99.9の前にnull値を追加しても、2つの結果は同じです。つまり、入力パラメータの最初のk個の要素のみが空の場合、taモジュールとTA-Libの出力結果はまったく同じになります。

4.2反復処理

テクニカル分析の多くのインジケーター計算は反復を使用します。つまり、現在のインジケーター値は前のインジケーター値と現在の入力に依存します:r [n] = coeff * r [n-1] + input [n]。このタイプの計算のために、DolphinDBiterateはベクトル化のための関数導入し、ループの使用を回避します。

def ema(close、timePeriod){ 
1 n = close.size()
2 b = ifirstNot(close)
3 start = b + timePeriod 
4 if(b <0 || start> n)return array(DOUBLE、n、n、 NULL)
5 init = close.subarray(:start).avg()
6 coeff = 1-2.0 /(timePeriod + 1)
7 ret = iterate(init、coeff、close.subarray(start:)*(1-coeff) )
8 return array(DOUBLE、start-1、n、NULL).append!(init).append!(ret)
}

ema関数の実装を例にとると、コードの5行目は、最初のウィンドウの平均値を反復シーケンスの初期値として計算します。コードの6行目は、反復パラメーターを定義します。コードの7行目は、iterate関数を使用してemaシーケンスを計算します。組み込み関数iterateは非常に高い操作効率を備えており、長さが1,000,000のベクトルのemaシーケンスを計算します。ウィンドウの長さが10の場合、TA-Libは7.4ミリ秒かかり、taモジュールは5.0ミリ秒しかかかりません。 TA-Libよりも高速です。

4.3スライディングウィンドウ機能の適用

ほとんどのテクニカルインジケーターはスライディングウィンドウを指定し、各ウィンドウのインジケーター値を計算します。DolphinDB内蔵機能を含む、スライディングウィンドウ計算のベースのインデックス部分に含まれているmcount、  mavg、  msum、  mmax、  mmin、  mimax、  mimin、  mmed、  mpercentile、  mrank、  mmad、  mbeta、  mcorr、  mcovar、 mstdおよびmvarこれらの基本的なスライディングウィンドウ関数は完全に最適化されており、ほとんどの関数の複雑さはO(n)に達しています。つまり、ウィンドウの長さとは関係ありません。上記の基本的なインジケーターを重ね合わせたり変換したりすることで、より複雑なスライディングインジケーターを実現できます。ta :: varは全体の分散であり、DolphinDBの組み込みmvarはサンプルの分散であるため、調整する必要があります。

def var(close、timePeriod、nddev){ 
1 n = close.size()
2 b = close.ifirstNot()
3 if(b <0 || b + timePeriod> n)return array(DOUBLE、n、n、NULL )
4 mobs = mcount(close、timePeriod)
5 return(mvar(close、timePeriod)*(mobs-1)\ mobs).fill!(timePeriod-1 + 0:b、NULL)
}

以下に、より複雑な例、linearreg_slopeインジケーターの実現を示します。Linearreg_slopeは、実際には、シーケンス0 ..(timePeriod-1)に関連するcloseのベータを計算します。この指標はベクトル化されていないようです。各ウィンドウのデータを取り出し、ベータ計算を周期的に実行する必要があります。しかし実際には、この例の独立変数は非常に特殊であり、固定の等差数列です。次のウィンドウのベータを計算するときに、増分計算によって最適化できます。beta(A、B)=(sumAB-sumA * sumB / obs)/ varB、varBおよびsumBは固定されているため、ウィンドウをスライドするときに、sumABおよびsumAの計算を最適化するだけで済みます。式を簡略化することで、2つのウィンドウ間のsumABの変更をベクトル化することで実現できます。詳細については、コードの10行目を参照してください。コードの12行目は、最初のウィンドウのsumABを計算します。コードの13行目のsumABDelta.cumsum()は、すべてのウィンドウのsumAB値をベクトル化します。

def linearreg_slope(close、timePeriod){ 
1 n = close.size()
2 b = close.ifirstNot()
3 start = b + timePeriod 
4 if(b <0 || start> n)return array(DOUBLE、n、n 、NULL)
5 x = 0 ..(timePeriod-1)
6 sumB = sum(x).double()
7 varB = sum2(x)-sumB * sumB / timePeriod 
8 obs = mcount(close、timePeriod)
9 msumA = msum(close、timePeriod)
10 sumABDelta =(timePeriod-1)* close + close.move(timePeriod)-msumA.prev()  
11 sumABDelta [timePeriod-1 + 0:b] = NULL 
12 sumABDelta [start-1] = wsum(close.subarray(b:start)、x)
13 return(sumABDelta.cumsum()-msumA * sumB / obs)/ varB 
}

長さが1,000,000のベクトルのlinearreg_slopeシーケンスを計算します。ウィンドウの長さが10の場合、TA-Libは13ミリ秒かかり、taモジュールは14ミリ秒かかります。2つはほぼ同じです。これは、スクリプトで実装するのは簡単ではありません。ウィンドウを20に増やすと、TA-Libの時間は22ミリ秒に増加しますが、taの時間は14ミリ秒のままです。これは、TA-Libの実装がループを使用して各ウィンドウを個別に計算するのに対し、taはウィンドウの長さに関係なくベクトル化された計算を実装することを示しています。

4.4データの重複を減らすためのテクニック

ベクトルに対してスライス、結合、追加などの操作を実行すると、大量のデータがコピーされる可能性があります。通常、データのコピーは、多くの単純な計算よりも時間がかかります。ここでは、いくつかの実用的な例を通じて、データの重複を減らす方法に関するヒントをいくつか紹介します。

4.4.1ベクトルビューサブアレイを使用してデータのコピーを減らす

計算のためにベクトルのサブウィンドウを直接スライスすると、新しいベクトルが生成され、データがコピーされます。これは、より多くのメモリを消費するだけでなく、時間もかかります。DolphinDBは、この目的のために新しいデータ構造を導入しましたsubarrayこれは実際には元のベクトルのビューであり、元のベクトルのポインタと開始位置および終了位置を記録するだけであり、新しいベクトルを格納するために大きなメモリブロックを割り当てないため、データのコピーは実際には発生しません。 。すべてのベクター読み取り専用操作は、サブアレイに直接適用できます。emaとlinearreg_slopeの実装は、サブアレイを広範囲に使用します。次の例では、100万の長さのベクトルに対して100のスライス操作を実行します。これには62ミリ秒かかり、各操作には0.62ミリ秒かかります。4.2で100万の長さのベクトルをテストするためのema操作にかかる時間はわずか5ミリ秒であることを考えると、0.62ミリ秒の節約は非常に重要です。

close = rand(1.0、1000000)
timer(100)close [10:]

経過時間:62ミリ秒

4.4.2拡張を回避するために、ベクトルの容量を指定します

ベクトルの末尾にデータを追加するときに、容量が十分でない場合は、より大きなメモリスペースを割り当て、古いデータを新しいメモリスペースにコピーし、最後に古いメモリスペースを解放する必要があります。ベクトルが比較的大きい場合、この操作には時間がかかる場合があります。ベクトルの最終的な長さが明確にわかっている場合は、この長さをベクトルの容量として事前に指定することで、ベクトルの拡張の発生を回避できます。DolphinDBの組み込み関数array(dataType、[initialSize]、[capacity]、[defaultValue])は、作成時に容量を指定できます。たとえば、ema関数の8行目で、最初に容量nのベクトルを作成してから、計算結果を追加します。

5. DolphinDBtaインデックスリスト

重複研究

111.png

勢いの指標

222.png

ボリュームインジケーター

333.png

ボラティリティ指標

444.png

価格変換

555.png

統計関数

666.png

その他の機能

  • Ta-LibのMathTransform関数とMathOperators関数の場合、代わりに対応するDolphinDB組み込み関数を使用できます。例えば、それぞれSQRT、LNにおけるTA-Libの、SUM関数は、DolphinDBで使用することができる sqrt、  log、 msum 代わりに機能します。
  • 次のTa-Lib関数はtaモジュールに実装されていません:すべてのパターン認識およびサイクルインジケータークラス関数、およびHT_TRENDLINE(ヒルベルト変換-瞬時トレンドライン)、ADOSC(Chaikin A / Dオシレーター)、MAMA(MESA適応移動)平均)、SAR(パラボリックSAR)、SAREXT(パラボリックSAR拡張)関数。

6.ロードマップ

  • まだ実装されていないインジケーター機能は、次のバージョンで実装され、2020年4月に完了する予定です。
  • 現在、DolphinDBのカスタム関数はデフォルトのパラメーターをサポートしていません。また、関数を呼び出すときにキー値に基づいてパラメーターを入力することもサポートしていません。これらの2つのポイントは、taモジュールがTA-Libと一致するデフォルトのパラメーターを実装するときに、DolphinDB Server1.20.0に実装されます。
  • taモジュールを使用する前に、use taを使用してモジュールをロードする必要があります。これは、対話型クエリでは不便です。DolphinDBサーバーは、バージョン1.20のシステム初期化中にモジュールのプリロードを許可します。taモジュール関数は、モジュールをロードするステップを節約するために、DolphinDBの組み込み関数と同じステータスになります。


おすすめ

転載: blog.51cto.com/15022783/2656668