sql—如何计算存储在postgresql数据库中的市场数据在滚动时间段内的价格变化标准

uqdfh47h  于 2021-07-26  发布在  Java
关注(0)|答案(0)|浏览(236)

我有一个postgresql10数据库,其中有一个名为period的表,它存储了几种加密货币的历史价格数据。我试图查询这些数据,以找出价格在滚动时间内上涨了一定百分比的地方,即一天内上涨了5%。相关的表列是“产品id”、“结束时间”(从unix epoch开始以秒为单位)和“结束”时段的收盘价。
更新澄清:
我想查询数据库中按结束时间按时间顺序排序的每个时段
我希望结果有额外的计算列(我称之为 buy_signal 以及 sell_signal 在我的例子中,它们对应于 min_period / max_period 基于以下逻辑
找到最大收盘价为 max_period 在当前期间的一天内发生的(1440分钟,表中每分钟有一行)
找到最小收盘价为 min_period 在当前期间的一天内发生的 min_period.end_time < max_period.end_time 如果 min_period 以及 max_period 大于5%,则 buy_signal 与包含 min_period 是真的 sell_signalmax_period 行是真的
大部分内容都很简单,但我还是停留在#2中粗体的部分。好像我真的需要一个 max_period 为了把这个标准加入 min_period 查询。
给出以下简化数据:

id     product_id     start_time     end_time     close
0       BTC-USD         100000        100060       100
1       BTC-USD         100060        100120        99
2       BTC-USD         100120        100180       101
3       BTC-USD         100180        100240       105
4       BTC-USD         100240        100300       104
5       BTC-USD         100300        100360       102
6       BTC-USD         100360        100420       100
7       BTC-USD         100420        100480        98

我希望能够用额外的计算列查询这些时段,以指示何时出现了局部最小值/最大值,以及何时最小值和最大值之间的差值大于阈值。例如:

id     product_id     start_time     end_time     close     buy_signal     sell_signal
0       BTC-USD         100000        100060       100
1       BTC-USD         100060        100120        99         true
2       BTC-USD         100120        100180       101
3       BTC-USD         100180        100240       105                         true
4       BTC-USD         100240        100300       104
5       BTC-USD         100300        100360       102
6       BTC-USD         100360        100420       100
7       BTC-USD         100420        100480        98

请注意,id为7的行是本地最小值,但它不在本地最大值之前。
这个查询的复杂性远远超出了我的sql经验,我在业余时间花了数周时间查看了堆栈溢出答案和sql功能,但这个难看的查询是我所能得到的:

SELECT
    end_time,
    close,
    MAX(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING) AS max_close,
    MIN(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING) AS min_close,
    ((MAX(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING) - 
      MIN(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING)) / 
      MIN(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING)) AS change_percent,
    CASE WHEN
        ((MAX(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING) - 
          MIN(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING)) / 
          MIN(close) OVER (ORDER BY end_time ROWS BETWEEN CURRENT ROW AND 1439 FOLLOWING)) > 0.05
        THEN true
    END AS buy_signal
FROM Period
WHERE product_id='BTC-USD'

明显的问题是,这并不能区分最小值和最大值的顺序;它选择窗口中的最低值,而不考虑最小值是否在基于结束时间的高值之前按时间顺序出现。我一直在努力思考如何将时间过滤器与窗口相结合,找到在最高价格之前的最低价格,并将所有东西拼凑在一起。另一个(可接受的)限制是一次只对一个产品标识有效,但理想情况下,我希望查询结果包含多个不同的产品标识,按结束时间排序,信号是特定于产品标识的。
我的目标是将分页的查询结果提供给一个java应用程序(我使用的是hibernate),该应用程序使用买卖信号来训练模型。我可以使用java应用程序来预处理数据,但是对于数百万行来说,仅仅执行就需要几个小时,并且比查询选项更复杂。很抱歉问了这么长时间,但我不想漏掉任何东西。任何帮助都将不胜感激。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题