我正在处理股票的财务时间序列数据(OHLCV),并在使用财务指标(例如bollinger波段)扩充我的数据集。我已经设置了Postgres / TimescaleDB超表,并计划使用psycopg2运行查询。
我想做的是能够使用来自现有python库/模块的不同技术指标,自动向我现有的数据库表中动态添加列。
因此,举例来说,我有一个长表,其中列有每日OHLCV和行情自动收录器数据,以便以后进行ETL处理。我想运行数量尚未确定的指标,例如,bollinger波段(上下),RSI,ema等。但是,我不想每次都必须通过psycopg2在SQL中手动编码这些新列创建一个新指标,而是将其作为参数输入以在数据库中自动进行设置-既可以作为迁移表/新表,也可以在现有的每日表上进行设置。 (最有效的方法)
我环顾四周,但还没有看到任何我认为可以解决此问题的东西。
答案 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 我尚未测试此代码,因此它可能包含一些小问题。