PyData Osaka meetup #11 2019/10/19(Sat.) event page
---
Talk about Thomas Wiecki
本日
確率的プログラミングの紹介
Quantopian
アルゴリズムトレーディングプラットフォーム
14年以上Jupyter Notebookを使用
200k以上のメンバー、学習教材の提供
コンペティションを開催
ストラテジを共有
株式投資のリターンのヒストグラム
長い裾のを持つ
t検定でin-samplesの分布とout-of-sampleの分布を検証
ベイズモデリング: Coin flipping
事前分布p(θ) -> 尤度 p(x | θ) -> データ x (表、裏)
データとパラメータの関係性はこの流れだがベイズ推定はデータを与えて最も起こりやすい結果を予測
金融データのモデリング
潜在的な原因(パラメータ) -> データの分布(t分布) -> 観測データ
PyMC3
pythonの確率的プログラミングのフレームワーク
任意の確率分布をプラがぶるに互いに接続可能
直感的なモデル記述
`x ~ N(0,1) は x = Normal('x', 0, 1)
自動的でパワフルな推論機能
MCMC
ADVI(変分推定)
Theanoの上で動作
実際のモデル記述方法の説明
金融データの例においけるin-sampleとout-of-samplesの平均の事後確率
in-samplesは非常に細く尖った分布だがout-of-sampleは広い
out-of-sampleの平均がin-samplesよりも大きい確率質量は3.34%程度、非常に小さい
将来のリターンの予測
1. モデルを推定
2. モデルの不正確性を受け入れたリターンを生成
リターンが確率的に表現される
Bayesian Decision Making
予測結果に対してloss functionを定義しoptimizerと合わせて判定
予測
ノイズだけでなく不確実性を考慮
将来起こりうるすべてのシナリオ(異なるパラメータに基づく予測)を考慮する必要がある
Loss Function
eventとoutcomeを結びつける
outcomeは可能な限り意味のあるビジネス的な尺度に近いものであるべき
金融の場合は期待される損失を最小化する(winsを最大化するのは過度にリスクな振る舞いとなる)
Black-Littermann: -exp(-λr(ω))
r(ω)は次月に対するサンプルにおけるリターン、ωはポートフォリオweights、λはどれだけ損失がaverseであるか
`def loss_function(ω): ωと将来のsampleの内積をexpに通してlossに加算
Optimizer
ポートフォリオweights ωを見つけ出す
convex solvers(cvxpy)
速い
それ以外の場合はscipy.optimizer.fmin()を使う
A/B test
Further reading
@twiecki
---
吉岡さん - sinkhormアルゴリズムの紹介
pytorch向けの実装(geomloss)はあるが、実装自体は簡単なのでtensorflowなどへのポートも可能であろう
生成モデルがあるモデルの場合は観測値に対して尤度のパラメータに対する微分で最尤値が求められるが、GANのようなimplicit modelから生成されたようなサンプルの場合は観測値との距離などによるコストを考える必要がある
たとえばユークリッド距離の場合はサンプル点同士のcost matrixを形成する
輸送コスト(transport cost)の場合は可能な割当に渡って輸送コストを最適化する -> 最適輸送問題OT(離散の場合)
割当の一般化としてcoupling matrix Pを考える、これは点と点の対応を1対1でな多対多にしたときの関係性を表すマトリックスであり、これを使うと輸送コストはコストマトリックスCとcoupling matrix Pのdotとして考えることができる
OT問題を正則化するために d = min for p { <C, P > }をd = min for p { <C, P> } - eps H(P)とする(entropy reularized), Hはentropy
lagrangianによって解を得る
P = diag(u)・K・diag(v)
K_ij = exp(-c_ij / eps ), u >= 0, v >= 0
sinkhorm algorithmを使うと同じ形の解を得ることが可能
sinkhorm algorithm
繰り返し学習法によって実現されるため簡単
1967にOT問題とは関係なしに提案されていた
u^(k+1) = r / { K v^(k) } , v^(k+1) = c / { K^T u^(k+1) }
GeomLossライブラリがあれば手軽に試せる
観測値に対するlatent permutationを見つける問題にも使用可能である