PyCon JP 2016 Talk#024 ja
-
Author
drillan -
Category
Economy & Finance
-
view
1.580 -
download
0
Embed Size (px)
Transcript of PyCon JP 2016 Talk#024 ja

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

株価をモンテカルロ・シミュレーション
株価 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