mysql - 在mysql中计算回报
问题描述
我正在运行一个 mysql - 10.1.39-MariaDB - mariadb.org binary
- 数据库。
我想计算每日回报,我有下表:
| id | date | api_endpoint | ticker | open | high | low | close | volume |
|------|---------------------|--------------|--------|-----------|-----------|-----------|-----------|-----------|
| 18 | 2019-08-07 00:00:00 | daily | AAPL | 195.41000 | 199.56000 | 193.82000 | 199.04000 | 33364400 |
| 19 | 2019-08-06 00:00:00 | daily | AAPL | 196.31000 | 198.07000 | 194.04000 | 197.00000 | 35824800 |
| 20 | 2019-08-05 00:00:00 | daily | AAPL | 197.99000 | 198.65000 | 192.58000 | 193.34000 | 52393000 |
| 21 | 2019-08-02 00:00:00 | daily | AAPL | 205.53000 | 206.43000 | 201.62470 | 204.02000 | 40862100 |
| 44 | 2019-08-01 00:00:00 | monthly | AAPL | 213.90000 | 218.03000 | 206.74000 | 208.43000 | 54017900 |
| 5273 | 1999-09-07 00:00:00 | monthly | AAPL | 73.75000 | 77.93800 | 73.50000 | 76.37500 | 246198400 |
结果我想得到:
| id | date | ticker | close | daily_return |
|----|------------------|--------|--------|--------------|
| 16 | 09.08.2019 00:00 | AAPL | 200,99 | -1,20 |
| 17 | 08.08.2019 00:00 | AAPL | 203,43 | 2,21 |
| 18 | 07.08.2019 00:00 | AAPL | 199,04 | 1,04 |
| 19 | 06.08.2019 00:00 | AAPL | 197 | 1,89 |
| 20 | 05.08.2019 00:00 | AAPL | 193,34 | -5,23 |
| 21 | 02.08.2019 00:00 | AAPL | 204,02 | -2,12 |
| 22 | 01.08.2019 00:00 | AAPL | 208,43 | #DIV/0! |
我正在尝试使用以下公式:
(current_close - last_close)/last_close
而current_close
在时间t
和last_close
在时间t - 1
(前一天)
我正在努力获得last_close
价格。
有什么建议如何计算回报吗?
解决方案
如果您将 MariaDB 版本升级到10.2
或更高版本,您可以LAG
在此处使用:
SELECT *,
(close - LAG(close) OVER (ORDER BY date)) /
LAG(close) OVER (ORDER BY date) AS returns
FROM yourTable
ORDER BY
date DESC;
对于您的 MariaDB 版本,我们可能不得不求助于使用相关子查询:
SELECT *,
(close -
(SELECT (t2.close) FROM yourTable t2
WHERE t2.date < t1.date
ORDER BY t2.date DESC LIMIT 1)) /
(SELECT (t2.close) FROM yourTable t2
WHERE t2.date < t1.date
ORDER BY t2.date DESC LIMIT 1) AS returns
FROM yourTable t1
ORDER BY
date DESC;
推荐阅读
- visual-studio-code - 如何在 Visual Studio Code 中移动到具有相同缩进的行
- javascript - 对于 React 中的 HOC 是否不鼓励这样做?
- laravel - 如果在密码重置期间未注册电子邮件,则 Laravel 错误消息(从 5.6 升级到 5.7)
- c# - 如何禁用通过 RDP(终端服务)运行的应用程序的多个实例?
- visual-studio - 尝试使用 .docx 文件进行合并时出错
- firebase - Firebase:为什么将 Firestore .onSnapshot 分配给变量?
- excel - Power BI 水平运行总计
- apache-kafka - Kafka 中的主题数量限制
- python - Pandas 中时间序列数据的格式问题和缩写数据条目
- python - Spark 找不到 Python 模块