PythonでPoloniex APIからBitcoin価格データを取得して、テクニカル分析のためのローソク足チャートを作る。

Poloniexというアメリカの仮想通貨取引所が仮想通貨価格データをPythonのAPIで提供しているので、そこからデータを取得して、ローソク足チャートのグラフを作ろうと思います。さらに、テクニカル分析のための指標を追加し、下のようなグラフを作成します。

![technical_btc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/b0b39012-232f-df57-a5d4-d039d13e60cb.png)


Poloniex API
--
GitHub
>https://github.com/s4w3d0ff/python-poloniex.git

#### インストール
pipかgit cloneしてインストールします。
##### pip

```
pip3 install https://github.com/s4w3d0ff/python-poloniex/archive/v0.4.6.zip
```

##### git
```
git clone https://github.com/s4w3d0ff/python-poloniex.git
python setup.py install
```

データ取得
--
必要なライブラリをインポート

```python
import poloniex

import pandas as pd
from pandas import Series, DataFrame
import numpy as np
import matplotlib.pyplot as plt
```

ビットコインの価格(USドル/BTC)を取得するには、'USDT_BTC'を指定(イーサリアムであれば、'USDT_ETH')。
1日ごとのデータを1年分取得するには、以下のようになります。

```python
polo = poloniex.Poloniex()
period = polo.DAY # period of data
end = time.time()
start = end - period * 365 # 1 year

chart = polo.returnChartData('USDT_BTC', period=period, start=start, end=end)
```

取得したデータは辞書型なので、PandasのDataFrameに変換します。

```python
df = DataFrame.from_dict(chart)
df.head()
```
![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/ff7b77d1-645b-d5b1-fc3e-aa481b37848f.jpeg)

dateカラムはタイムスタンプで、high(最高値)やclose(終値)などのデータがあります。
ここからデータを取り出し、open価格をプロットしてみます。

```python
timestamp = df['date'].values.tolist() # Series -> ndarray -> list
# timestamp -> year/month/day
date = [datetime.datetime.fromtimestamp(timestamp[i]).date() for i in range(len(timestamp))]

price = df['open'].astype(float)

plt.figure(figsize=(15, 4))
plt.plot(date, price)
```

![図3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/ebee4f5f-e8e8-dd9f-60c1-3a75958df203.jpeg)

ローソク足チャート
--
matplotlibのファイナンス用ライブラリを使います。

```
pip install mplfinance
```

```python
import mplfinance as mpf
```

直近100日のローソク足チャートを描画します。
必要なデータを含むDataFrameをmpfのplot関数に渡しますが、カラム名は['Open', 'High', 'Low', 'Close', 'Volume']と一致する必要があり、indexはDatatimeIndexの時系列データである必要があります。

```python
df_candle = df.tail(100) # 100日分を取り出す
df_candle.index = pd.to_datetime(df_candle['date']) # DatatimeIndexに変換してindexに指定
df_candle = df_candle[['open', 'high', 'low', 'close', 'volume']] # 必要なカラムだけにする
df_candle.columns = ['Open', 'High', 'Low', 'Close', 'Volume'] # カラム名を変更
df_candle = df_candle.astype(float) # データ型を一致させる
df_candle.head()
```

![図4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/9315eecb-3f26-99a0-c55c-df2f45fa855e.jpeg)

mpfのplot関数でtype='candle'を指定して、プロット・保存。

```python
mpf.plot(df_candle, type='candle', figratio=(12,4), savefig='candlestick_btc.png')
```

![candlestick_btc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/475c73c5-81f2-6e6a-bcff-0f06f37714fa.png)

テクニカル分析のためのチャート
--
テクニカル分析のために、20日EMA(指数平滑移動平均線)・50日SMA(単純移動平均線)・ボリンジャーバンドをローソク足チャートに追加します。まず、必要なデータを計算し、DataFrameに追加します。

```python
# 20日EMA
df['EMA20'] = df['open'].ewm(span=20).mean()
# 50日SMA
df['SMA50'] = df['open'].rolling(window=50).mean()

# ボリンジャーバンド
r = df['open'].rolling(10)
df['upper'] = r.mean() + 2 * r.std()
df['lower'] = r.mean() - 2 * r.std()
```

100日分をプロットします。

```python
df_tech = df.tail(100)
df_tech.index = pd.to_datetime(df_tech['date'])
df_tech = df_tech[['open', 'high', 'low', 'close', 'volume', 'EMA20', 'SMA50', 'upper', 'lower']]
df_tech.columns = ['Open', 'High', 'Low', 'Close', 'Volume', 'EMA20', 'SMA50', 'upper', 'lower']

addplot = mpf.make_addplot(df_tech[['EMA20', 'SMA50']]) # 追加のグラフ
fig, axes = mpf.plot(
    df_tech, type='candle', # ローソク足
    addplot=addplot, # グラフを追加
    volume=True, # 出来高
    # ボリンジャーバンド
    fill_between=dict(y1=df1['lower'].values, y2=df1['upper'].values, color='lightblue', alpha=.3),
    style='charles', #スタイルを変更
    returnfig=True, # legendを表示するため、axesをreturn
    figratio=(12,8))
axes[0].legend(['EMA20', 'SMA50'], loc=2) # 左上にlegend
```

![technical_btc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/10c1304f-377b-4e83-6a3d-6d88269e3fa1.png)

これで、テクニカル分析でよく見るようなチャートができました。

参考サイト
--
https://github.com/s4w3d0ff/python-poloniex

https://fuumin.net/?p=443

http://darden.hatenablog.com/entry/2016/07/31/203904

https://qiita.com/yoshizaki_91/items/79f4056901dd9c059afb

https://github.com/matplotlib/mplfinance

https://note.nkmk.me/python-pandas-matplotlib-candlestick-chart/

https://note.nkmk.me/python-pandas-time-series-datetimeindex/

https://bitbot.hatenablog.com/entry/2020/03/14/235040

http://serverarekore.blogspot.com/2020/10/mplfinance.html

https://github.com/matplotlib/mplfinance/blob/master/examples/plot_customizations.ipynb