Python で為替レートの折れ線グラフを表示してみました

Python で、 Matplotlib を使って、為替レートの折れ線グラフを表示してみました。

SciPy をインストールすると、 NumPy も、 Matplotlib も、 IPython(Jupyter Notebook) も、 pandas も使えるようです。 が、今回は、個別にインストールして進めてしまいました。

環境

  • Ubuntu 16.04 LTS
  • Python 3.5.2
  • jupyter-1.0.0
  • pandas-0.22.0
  • numpy-1.14.3
  • matplotlib-2.2.2

pandas

pandas is an open source, BSD-licensed library providing high-performance, easy-to-use data structures and data analysis tools for the Python programming language.

pandas is a NumFOCUS sponsored project. This will help ensure the success of development of pandas as a world-class open-source project, and makes it possible to donate to the project.

Python Data Analysis Library — pandas: Python Data Analysis Library

pandas は高性能で使いやすいデータ構造とデータ分析ツールのライブラリーようです。

Installing from PyPI

pandas can be installed via pip from PyPI.

pip install pandas

Installation — pandas 0.22.0 documentation

引用のページの最初には、 Anaconda をインストールする記載がありました。 が、今回は pip を使ってインストールしてみます。

(jup) $ pip install pandas
Collecting pandas
  Downloading https://files.pythonhosted.org/packages/99/0a/37930bbee7a06bb5ce7e12f7970b29a17a49605d0b08a72dee7ab76135bb/pandas-0.22.0-cp35-cp35m-manylinux1_x86_64.whl (25.7MB)
    100% |████████████████████████████████| 25.7MB 556kB/s
Collecting numpy>=1.9.0 (from pandas)
  Downloading https://files.pythonhosted.org/packages/7b/61/11b05cc37ccdaabad89f04dbdc2a02905cf6de6f9b05816dba843beed328/numpy-1.14.3-cp35-cp35m-manylinux1_x86_64.whl (12.1MB)
    100% |████████████████████████████████| 12.1MB 605kB/s
Requirement already satisfied: python-dateutil>=2 in ./lib/python3.5/site-packages (from pandas) (2.7.2)
Collecting pytz>=2011k (from pandas)
  Downloading https://files.pythonhosted.org/packages/dc/83/15f7833b70d3e067ca91467ca245bae0f6fe56ddc7451aa0dc5606b120f2/pytz-2018.4-py2.py3-none-any.whl (510kB)
    100% |████████████████████████████████| 512kB 4.0MB/s
Requirement already satisfied: six>=1.5 in ./lib/python3.5/site-packages (from python-dateutil>=2->pandas) (1.11.0)
Installing collected packages: numpy, pytz, pandas
Successfully installed numpy-1.14.3 pandas-0.22.0 pytz-2018.4

pandas をインストールしました。 numpy もインストールされているぽいです。

Matplotlib

Matplotlib is a Python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms. Matplotlib can be used in Python scripts, the Python and IPython shells, the Jupyter notebook, web application servers, and four graphical user interface toolkits.

Matplotlib: Python plotting — Matplotlib 2.2.2 documentation

Matplotlib は Python の 2D プロットライブラリーのようです。 折れ線グラフとか、他にもたくさんのグラフを表示できるようです。

Installing an official release

Matplotlib and most of its dependencies are all available as wheel packages for macOS, Windows and Linux distributions:

python -mpip install -U pip
python -mpip install -U matplotlib

Installing — Matplotlib 2.2.2 documentation

Matplotlib も pip でインストールしてみます。

(jup) $ pip install matplotlib
Collecting matplotlib
  Downloading https://files.pythonhosted.org/packages/81/31/4e261379e0cd4e9bbacfc96b124ebac0706b44374bd1d34ef899796f741b/matplotlib-2.2.2-cp35-cp35m-manylinux1_x86_64.whl (12.6MB)
    100% |████████████████████████████████| 12.6MB 995kB/s
Requirement already satisfied: numpy>=1.7.1 in ./lib/python3.5/site-packages (from matplotlib) (1.14.3)
Requirement already satisfied: pytz in ./lib/python3.5/site-packages (from matplotlib) (2018.4)
Requirement already satisfied: six>=1.10 in ./lib/python3.5/site-packages (from matplotlib) (1.11.0)
Collecting kiwisolver>=1.0.1 (from matplotlib)
  Downloading https://files.pythonhosted.org/packages/7e/31/d6fedd4fb2c94755cd101191e581af30e1650ccce7a35bddb7930fed6574/kiwisolver-1.0.1-cp35-cp35m-manylinux1_x86_64.whl (949kB)
    100% |████████████████████████████████| 952kB 9.2MB/s
Requirement already satisfied: python-dateutil>=2.1 in ./lib/python3.5/site-packages (from matplotlib) (2.7.2)
Collecting cycler>=0.10 (from matplotlib)
  Downloading https://files.pythonhosted.org/packages/f7/d2/e07d3ebb2bd7af696440ce7e754c59dd546ffe1bbe732c8ab68b9c834e61/cycler-0.10.0-py2.py3-none-any.whl
Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 (from matplotlib)
  Downloading https://files.pythonhosted.org/packages/6a/8a/718fd7d3458f9fab8e67186b00abdd345b639976bc7fb3ae722e1b026a50/pyparsing-2.2.0-py2.py3-none-any.whl (56kB)
    100% |████████████████████████████████| 61kB 1.3MB/s
Requirement already satisfied: setuptools in ./lib/python3.5/site-packages (from kiwisolver>=1.0.1->matplotlib) (39.1.0)
Installing collected packages: kiwisolver, cycler, pyparsing, matplotlib
Successfully installed cycler-0.10.0 kiwisolver-1.0.1 matplotlib-2.2.2 pyparsing-2.2.0

インストールできました。

Jupyter Notebook

Jupyter Notebook で編集しながら実行していきます。 コードブロックのまとまりを Jupyter Notebook のセルに入力しながら進めました。 Jupyter Notebook のインストールと起動は、前回の記事に書いた通りです。

To set this up, before any plotting or import of matplotlib is performed you must execute the %matplotlib magic command. This performs the necessary behind-the-scenes setup for IPython to work correctly hand in hand with matplotlib; it does not, however, actually execute any Python import commands, that is, no names are added to the namespace.

…略…

A particularly interesting backend, provided by IPython, is the inline backend. This is available only for the Jupyter Notebook and the Jupyter QtConsole. It can be invoked as follows:

%matplotlib inline

With this backend, the output of plotting commands is displayed inline within frontends like the Jupyter notebook, directly below the code cell that produced it. The resulting plots will then also be stored in the notebook document.

Plotting


matplotlib mode

To make plots using Matplotlib, you must first enable IPython's matplotlib mode.

To do this, run the %matplotlib magic command to enable plotting in the current Notebook.

This magic takes an optional argument that specifies which Matplotlib backend should be used. Most of the time, in the Notebook, you will want to use the inline backend, which will embed plots inside the Notebook:

%matplotlib inline

You can also use Matplotlib GUI backends in the Notebook, such as the Qt backend (%matplotlib qt). This will use Matplotlib's interactive Qt UI in a floating window to the side of your browser. Of course, this only works if your browser is running on the same system as the Notebook Server. You can always call the display function to paste figures into the Notebook document.

matplotlib mode

Matplotlib を使ってプロットするには %matplotlib マジックコマンドでプロットを有効にする必要があるみたいです。 %matplotlib inline と記述すると、 Jupyter Notebook のセルのすぐ下にプロットしてくれるようです。

%matplotlib inline

必要なモジュールをインポートします。

import time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime

データを読み込みます。

df = pd.read_json('daily.json', dtype={ 0: 'int64', 1: 'float64', 2: 'float64', 3: 'float64', 4: 'float64' })

読み込んだデータは Gist にアップしてあります。 このデータは、以前書いた、米ドル/円の日足のデータです。 型を明示的に指定しておいた方がよさそうなので指定しています。

読み込んだデータの日時と終値を変換します。

df['DATE'] = pd.to_datetime(df[0], unit='ms')
df['USDJPY'] = df[4].astype('float64')

プロットしたときに、 Unix エポックのミリ秒だとラベルが日付の書式で表示されなかったので、 datetime 型にしました。 それから、列の名前をつけて DataFrame に設定しました。 .astype で型をキャストできるようなのですが、読み込むときに 'float64' と指定しているためあまり意味はありません。

See the cookbook for some advanced strategies

The plot method on Series and DataFrame is just a simple wrapper around plt.plot():

Basic Plotting: plot

折れ線グラフを表示してみます。 pandas の DataFrame には簡単にプロットするメソッドがあるようで、 DataFrame の plot メソッドを呼べばいいみたいです。 DataFrame の plot メソッドは、 Matplotlib の plt.plot() のラッパーのようです。

df.plot(x='DATE', y='USDJPY')

結果は、ここに Gist の埋め込みコードを入れておきます。

ちゃんと見られるかな。

ローソク足を表示

最初、ローソク足を表示しようとしたのですが、結果的に諦めてしまいました。

This module is deprecated in 2.0 and has been moved to a module called mpl_finance.

finance

Matplotlib の finance モジュールを使うと表示できるようなのですが、このモジュールは 2.0 で廃止され、 mpl_finance というモジュールに移ったようです。

GitHub に mpl_finance はあったのですが、インストールの手順が明確に記載されていませんでした。 setup.py がそれらしい名前のようにも見えるのですが、 Python のプログラムとして動かせばインストールできるのかな。

あるいは、 pip のモジュールがあるかと思って、 pip search しましたが、見つからなくて、 pip でインストールできないならいいや、と思ってしまいました。

それから、 Matplotlib のチャートは、 Chart.js や Highcharts のようにツールチップも表示されなくて、なんだか見づらかったです。 でも、逆に言うと、 Chart.js や Highcharts は見やすかったと認識することができました。 だから Matplotlib を使ってみてよかったです。

nbviewer

A simple way to share Jupyter Notebooks

nbviewer

作成したファイルを Gist とかにアップしておくと、 nbviewer で見ることができるようです。 前から使ってみたかったものでした。

今回、作ったものは次のリンクにアクセスすると、 nbviewer で見ることができます。

nbviewer はビューアーなので、編集はできないようでした。 編集もできるものかと思っていましたので、これは残念でした。 Gist にあるものだったらビューアーを使わなくても Gist で見ることができてしまうので、あまり nbviewer で見ることもないかもしれません。

終わり

SciPy を使って、トレードの結果を分析するのに活かせるといいな、と思っています。 使いこなせるようになりたい。

18 May 2018 追記

Gist と Jupyter Notebook Viewer の違いがわかりました。

%%html マジックコマンドや %%javascript マジックコマンドを使って、 Highcharts の棒グラフを表示してみました。 Gist のビューアーでは表示することができませんでしたが、 Jupyter Notebook Viewer では表示することができました。 小細工をすると、 Gist のビューアーでは表示することができないようでした。

それから、ようやく Jupyter Notebook にローソク足を表示することができました。