初めてのテスト投稿なので、生暖かい目でお見守りください。
ある時点からある時点の株価リターンをSQLで算出します。
すでに分割考慮後の株価テーブルを持っている前提です。
株価が入ったテーブルを用意します。
構成は日付=ddate、証券コード= tick、終値 = close
class stock_price(Base):
ddate = Column(Date(), primary_key=True, index=True)
tick = Column(Integer(), primary_key=True, index=True)
open = Column(Float())
high = Column(Float())
low = Column(Float())
close = Column(Float())
volume = Column(Integer())
raw = Column(Float())
sqlalchemyでエンジンとセッションとを生成します。
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import psycopg2
db = "postgresql+psycopg2://{user}:{pass}@{host}:{port}/{db}"
engine = create_engine(db)
session_ = sessionmaker(bind=engine)
session = session_()
自己結合対策をします。
prc = stock_price
import sqlalchemy.orm as orm
e_prc = orm.aliased(prc, name="e_prc")
s_prc = orm.aliased(prc, name="s_prc")
クエリを作成します。
import datetime as dt
e_day = dt.date(2019, 7 ,1)
s_day = dt.date(2019, 7 ,5)
e_price = e_prc.close
s_price = s_prc.close
dur_chg = ((e_price / s_price) - 1) * 100
query = session.query(
e_prc.tick,
dur_chg.label('dur_chg'),
) \
.join(s_prc, s_prc.tick == e_prc.tick) \
.filter(e_prc.ddate == e_day) \
.filter(s_prc.ddate == s_day) \
.order_by(dur_chg)
pandasのdataframeに格納します
import pandas as pd
df = pd.read_sql(query.statement, engine)
print(df)
終わりのお作法
session.close()
engine.dispose()
初めてやってみたのですが、自作の関数をほどかなければならなくて、
少し時間がかかりました。
また、環境違うのでミスがあるかもしれないのはご容赦ください。