使用新列(时间序列技术指标)动态更新现有的Postgres表(psycopg2)

时间:2019-06-24 20:48:27

标签: python postgresql psycopg2 timescaledb

我正在处理股票的财务时间序列数据(OHLCV),并在使用财务指标(例如bollinger波段)扩充我的数据集。我已经设置了Postgres / TimescaleDB超表,并计划使用psycopg2运行查询。

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

因此,举例来说,我有一个长表,其中列有每日OHLCV和行情自动收录器数据,以便以后进行ETL处理。我想运行数量尚未确定的指标,例如,bollinger波段(上下),RSI,ema等。但是,我不想每次都必须通过psycopg2在SQL中手动编码这些新列创建一个新指标,而是将其作为参数输入以在数据库中自动进行设置-既可以作为迁移表/新表,也可以在现有的每日表上进行设置。 (最有效的方法)

我环顾四周,但还没有看到任何我认为可以解决此问题的东西。

1 个答案:

答案 0 :(得分: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 command创建一个新列。


1 我尚未测试此代码,因此它可能包含一些小问题。