Pythonで為替レートを取得しチャートとして可視化するまでの手順

## 概要

最近、シストレの勉強を始めました。

もともと趣味でFXをやっているので投資に関する知識はそれなりにあるつもりですが、シストレに関しては全くの素人であるため何をやれば良いのかいまいちわかっておりません...。

そこで、何はともあれまずは為替レートを取得し、あわよくばそれをチャートに起こすところからスタートしたいなと思い、色々試行錯誤した結果をメモ書きしておきます。

## 仕様

- Docker
- Python3
- Jupytar Notebook



Jupytar Notebookとは: Webブラウザ上でPythonを記述・実行できる統合開発環境の事。

## 環境構築

Jupytar Notebookを利用する方法は色々あるみたいですが、今回は公式が配布してくれているイメージを使いDockerでサクッと環境構築していきたいと思います。（めちゃくちゃ簡単でした。）

### 各ディレクトリ&ファイルを作成

```
$ mkdir jupyter-note-book-docker
$ cd jupyter-note-book-docker
$ mkdir work
$ touch docker-compose.yml
```

最終的に次のような構成になっていればOK。

```
jupyter-note-book-docker
├─ work
├─ docker-compose.yml
```

### docker-compose.ymlを編集

```yml:./docker-compose.yml
version: "3"
services:
  notebook:
    image: jupyter/datascience-notebook
    ports:
      - "8888:8888"
    environment:
      - JUPYTER_ENABLE_LAB=yes
    volumes:
      - ./work:/home/jovyan/work
    command: start-notebook.sh --NotebookApp.token=''
```

### コンテナを起動

```
$ docker-compose up -d
```

[localhost:8888](http://localhost:8888/) にアクセスし

![スクリーンショット 2021-03-08 0.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/bd73ab1b-fb4f-4f30-432d-6225900ea9cd.png)

こんな感じの画面が表示されれば成功です。

### コードを実装

![スクリーンショット 2021-03-08 0.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/6f39eb1b-6326-185a-eed9-17de559a7c11.png)

「work」ディレクトリへ入り、「Notebook」から「Python3」を選択。

![スクリーンショット 2021-03-08 0.28.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/e5dec9f8-8381-7977-0f10-9921e796d30c.png)

するとこんな感じでコードを記述できるようになるので、ここに色々と書いていきます。

#### ライブラリをインポート

まず最初に、今回の作業で必要になる各種ライブラリをインポートしておきます。

```python
import pandas_datareader.data as pdr # 株やFXをはじめとする各金融商品のデータが取得できるライブラリ。
import datetime

from matplotlib import pyplot as plt # データを可視化（チャートなどの形で表示）するためのライブラリ。
import seaborn as sns # 同上
sns.set()
```

![スクリーンショット 2021-03-08 0.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/8768fbc5-ec23-d5b2-25a8-ca047060a718.png)

上部バーの「▶︎」を押すとコードの実行ができるのですが、このままだと失敗してしまいました。

「ModuleNotFoundError: No module named 'pandas_datareader'」

つまり「pandas_datareaderが見つからないよ」と言われています。とうやらJupyter Notebookにはデフォルトで入っていないライブラリみたいなので、次のコマンドでインストールしていきます。

```
!pip install pandas_datareader
```

![スクリーンショット 2021-03-08 0.40.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/351604db-f846-04e8-7352-0b4c0b6501a8.png)

もう一度「[1]」を実行してみてエラーなどが起こらなければ成功です。

### 為替レートを取得

それでは、実際に為替レートを取得してみましょう。（今回はドル円）
コードは以下の通り。

```python
def get_excahnge_rate(currency_pair, data_source, start, end):
    selected = f'{currency_pair} = X'
    df = pdr.DataReader(selected, data_source, start, end).drop(['Volume', 'Adj Close'], axis = 1)
    
    return df

end = datetime.date.today()
start = end - datetime.timedelta(days = 365)

usd_jpy = get_excahnge_rate('USDJPY', 'yahoo', start, end)
usd_jpy.head
```

3行目のDataReader()に渡す引数がポイントとなります。

|  引数  |  説明  |
| ---- | ---- |
|  第一引数  |  データ名（通貨ペアなどを指定）  |
|  第二引数  |  データソース（どこからデータを取得するか）  |
|  第三引数  |  取得開始年月日（datetime型）  |
|  第四引数  |  取得終了年月日（datetime型）  |

データソースとしては、

- FRED
- OECD
- Yahoo

など様々なところが指定できるみたいです。今回はYahooを指定しています。

参照: [公式ドキュメント](https://pandas-datareader.readthedocs.io/en/latest/remote_data.html)


![スクリーンショット 2021-03-08 1.06.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/1223351f-07e2-239c-5423-9bf3e7e2fbcf.png)

Jupytar Notebookから上記コードを実行すると、1年前から今日までのUSD/JPYレートが取得できているはず。

### チャートとして可視化

↑で取得した為替レートをチャートとして可視化してみましょう。

```python
fig = plt.figure(figsize = (10, 8))

ax = fig.add_subplot(1, 1, 1)
ax.set_title('USD/JPY')

sns.lineplot(x = usd_jpy.index, y = usd_jpy.High, ax = ax)
plt.tight_layout()
```

![スクリーンショット 2021-03-08 1.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/956ad57f-38ce-f5b0-6556-f0393fcfdc4d.png)

こんな感じでチャートが表示されていれば成功です。

## あとがき

だいぶザックリではありましたが、為替レートを取得してチャートとして可視化するまでの手順を紹介させていただきました。これだけではまだまだ実際のシストレには程遠いでしょうが、最低限入り口くらいには立てたと思います。これをベースに色々と分析など行っていきたいなと。

自分はPythonに入門したばかりの初心者なので説明が不足していたり雑になってしまったりしている部分はありますが、何となく雰囲気だけでも伝われば幸いです。これから当分シストレの勉強は続けていくつもりなので、随時更新していくかもしれません。

※追記: 同じような要領でバックテストを実行したので別記事にまとめました。

https://qiita.com/kazama1209/items/98f63b624f3987ba3322