0

我正在尝试在 postgresql 中构建一些技术指标的自定义功能,我想到了一些疑问。第一个是任何库或插件是否已经具有此指标(常见的指标,如移动平均线、RSI、MACD、RSI、MFI 等)。

我的第二个问题是关于我正在尝试编码的指标。MFI(Money Flow Index)指标定义如下:

  • 计算典型价格:(最高价+最低价+收盘价)/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

负和 = 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。我如何计算这些条款并以滚动方式进行?(或移动窗口)

先感谢您!任何建议表示赞赏:)

4

2 回答 2

1

如果您已经选择了 14 行作为表格,您可以获得正数总和,负数总和为

我将您的sum列重命名为sum_col

WITH SUM_TABLE AS (
SELECT
SUM(CASE WHEN sum_col>=0 THEN sum_col ELSE 0 END) AS POS_SUM,
SUM(CASE WHEN sum_col<0 THEN sum_col ELSE 0 END) AS NEG_SUM
FROM table)
SELECT
CASE WHEN NEG_SUM=0 THEN 100 ELSE POS_SUM/NEG_SUM END AS MFR,
CASE WHEN NEG_SUM=0 THEN 100-100/(1+100) ELSE 100-100/(1 + (POS_SUM/NEG_SUM)) END AS MFI
FROM SUM_TABLE

编辑 由于您使用的是 PostreSQL,如果您的表有超过 14 行并且需要进行移动计算,您可以使用OVER函数对group by它们中的每一个执行类似的操作。

WITH SUM_TABLE AS (
SELECT
date,
SUM(CASE WHEN sum_col>=0 THEN sum_col ELSE 0 END) OVER(ORDER BY date ROWS BETWEEN 13 PRECEDING AND CURRENT ROW) AS POS_SUM,
SUM(CASE WHEN sum_col<0 THEN sum_col ELSE 0 END) OVER(ORDER BY date ROWS BETWEEN 13 PRECEDING AND CURRENT ROW) AS NEG_SUM
FROM table)
SELECT
date,
CASE WHEN NEG_SUM=0 THEN 100 ELSE POS_SUM/NEG_SUM END AS MFR,
CASE WHEN NEG_SUM=0 THEN 100-100/(1+100) ELSE 100-100/(1 + (POS_SUM/NEG_SUM)) END AS MFI
FROM SUM_TABLE

于 2020-05-07T08:16:05.107 回答
0

我觉得你的问题很难理解。但重点是这部分:

此输出应在 (**) 中使用。那部分将是:

  • 抓取最后 14 行
  • 将所有正数加在一起,将所有负数加在一起
  • 将所有正数的总和除以所有负数。

如果您想要一个运行总和,请使用窗口函数:

select t.*,
       (sum(number) filter (where number > 0) over w /
        sum(number) filter (where number < 0) over w
       )
from t
window w as (order by number rows between 13 preceding and current row)

我对如何将其应用于您问题中的查询感到有些困惑。这比你问的问题要复杂得多。

于 2020-05-07T12:07:31.650 回答