reversal factorの算出
概要
前回に投稿した期間損益から
算出されたリターンを10分位に分けて
reversal factorを算出。
分析のための条件
スタート日を一か月前・エンド日を今日として一か月リターンを対象
前回投稿の期間損益をdataframeで返す関数をduration_returnとした
s_day = dt.date.today()
from dateutil.relativedelta import relativedelta
s_day = t_day - relativedelta(months=1)
rev_df = duration_return(s_day, e_day)
qcutで10分割してカラムに格納しDBに格納
そのままdataframeを分析して計算することもできたが、
今後のことを踏まえてデイリーでラベリングしたテーブルを持たせることに。
格納テーブルはreturn_reversal。
div = 10
l = [x for x in range(1, div + 1)]
rev_df['mon1'] = pd.qcut(rev_df['dur_chg'], div
, labels = l)
1分位目のリターンを算出
下記の方法で、10分位目も算出して差分してリターン計算。
rev = ts.return_reversal
b_day = (t_day - cday).date()
q_rev = ss.query(rev.tick).filter(rev.ddate==b_day)
q_rev1 = q_rev.filter(rev.mon1 == 1).subquery()
q_rev10 = q_rev.filter(rev.mon1 == 10).subquery()
q_sprc = ss.query(prc.tick, prc.close).filter(prc.ddate==b_day).subquery()
q_eprc = ss.query(prc.tick, prc.close).filter(prc.ddate==t_day).subquery()
ttick = q_rev1.c.tick
PL = (q_sprc.c.close * 100 / q_eprc.c.close) - 100
# PL = (cast(cast((PL * 100), Integer), Float)/ 100 )
sub_q = ss.query(
ttick,
PL.label('PL')
) \
.join(q_sprc, ttick == q_sprc.c.tick) \
.join(q_eprc, ttick == q_eprc.c.tick).subquery()
query = ss.query(func.avg(sub_q.c.PL))
df = pd.read_sql(query.statement, engine)
管理
このあたりをタスク化して、ファクターリターンとエクスポージャーを自動計算させていく。
終わりに
雑でごめんなさい