Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PyCon JP 2016 Talk#024 ja

1,870 views

Published on

Pythonではじめるfinance hack入門
https://pycon.jp/2016/ja/schedule/presentation/24/

sample code:
https://github.com/drillan/pyconjp2016

Published in: Economy & Finance

PyCon JP 2016 Talk#024 ja

  1. 1. Pythonではじめる finance hack入門 driller@patraqushe PyConJP 2016 September 22, 2016
  2. 2. About me driller @patraqushe トレーダーです Python歴1年半くらいです 2
  3. 3. Agenda まだExcelで消耗しているの? 時系列データは怖くない Jupyter Notebookを使い倒す 3
  4. 4. Why Python for Finance? 簡潔なコードでデータ分析が可能 ライブラリが充実している(特にDeep learning系) pandasが使える Jupyter Notebookが使える データ分析の他に様々なことが連携してできる スクレイピング、クローリング Webフレームワーク インフラ系 4
  5. 5. Why Python in my case Excelでトレード用のツールを作っていた フリーで公開して、割りとたくさんのユーザがいた 機能追加や取引所のルール変更にだんだん耐えられなくなって きた Excelだとシートのレイアウトを根本的に変更しないと対応できない ケースがある 色々試してみたが、Pythonなら簡単に覚えることができた ※ 個人の感想です pandasがExcelの操作に似ていた Jupyterを使うことで体裁を整えるコストが大幅に削減できた 5
  6. 6. まだExcelで消耗しているの? ~ExcelからPythonに移行して生産性を高めよう~ 6@patraqushe 疲れたろう。 僕も疲れたんだ。
  7. 7. 株価をモンテカルロ・シミュレー ション 株価 1,000円 期間(n日後の株価) 30日 金利 0.1% ボラティリティ(変動率) 20% 試行回数 10,000回→50,000回 7
  8. 8. Case1-1: モンテカルロ・シミュレー ションをExcelの関数で実装 1. 幾何ブラウン運動(下記の確率微分方程式)に従う乱数を作成す る数式をセルに入力する 𝑑𝑆𝑡 = 𝜇𝑆𝑡 𝑑𝑡 + 𝜎𝑆𝑡 𝐵𝑡 2. 上記の数式を試行回数分コピーする 3. 上記の計算結果を階級に分ける 4. 階級毎の値をカウントする 5. 4をグラフ化する 8 Sample: Case1-1_1-2.xlsm
  9. 9. 数式だけでもモンテカルロ・シミュ レーションは実装できるが・・・ 試行回数を増やしたい時に、セルを増やす必要がある 関連したセルを増やしたセルに対応させる必要がある シートの再計算がどんどん重くなって、シートがまともに使え なくなる 9
  10. 10. Case1-2: モンテカルロ・シミュレー ションをVBAで実装 とにかくコードが長くなる(特にヒストグラムのところ) シートのレイアウトを変更したくなった時に、対応しているセ ルのアドレスを全て変更する必要がある(名前の定義である程度 は対処可能) とにかく遅い 10 Sample: Case1-1_1-2.xlsm
  11. 11. Case1-3: モンテカルロ・シミュレー ションをPythonで実装 とにかくコードが短い(特にヒストグラムのところ) データの置き場所を一々考えなくていい VBAより速い 11 Sample: Case1-3.ipynb
  12. 12. Excel vs. Python Lines of Code: 105 Wall Time: 7.89s More complex Lines of Code: 10 Wall Time: 0.83s More simple 12
  13. 13. とはいえExcelの方がいいときもある よね 入力し易い 帳票等のフォーマットを作りやすい ものすごくたくさんの人が使っている(データの互換性が高い) 13
  14. 14. ExcelとPythonのいいとこ取りをしよ う PythonからExcelを使うためのパッケージ xlrd xlwt XlsxWriter xlutils openpyxl xlwings ExcelPython 14
  15. 15. 色々なパッケージがあるけどpandas で十分 pandas.read_excel()でなんとかなることが多い pandasではできないことを他のパッケージで補うやり方が効率 的 pandasではできないこと オープンしているファイルに対しての書き込み セルの操作 グラフの描画やセルの結合等の細かい処理 15
  16. 16. Case1-4: 経済指標と為替、株価の関係 を見てみる 日経新聞のサイトから経済指標と株価のExcelファイルをpandas で開く 経済指標 実質GDP 景気動向指数(先行) 為替 : ドル円 株価 : 日経平均株価 seabornで可視化 16 Sample: Case1-4.ipynb
  17. 17. Case 1-5: 日銀のREIT, ETF買い入れと REIT, 株価指数の関係を見てみる BOJのサイトからExcelファイルをpandasで開く k-dbから東証REIT指数、株価を取得 株価指数 TOPIX JPX400 日経平均 seabornで可視化 17 Sample: Case1-5.ipynb
  18. 18. xlwingsを使ってみる openしているExcelファイルに対して読み込み/書き込みができ る Numpy, pandasのデータ型が扱える ExcelからPythonのスクリプトを呼び出すことができる Excelのユーザ定義関数(UDF)をPythonで作ることができる セルの結合やグラフの処理等はopenpyxlの方が向いている 18
  19. 19. Call Python script from Excel 19 module function
  20. 20. User Defined Functions (UDF) 20 You can use custom functions written in Python!
  21. 21. UDF returns multiple values to each cells 21 Using array formula (Ctrl + Shift + Enter)
  22. 22. Case1-6:pandasで株価を取得してExcel のセルに表示する xlwingsを使うと ExcelからPythonのコードを実行することができる PandasのDataFrameをExcelのセルにそのまま適用できる ExcelのマクロのようにPythonコードが使える 株価はpandas_datareaderで取得できる 22 Sample: Case1-6.xlsm
  23. 23. Case 1-7:ユーザ定義関数をPythonで 作ってExcelの関数として使う Windowsのみ(Macはできないらしい) アドインをインストールする Pythonで作成した関数をExcelの関数として、ワークシートのセ ル上から使えるようになる セルの範囲を引数にして、NumpyのarrayやpandasのDataFrame として処理できる 複数の戻り値を複数のセルに渡すことができる 23 Sample: Case1-7.xlsm
  24. 24. 時系列データは怖くない ~pandasと仲良くなろう~ 24
  25. 25. Why pandas? pandas はWes McKinney氏がAQR Capital Management(クオンツ運 用をしている投資会社)在籍中に作り始められた Pythonから下記の要件を一つのツールで実装すべくpandasが開 発された ラベル付されたデータ構造 時系列データを扱う機能が統合 算術演算と集約演算にメタデータの情報を指定できる 欠損値を柔軟に扱うことができる SQLベースのデータベースで使用可能な関係演算を扱うことができる 金融の専門家が作ったツールなので、金融データに向いていな い訳がない 25
  26. 26. Case2-1: DatetimeIndexを使ってみる 連続データの作成はpandas.date_rangeが非常に便利 DatetimeIndexの利点 参照時に様々な型を指定できる datetime.date型, datetime.datetime型, datetime.time型, str型, int型, etc… 曖昧な表記でも受け付けてくれる(dateutil.parserのパースのように動作 する) 年や月指定でスライスができる 欠損値を扱うことができる 26 Sample: Case2-1_2.ipynb
  27. 27. Case2-2: 四本値を作成、範囲を変換 四本値を作るのは意外と大変・・・ .resample()メソッドで指定の頻度に変換してくれる 日足、週足、月足、年足、30分足、1時間足、etc 四本値から四本値へresampleする場合にはコツがいる 27 Sample: Case2-1_2.ipynb
  28. 28. 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
  29. 29. 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
  30. 30. 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
  31. 31. 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
  32. 32. デリバティブの満期日を扱う 取引所 JPX 商品 株価指数先物オプション 満期日 毎月第二金曜日 該当日が祝日の場合はその前日 http://www.jpx.co.jp/derivatives/r ules/last-trading-day/ 32
  33. 33. 満期日の例(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
  34. 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 – 2017/08) 34
  35. 35. 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. 36. 課題 祝日をどうするか 第二金曜日をどうやって判定するか 36
  37. 37. 日本の祝日に対応するには・・・ 米国の場合はpandas.tseries.holiday.USFederalHolidayCalendarが用 意されているが日本の祝日には対応していない(2016/09/22現 在) AbstractHolidayCalendarクラスを継承して、祝日のルールを作成 することができるが、色々と大変・・・ 年によって祝日が異なる CustomBusinessDayで個別の休日を実装できる 既にあるカレンダーデータを利用してpandasに実装してみる 37
  38. 38. Case2-3: CustomBusinessDayで満期日 とそれまでの日数を計算してみる yaml形式で提供されている祝日データを取り込む 第二金曜日はpandas.date_range(freq=‘WOM-2FRI‘)で作成できる CustomBusinessDayで時間を演算した際には休日がスキップさ れる 38 Sample: Case2-3.ipynb
  39. 39. Jupyter Notebookを使い倒す ~便利な機能を見逃すな~ 39
  40. 40. Case3-1: マジックコマンドを自作して みる line magicで株価を検索し、IPython.display.IFrameに出力してみ る cell magicで様々な形式のデータをnotebookのセルに貼り付けて pandasのDataFrameに変換してみる よく使うコマンドは.py形式に保存して%load_extで呼び出すこ とができる 40 Sample: Case3-1.ipynb
  41. 41. Case3-2: ipywidgetsを使って超かんた んにUIを作る ipywidgets.interactを関数にデコレートするだけで簡単にUIを実 装できる ipywidgets.interactの引数の型によってUIが決まる bool型: チェックボックス int型: スライダー 株価の移動平均とボリンジャーバンドの範囲を動的に変化させ るグラフを作ってみる 41 Sample: Case3-2.ipynb
  42. 42. 便利なNbextensions Nbextentionは個別にインストールすることも可能だが、 jupyter_contrib_nbextensionsからまとめてインストールをするの が便利 https://github.com/ipython-contrib/jupyter_contrib_nbextensions Nbextensions edit menu itemで個々のextentionのEnable/Disableが 簡単にできる Javascriptでextentionを自作することもできる 42
  43. 43. 今回のまとめ Python >>> 越えられない壁 >>> Excel 時系列データに便利 簡単にコマンドやUIを作れる 43
  44. 44. サンプルコード等について 今回使用したサンプルコード、Excel ファイルはGithubに置いてあります https://github.com/drillan/pyconjp2016 下記の対応をしたため、冗長な部分が あります Python2, Python3の両方に対応 インターネット未接続時はオフラインの ファイルを参照 ライセンス制限は特に設けていません。 ご自由にお使いください 44
  45. 45. ご清聴 ありがとうございました See you next year? 45

×