CryptoWatchのAPIを用いたローソク足チャート生成

今回はPythonでCryptowatchのapiを叩き過去1時間のデータを取得、チャート描画までの過程をやってみます。機械学習モデルとして大量の約定データが必要となったので、おまけに取得したデータをCSVに記述して保存する過程もやってみます。
##**外部ライブラリ＆使った環境**
・Python 3.6.2 pip3
・requests（pip3 install requests）
・matplotlib（pip3 install matplotlib）
・mpl_finance（pip3 install git+https://github.com/matplotlib/mpl_finance）
・pandas（pip3 install pandas）

以前はmatplotlibにfinanceというメソッドが存在しましたがサポートされなくなった為に`mpl_finance`というもので代用します。

pandasはおまけのcsv出力用兼データ整形用です。

##**CryptoWatchAPIでデータを取得する**
requestsでAPIを叩いて過去1時間のデータを取得してみます。apiの使い方は[ココ。](https://cryptowatch.jp/docs/api)

```Python
import requests,time
import pandas as pd
from datetime import datetime

def get_OHLC(before,after):
    url = 'https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc'
    query = {
        'periods':60,
        'before':before,
        'after':after,
        }
    res = requests.get(,params=query).json()['result']['60']
    return res

unixTime = lambda y,m,d,h: int(time.mktime(datetime(y,m,d,h).timetuple()))

now = datetime.now()
y,m,d,h = now.year, now.month, now.day, now.hour

data = get_OHLC(unixTime(y,m,d,h),unixTime(y,m,d,h-1))

Time,Open,High,Low,Close = [],[],[],[],[]
for i in data:
    Time.append(i[0])
    Open.append(i[1])
    High.append(i[2])
    Low.append(i[3])
    Close.append(i[4])

pd.DataFrame({'open':Open, 'high':High, 'low':Low, 'close':Close}).to_csv('price.csv')
```
今回使うパラメーターは3つで、`periods`は時間を表していて1分足データが欲しいので60とします。`before,after`は取得する範囲を[unix時間](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93)で指定します。

例えば2018年3月28日の17時から18までの1時間を指定するなら、1522227600(18時)をbefore（前）に1522224000（17時）をafter（後）に入れます。

変数`unixTime`は時間をunix時間に変換するものです。ラムダ式で作りました。引数にy,m,d,hを定義してそれぞれを年、月、日、時に対応させます。

```Python
unixTime = lambda y,m,d,t: int(time.mktime(datetime(y,m,d,h).timetuple()))

print(unixTime(2018,3,28,17))
```
以上を実行するとUNIX時間を得ることができます。

```
1522224000
```
現在時間を取得して変数y,m.d.hにそれぞれ代入します。分は指定しないので00分となります。

```
now = datetime.now()
y,m,d,h = now.year, now.month, now.day, now.hour
```
変数`data`に関数`get_OHLC`の引数として現在時刻のunix時間とその1時間前の時刻を代入して取得したデータを格納します。

```
data = get_OHLC(unixTime(y,m,d,h),unixTime(y,m,d,h-1))
```
取得したデータを見てみます。

```
[[1522227600, 839200, 839342, 838326, 839303, 7.030089, 5896455], [1522227660, 838902, 839342, 838876, 839300, 1.1284219, 947056.06], [1522227720, 839299, 840929, 839156, 840929, 17.353899, 14579217], [1522227780, 840620, 841698, 840063, 841343, 11.973628, 10066623], [1522227840, 841222, 848426, 841222, 846864, 87.91499, 74249940], [1522227900, 846684, 847959, 845470, 845661, 27.833416, 23552682], [1522227960, 846168, 846168, 843700, 843700, 18.76452, 15859163].......
```

前から[unix時間, 始値, 高値, 安値, 終値, 出来高]で60個（60分ぶん）のリストが格納されています。unix時間、始値、高値、安値、終値をfor文で回してそれぞれ個別リストに格納します。

次にpandasモジュールを使ってCSVに書き込んでいきます。おまけなのでワンライナーですW

```
pd.DataFrame({'time':Time, 'open':Open, 'high':High, 'low':Low, 'close':Close}).to_csv('price.csv')
```
以下の画像のようになっていれば成功です。

![sumole.png](https://qiita-image-store.s3.amazonaws.com/0/213579/c8bfc585-c8f6-31d3-b3f0-11497da2a326.png)


##**チャートに描画する**

最後にローソク足チャートを作っていきます。

```Python
Date = [datetime(y,m,d,h-1) + dt.timedelta(minutes=mi) for mi in range(60)]
ohlc = zip(mdates.date2num(Date),Open, High, Low, Close)
ax = plt.subplot()

#x軸の単位を指定（15分間隔で表示）
ax.xaxis.set_major_locator(mdates.MinuteLocator([0,15,30,45]))

#x軸の表示を指定（時：分）
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))

#mpl_financeのメソッドを仕様（描画幅やチャートの色などを指定。デフォルトは赤黒）
candlestick_ohlc(ax, ohlc, width=(1/24/60)*0.7,colorup='g', colordown='r')

#チャート上部のテキスト
plt.title('BTC / JPY  by Cryptowatch API')

#チャートをpng形式で保存
plt.savefig('price.png')

#チャートを描画
plt.show()
```



##**コード全体像**

```Python
import requests,time
from datetime import datetime
import datetime as dt
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.dates as mdates
from mpl_finance import candlestick_ohlc

def get_OHLC(before,after):
    url = 'https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc'
    query = {
        'periods':60,
        'before':before,
        'after':after,
    }
    res = requests.get(url,params=query).json()['result']['60']
    return res

unixTime = lambda y,m,d,h: int(time.mktime(datetime(y,m,d,h).timetuple()))

now = datetime.today()
y,m,d,h = now.year,now.month,now.day,now.hour
text = str(y) + '-' + str(m) + '-' + str(d) + ' ' + str(h) + ':00'

data = get_OHLC(unixTime(y,m,d,h),unixTime(y,m,d,h-1))

Time,Open,High,Low,Close = [],[],[],[],[]
for i in data:
    Time.append(i[0])
    Open.append(i[1])
    High.append(i[2])
    Low.append(i[3])
    Close.append(i[4])

pd.DataFrame({'time':Time, 'open':Open, 'high':High, 'low':Low, 'close':Close}).to_csv('price.csv')

Date = [datetime(y,m,d,h-1) + dt.timedelta(minutes=mi) for mi in range(60)]
ohlc = zip(mdates.date2num(Date),Open, High, Low, Close)
ax = plt.subplot()
ax.xaxis.set_major_locator(mdates.MinuteLocator([0,15,30,45]))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
candlestick_ohlc(ax, ohlc, width=(1/24/60)*0.7,colorup='g', colordown='r')
plt.title(text + '  BTC / JPY  by Cryptowatch API')

plt.savefig('price.png')
plt.show()
```

実行します。

![price.png](https://qiita-image-store.s3.amazonaws.com/0/213579/44ac60d5-3798-ffa1-8f85-fa5220366645.png)

画像のように表示されたら成功です。