1

我正在处理股票的金融时间序列数据 (OHLCV),并正在用金融指标(例如布林带)扩充我的数据集。我有一个 Postgres/TimescaleDB 超表设置并计划使用 psycopg2 来运行查询。

我想做的是能够自动和动态地将列添加到我现有的数据库表中,并使用来自现有 python 库/模块的不同技术指标。

例如,我有一个长表,列中有每日 OHLCV 和股票代码数据,以便稍后进行 ETL 处理。我想运行数量尚未确定的指标,例如布林带(上限和下限)、RSI、EMA 等。但不想每次我都通过 psycopg2 在 SQL 中手动编码这些新列创建一个新指标,而是将它们作为参数提供,以便在数据库中自动设置 - 作为迁移/新表,或在现有的每日表中。(以最有效的方式)

我环顾四周,但没有看到任何我认为可能适用于此的东西。

4

1 回答 1

1

我建议不要反复修改你的表,而是对数据进行不同的建模。例如,您可以创建以下表格

-- Table for the original series
CREATE TABLE series (
  id INTEGER PRIMARY KEY,
  datetime TIMESTAMP NOT NULL,
  symbol TEXT NOT NULL,
  value NUMBER NOT NULL
);

-- Table for the derived indicators
CREATE TABLE indicators (
  id INTEGER PRIMARY KEY,
  series_id INTEGER NOT NULL,
  name TEXT NOT NULL,
  value NUMBER NOT NULL,
  FOREIGN KEY (series_id) REFERENCES series(id)
);

然后,您可以为每个原始系列计算任意数量的指标(存储在 中series)并将派生值存储在 中indicators。这种方法的额外好处是您不需要评估所有时间序列的所有指标(或者NULL当您不评估所有数据点的所有指标时有一堆列)。

例如1 ,

import numpy as np
import psycopg2

SYMBOL = "GOOG"
INDICATOR = "EMA"

with psycopg2.connect("your connection string") as conn:
    # Get the data
    with conn.cursor() as cur:
        cur.execute("SELECT id, value FROM series WHERE symbol = %s", (SYMBOL,))
        ids, values = np.transpose(cur.fetchall())

    # Calculate the indicator
    indicator_values = evaluate_indicator(values, INDICATOR)

    # Insert the indicator values
    with conn.cursor() as cur:
        data = [(series_id, INDICATOR, value) for series_id, value in 
                zip(ids, indicator_values)]
        cur.executemany("INSERT INTO indicators (series_id, name, value) VALUES (%s, %s, %s)",
                        data)

话虽如此,如果您想沿着扩展表模式的路线前进,您可以在计算每个新指标之前使用ALTER TABLE命令创建一个新列。


1我没有测试过这段代码,所以它可能包含一些小问题。

于 2019-06-24T21:17:13.357 回答