如何根据登录 sql 求和?财务技术指标
How can I sum depending on sign in sql? Financial technical indicators
我正在尝试在 postgresql 中构建一些技术指标的自定义函数,但我的脑海中出现了一些疑问。第一个是是否有任何库或插件已经具有此指标(常见的指标,如移动平均线、RSI、MACD、RSI、MFI 等)。
我的第二个问题是关于我正在尝试编码的指标。 MFI(资金流量指数)指标定义如下:
- 计算典型价格:(最高价+最低价+收盘价)/ 3
- 计算原始资金流量:典型价格 x 交易量
- 计算资金流量比率:(14 期正资金流量)/(14 期负资金流量)(**)
- 计算MFI:100 – 100 / (1 + money flow ratio)
我已经做的是这样的:
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
那么Money Flow Ratio计算为pos_sum/neg_sum(OBS:MFI是一个介于0和100之间的有界指标,如果neg_sum = 0则Money Flow Ratio为100)。
然后,最后通过100 – 100 / (1 + money flow ratio)计算出MFI。
我遇到麻烦的部分是计算 pos_sum 和 neg_sum。我如何计算这些条款并以滚动方式进行? (或移动window)
提前致谢!任何建议表示赞赏:)
如果您已经将 14 行选为 table,您可以获得正数之和,负数之和作为
我将你的 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,如果您的 table 有超过 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
我发现你的问题很难理解。但重点关注这部分:
This output is what should be used in (**). That part would be:
- Grab last 14 rows
- Add all positive numbers together and all negative numbers together
- Divide the sum of all positive by all negative.
如果您想要 运行 总和,请使用 window 函数:
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)
我对如何将其应用于您问题中的查询有些困惑。比你问的问题复杂多了。
我正在尝试在 postgresql 中构建一些技术指标的自定义函数,但我的脑海中出现了一些疑问。第一个是是否有任何库或插件已经具有此指标(常见的指标,如移动平均线、RSI、MACD、RSI、MFI 等)。
我的第二个问题是关于我正在尝试编码的指标。 MFI(资金流量指数)指标定义如下:
- 计算典型价格:(最高价+最低价+收盘价)/ 3
- 计算原始资金流量:典型价格 x 交易量
- 计算资金流量比率:(14 期正资金流量)/(14 期负资金流量)(**)
- 计算MFI:100 – 100 / (1 + money flow ratio)
我已经做的是这样的:
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
那么Money Flow Ratio计算为pos_sum/neg_sum(OBS:MFI是一个介于0和100之间的有界指标,如果neg_sum = 0则Money Flow Ratio为100)。
然后,最后通过100 – 100 / (1 + money flow ratio)计算出MFI。
我遇到麻烦的部分是计算 pos_sum 和 neg_sum。我如何计算这些条款并以滚动方式进行? (或移动window)
提前致谢!任何建议表示赞赏:)
如果您已经将 14 行选为 table,您可以获得正数之和,负数之和作为
我将你的 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,如果您的 table 有超过 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
我发现你的问题很难理解。但重点关注这部分:
This output is what should be used in (**). That part would be:
- Grab last 14 rows
- Add all positive numbers together and all negative numbers together
- Divide the sum of all positive by all negative.
如果您想要 运行 总和,请使用 window 函数:
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)
我对如何将其应用于您问题中的查询有些困惑。比你问的问题复杂多了。