LoginSignup
3
2

More than 3 years have passed since last update.

期間リターンの算出 with sqlalchemy

Posted at

初めてのテスト投稿なので、生暖かい目でお見守りください。

ある時点からある時点の株価リターンを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に格納します
python
import pandas as pd
df = pd.read_sql(query.statement, engine)
print(df)

終わりのお作法
python
session.close()
engine.dispose()

初めてやってみたのですが、自作の関数をほどかなければならなくて、
少し時間がかかりました。
また、環境違うのでミスがあるかもしれないのはご容赦ください。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2