【发布时间】:2021-07-26 21:43:46
【问题描述】:
我有一个包含股票价格的 MySQL 表(版本 8.0.26),并且想要计算对数价格变化以供将来分析。这是我的表格和数据。
CREATE TABLE `prices` (
`ticker` varchar(7) NOT NULL,
`date` datetime NOT NULL,
`price` double DEFAULT NULL,
PRIMARY KEY (`ticker`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
INSERT INTO `sandbox`.`prices` (`ticker`, `date`, `price`) VALUES ('A', '2021-01-01', '10');
INSERT INTO `sandbox`.`prices` (`ticker`, `date`, `price`) VALUES ('A', '2021-01-02', '10.1');
INSERT INTO `sandbox`.`prices` (`ticker`, `date`, `price`) VALUES ('A', '2021-01-03', '11');
INSERT INTO `sandbox`.`prices` (`ticker`, `date`, `price`) VALUES ('B', '2021-01-01', '50');
INSERT INTO `sandbox`.`prices` (`ticker`, `date`, `price`) VALUES ('B', '2021-01-02', '51.5');
INSERT INTO `sandbox`.`prices` (`ticker`, `date`, `price`) VALUES ('B', '2021-01-03', '49');
我可以编写此查询,但未保存该列。
SELECT *, LN(price / lag(price, 1) OVER (PARTITION BY ticker)) AS ln_open_return FROM sandbox.prices;
我将来自theseanswers 的代码放在一起,但我仍然收到“1064 语法错误:'WITH' 在这个位置无效。需要一个表达式。”
ALTER TABLE sandbox.prices
ADD COLUMN ln_change DOUBLE AS (
WITH temp AS (
SELECT
*,
LAG(price, 1) OVER(PARTITION BY ticker ORDER BY date) AS prior
FROM sandbox.prices
)
SELECT
*,
COALESCE(LN(price / prior)) AS ln_change
FROM temp) PERSISTED;
【问题讨论】:
-
钱通常是十进制
-
也就是说,这对我来说看起来很优雅
-
我认为您应该为此使用
VIEW,而不是计算列。我不相信可以在计算列中使用窗口函数,但我可能错了。 -
请编辑您的问题以指定您使用的 MySQL 版本。
-
DOUBLE 不能准确地表示所有十进制值,您应该在使用它之前阅读浮点舍入错误。或者,更合适的是,使用 DECIMAL(9,2) 之类的东西,它可以在 4 个字节中保存高达 9,999,999.99 的值。
标签: mysql pandas quantitative-finance