Download - PyCon JP 2016 Talk#024 ja

Transcript

Pythonではじめるfinance hack入門

driller@patraqushe

PyConJP 2016

September 22, 2016

About me

driller

@patraqushe

トレーダーです

Python歴1年半くらいです

2

Agenda

まだExcelで消耗しているの?

時系列データは怖くない

Jupyter Notebookを使い倒す

3

Why Python for Finance?

簡潔なコードでデータ分析が可能

ライブラリが充実している(特にDeep learning系)

pandasが使える

Jupyter Notebookが使える

データ分析の他に様々なことが連携してできるスクレイピング、クローリング

Webフレームワーク

インフラ系

4

Why Python in my case

Excelでトレード用のツールを作っていたフリーで公開して、割りとたくさんのユーザがいた

機能追加や取引所のルール変更にだんだん耐えられなくなってきたExcelだとシートのレイアウトを根本的に変更しないと対応できないケースがある

色々試してみたが、Pythonなら簡単に覚えることができた※個人の感想です

pandasがExcelの操作に似ていた

Jupyterを使うことで体裁を整えるコストが大幅に削減できた

5

まだExcelで消耗しているの?~ExcelからPythonに移行して生産性を高めよう~

6@patraqushe疲れたろう。僕も疲れたんだ。

株価をモンテカルロ・シミュレーション

株価 1,000円

期間(n日後の株価) 30日

金利 0.1%

ボラティリティ(変動率) 20%

試行回数 10,000回→50,000回

7

Case1-1: モンテカルロ・シミュレーションをExcelの関数で実装1. 幾何ブラウン運動(下記の確率微分方程式)に従う乱数を作成する数式をセルに入力する

𝑑𝑆𝑡 = 𝜇𝑆𝑡𝑑𝑡 + 𝜎𝑆𝑡𝐵𝑡

2. 上記の数式を試行回数分コピーする

3. 上記の計算結果を階級に分ける

4. 階級毎の値をカウントする

5. 4をグラフ化する

8

Sample:

Case1-1_1-2.xlsm

数式だけでもモンテカルロ・シミュレーションは実装できるが・・・試行回数を増やしたい時に、セルを増やす必要がある

関連したセルを増やしたセルに対応させる必要がある

シートの再計算がどんどん重くなって、シートがまともに使えなくなる

9

Case1-2: モンテカルロ・シミュレーションをVBAで実装とにかくコードが長くなる(特にヒストグラムのところ)

シートのレイアウトを変更したくなった時に、対応しているセルのアドレスを全て変更する必要がある(名前の定義である程度は対処可能)

とにかく遅い

10

Sample:

Case1-1_1-2.xlsm

Case1-3: モンテカルロ・シミュレーションをPythonで実装とにかくコードが短い(特にヒストグラムのところ)

データの置き場所を一々考えなくていい

VBAより速い

11

Sample:

Case1-3.ipynb

Excel vs. Python

Lines of Code: 105

Wall Time: 7.89s

More complex

Lines of Code: 10

Wall Time: 0.83s

More simple

12

とはいえExcelの方がいいときもあるよね入力し易い

帳票等のフォーマットを作りやすい

ものすごくたくさんの人が使っている(データの互換性が高い)

13

ExcelとPythonのいいとこ取りをしようPythonからExcelを使うためのパッケージ

xlrd

xlwt

XlsxWriter

xlutils

openpyxl

xlwings

ExcelPython

14

色々なパッケージがあるけどpandasで十分pandas.read_excel()でなんとかなることが多い

pandasではできないことを他のパッケージで補うやり方が効率的

pandasではできないことオープンしているファイルに対しての書き込み

セルの操作

グラフの描画やセルの結合等の細かい処理

15

Case1-4: 経済指標と為替、株価の関係を見てみる日経新聞のサイトから経済指標と株価のExcelファイルをpandasで開く経済指標

実質GDP

景気動向指数(先行)

為替 :ドル円

株価 :日経平均株価

seabornで可視化

16

Sample:

Case1-4.ipynb

Case 1-5: 日銀のREIT, ETF買い入れとREIT, 株価指数の関係を見てみるBOJのサイトからExcelファイルをpandasで開く

k-dbから東証REIT指数、株価を取得株価指数

TOPIX

JPX400

日経平均

seabornで可視化

17

Sample:

Case1-5.ipynb

xlwingsを使ってみる

openしているExcelファイルに対して読み込み/書き込みができる

Numpy, pandasのデータ型が扱える

ExcelからPythonのスクリプトを呼び出すことができる

Excelのユーザ定義関数(UDF)をPythonで作ることができる

セルの結合やグラフの処理等はopenpyxlの方が向いている

18

Call Python script from Excel19

module

function

User Defined Functions (UDF)20

You can use custom functions written in Python!

UDF returns multiple values to each cells21

Using array formula(Ctrl + Shift + Enter)

Case1-6:pandasで株価を取得してExcelのセルに表示するxlwingsを使うと

ExcelからPythonのコードを実行することができる

PandasのDataFrameをExcelのセルにそのまま適用できる

ExcelのマクロのようにPythonコードが使える

株価はpandas_datareaderで取得できる

22

Sample:

Case1-6.xlsm

Case 1-7:ユーザ定義関数をPythonで作ってExcelの関数として使うWindowsのみ(Macはできないらしい)

アドインをインストールする

Pythonで作成した関数をExcelの関数として、ワークシートのセル上から使えるようになる

セルの範囲を引数にして、NumpyのarrayやpandasのDataFrameとして処理できる

複数の戻り値を複数のセルに渡すことができる

23

Sample:

Case1-7.xlsm

時系列データは怖くない~pandasと仲良くなろう~

24

Why pandas?

pandas はWes McKinney氏がAQR Capital Management(クオンツ運用をしている投資会社)在籍中に作り始められた

Pythonから下記の要件を一つのツールで実装すべくpandasが開発されたラベル付されたデータ構造時系列データを扱う機能が統合算術演算と集約演算にメタデータの情報を指定できる欠損値を柔軟に扱うことができるSQLベースのデータベースで使用可能な関係演算を扱うことができる

金融の専門家が作ったツールなので、金融データに向いていない訳がない

25

Case2-1: DatetimeIndexを使ってみる

連続データの作成はpandas.date_rangeが非常に便利

DatetimeIndexの利点参照時に様々な型を指定できる

datetime.date型, datetime.datetime型, datetime.time型, str型, int型, etc…

曖昧な表記でも受け付けてくれる(dateutil.parserのパースのように動作する)

年や月指定でスライスができる

欠損値を扱うことができる

26

Sample:

Case2-1_2.ipynb

Case2-2: 四本値を作成、範囲を変換

四本値を作るのは意外と大変・・・

.resample()メソッドで指定の頻度に変換してくれる日足、週足、月足、年足、30分足、1時間足、etc

四本値から四本値へresampleする場合にはコツがいる

27

Sample:

Case2-1_2.ipynb

Resampling image 1/4

100

99

102

105

102

103

105

106

104

102

Daily

Open High Low Close

100 105 99 102

Weekly

28

Resampling image 2/4

100

99

102

105

102

103

105

106

104

102

Daily

Open High Low Close

100 105 99 102

103 106 102 102

Weekly

29

Resampling image 3/4

100

99

102

105

102

103

105

106

104

102

Daily

Open High Low Close

100 105 99 102

103 106 102 102

101 102 97 98

98 100 107 105

106 110 106 108

109 115 107 112

110 120 110 115

113 117 110 115

110 111 102 103

100 101 94 96

Weekly

30

Open High Low Close

100 106 97 105

Monthly

Resampling image 4/4

100

99

102

105

102

103

105

106

104

102

Daily

Open High Low Close

100 105 99 102

103 106 102 102

101 102 97 98

98 100 107 105

106 110 106 108

109 115 107 112

110 120 110 115

113 117 110 115

110 111 102 103

100 101 94 96

Weekly

31

Open High Low Close

100 110 97 108

106 120 106 115

Monthly

デリバティブの満期日を扱う

取引所 JPX

商品 株価指数先物オプション

満期日 毎月第二金曜日該当日が祝日の場合はその前日

http://www.jpx.co.jp/derivatives/rules/last-trading-day/

32

満期日の例(2017/05 – 2017/08)

Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat

May 1 2 3 4 5 6 Jul 7/1

7 8 9 19 11 12 13 2 3 4 5 6 7 8

14 15 16 17 18 19 20 9 10 11 12 13 14 15

21 22 23 24 25 26 27 16 17 18 19 20 21 22

28 29 30 31 23 24 25 26 27 28 29

Jun 6/1 2 3 30 31

4 5 6 7 8 9 10 Aug 1 2 3 4 5

11 12 13 14 15 16 17 6 7 8 9 10 11 12

18 19 20 21 22 23 24 13 14 15 16 17 18 19

25 26 27 28 29 30 20 21 22 23 24 25 26

27 28 29 30 31

33

Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat

May 1 2 3 4 5 6 Jul 7/1

7 8 9 19 11 12 13 2 3 4 5 6 7 8

14 15 16 17 18 19 20 9 10 11 12 13 14 15

21 22 23 24 25 26 27 16 17 18 19 20 21 22

28 29 30 31 23 24 25 26 27 28 29

Jun 6/1 2 3 30 31

4 5 6 7 8 9 10 Aug 1 2 3 4 5

11 12 13 14 15 16 17 6 7 8 9 10 11 12

18 19 20 21 22 23 24 13 14 15 16 17 18 19

25 26 27 28 29 30 20 21 22 23 24 25 26

27 28 29 30 31

満期日の例(2017/05 – 2017/08)34

Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat

May 1 2 3 4 5 6 Jul 7/1

7 8 9 19 11 12 13 2 3 4 5 6 7 8

14 15 16 17 18 19 20 9 10 11 12 13 14 15

21 22 23 24 25 26 27 16 17 18 19 20 21 22

28 29 30 31 23 24 25 26 27 28 29

Jun 6/1 2 3 30 31

4 5 6 7 8 9 10 Aug 1 2 3 4 5

11 12 13 14 15 16 17 6 7 8 9 10 11 12

18 19 20 21 22 23 24 13 14 15 16 17 18 19

25 26 27 28 29 30 20 21 22 23 24 25 26

27 28 29 30 31

満期日までの営業日数例(2017/05/01 - 2017年5月限)

35

課題

祝日をどうするか

第二金曜日をどうやって判定するか

36

日本の祝日に対応するには・・・

米国の場合はpandas.tseries.holiday.USFederalHolidayCalendarが用意されているが日本の祝日には対応していない(2016/09/22現在)

AbstractHolidayCalendarクラスを継承して、祝日のルールを作成することができるが、色々と大変・・・年によって祝日が異なる

CustomBusinessDayで個別の休日を実装できる

既にあるカレンダーデータを利用してpandasに実装してみる

37

Case2-3: CustomBusinessDayで満期日とそれまでの日数を計算してみるyaml形式で提供されている祝日データを取り込む

第二金曜日はpandas.date_range(freq=‘WOM-2FRI‘)で作成できる

CustomBusinessDayで時間を演算した際には休日がスキップされる

38

Sample:

Case2-3.ipynb

Jupyter Notebookを使い倒す~便利な機能を見逃すな~

39

Case3-1: マジックコマンドを自作してみるline magicで株価を検索し、IPython.display.IFrameに出力してみる

cell magicで様々な形式のデータをnotebookのセルに貼り付けてpandasのDataFrameに変換してみる

よく使うコマンドは.py形式に保存して%load_extで呼び出すことができる

40

Sample:

Case3-1.ipynb

Case3-2: ipywidgetsを使って超かんたんにUIを作るipywidgets.interactを関数にデコレートするだけで簡単にUIを実装できる

ipywidgets.interactの引数の型によってUIが決まるbool型: チェックボックス

int型: スライダー

株価の移動平均とボリンジャーバンドの範囲を動的に変化させるグラフを作ってみる

41

Sample:

Case3-2.ipynb

便利なNbextensions

Nbextentionは個別にインストールすることも可能だが、jupyter_contrib_nbextensionsからまとめてインストールをするのが便利https://github.com/ipython-contrib/jupyter_contrib_nbextensions

Nbextensions edit menu itemで個々のextentionのEnable/Disableが簡単にできる

Javascriptでextentionを自作することもできる

42

今回のまとめ

Python >>>越えられない壁>>> Excel

時系列データに便利

簡単にコマンドやUIを作れる

43

サンプルコード等について

今回使用したサンプルコード、ExcelファイルはGithubに置いてありますhttps://github.com/drillan/pyconjp2016

下記の対応をしたため、冗長な部分がありますPython2, Python3の両方に対応

インターネット未接続時はオフラインのファイルを参照

ライセンス制限は特に設けていません。ご自由にお使いください

44

ご清聴ありがとうございましたSee you next year?

45