Postgresql でテクニカル指標のカスタム関数を構築しようとしていますが、いくつかの疑問が頭に浮かびました。1 つ目は、この指標 (移動平均、RSI、MACD、RSI、MFI などの一般的な指標) を既に持っているライブラリまたはプラグインの場合です。
2 番目の質問は、コーディングしようとしているインジケーターに関するものです。MFI (マネー フロー インデックス) インジケーターは次のように定義されます。
- 典型的な価格を計算します: (高値 + 安値 + 終値) / 3
- 現金の流れを計算します: 典型的な価格 x 出来高
- マネー フロー比率の計算: (14 期間の正のマネー フロー) / (14 期間の負のマネー フロー) (**)
- MFI の計算: 100 – 100 / (1 + マネー フロー比率)
私がすでに行ったことはこれです:
with actual_close as (
select
date,
(high+low+close)/3*1000 v_ty_price, --This is the typical price x volume, since in this case is always 1000
close actual_close
from eurusd_ohlc
),
prev_close as(
select date,
v_ty_price,
actual_close,
lag(actual_close,1) over(order by date) prev_close
from actual_close),
totals as (
select date,
v_ty_price,
actual_close,
prev_close,
actual_close-prev_close close_dif
from prev_close
)
select date, sum(close_dif) over(rows between 14 preceding and current row) from totals
次の出力が得られます。
-------------------------------------------------------
| date | sum |
|2020-02-20 03:27:35.140751 | NULL |
|2020-02-20 04:19:17.088462 | -6.000000000017103e-05|
|2020-02-20 05:54:44.060929 | 0 |
|2020-02-20 06:41:32.916934 | -0.0006200000000000649|
この出力は、(**) で使用する必要があるものです。その部分は次のようになります。
- 最後の 14 行を取得
- すべての正の数を足し合わせ、すべての負の数を足し合わせる
- すべてのプラスの合計をすべてのマイナスで割ります。
したがって、最後の 14 行が次のようになっていると仮定します。
sum
-0.1
-0.6
1.2
0.1
1.5
-1
1
-0.2
0
-1
1
1.5
1.1
-1.1
したがって、それぞれの合計は次のようになります。
pos_sum = 1.2 + 0.1 + 1.5 + 1 + 0 + 1 + 1.5 + 1.1
neg_sum = 0.1 + 0.6 + 1 + 0.2 + 1 + 1.1
次に、マネー フロー比率が pos_sum/neg_sum として計算されます (OBS: MFI は 0 から 100 の間の有界指標であり、neg_sum = 0 の場合、マネー フロー比率は 100 です)。
そして、最後に 100 – 100 / (1 + マネー フロー比率) を実行して MFI を計算します。
私が問題を抱えている部分は、pos_sum と neg_sum の計算にあります。これらの項を計算し、ローリング方式で行うにはどうすればよいですか? (または移動ウィンドウ)
前もって感謝します!どんな提案でも大歓迎です:)