暗号資産(仮想通貨)価格予測のデータ分析

# 概要
画像分析以外のデータサイエンスもやってみようということでKaggle上に乗ってあるコード＆解説のレビューを日本語でやってみます。

# 元のWebページ
https://www.kaggle.com/taniaj/cryptocurrency-price-forecasting

※Cryptocurrency 暗号資産
Forecast 前に投げる、から転じて予報、予測、など

#解説
最初10行は、ブロックチェーン技術について語られているので省略。
※distributed : 分散

インポート

```python
import pandas as pd
from pandas import DataFrame
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.seasonal import seasonal_decompose
from scipy import stats
import statsmodels.api as sm
from itertools import product
from math import sqrt
from sklearn.metrics import mean_squared_error 

import warnings
warnings.filterwarnings('ignore')

%matplotlib inline

colors = ["windows blue", "amber", "faded green", "dusty purple"]
sns.set(rc={"figure.figsize": (20,10), "axes.titlesize" : 18, "axes.labelsize" : 12, 
            "xtick.labelsize" : 14, "ytick.labelsize" : 14 })
```

配列操作のnumpyとpandas、matplotlibはグラフ化用、from itertool import productは集合の直積を行うパッケージ(ライブラリ)。
色指定はグラフ自体の色を指定している。

```
dateparse = lambda dates: pd.datetime.strptime(dates, '%Y-%m-%d')
df = pd.read_csv('../input/all_currencies.csv', parse_dates=['Date'], index_col='Date', date_parser=dateparse)
df = df.loc[:, ~df.columns.str.contains('^Unnamed')]
```

dfはデータフレームの略称である。

```
df.sample(5)
```

sample()はhead()と同じで、一部の表などのデータを出力する。
詳しくはrandomライブラリのモジュールの1つであり、第一引数の数だけアトランダムに抽出する。

```python
# Extract the bitcoin data only
btc=df[df['Symbol']=='BTC']
# Drop some columns
btc.drop(['Volume', 'Market Cap'],axis=1,inplace=True) 
```

# 定常性の検証と周期的な区分への分解

時系列データが安定的ならば、データに幅広い傾向（時間の経過に伴う平均と分散の変化）がないことを意味します。 これは、時系列予測の考慮事項として重要です。


statsmodelsライブラリは、時系列を調べるために使用する、単純な分解メソッドの実装であるseasonal_decomposeメソッドを提供します。

```python
btc_month = btc.resample('M').mean()
```
meanは平均を指す。

```
seasonal_decompose(btc_month.Close, model='additive').plot()
print("Dickey–Fuller test: p=%f" % adfuller(btc_month.Close)[1])
```

![キャプチャ22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698527/3b6c351e-d194-b6d5-4373-f626a9cb71c0.png)

見にくいが上下軸は上の表から
Observed
Trend
Seasonal
Resident
の順。
Resident は「P[x] = Q[x]A[x]+ R[x]」のRつまり余り、残差のこと。
p値は、系列が99.88％の正確さで定常ではないことを示します。

毎年繰り返されるように見えます。

また、2017年の初め頃まで残差はほぼ一定であり、価格がめちゃくちゃに動いているこの期間内にあるため、予測が困難になることもわかります。
# box-cox transformation
<a href="https://en.wikipedia.org/wiki/Power_transform" style= "font-color:blue">引用</a>

"""
パワー変換は、パワー関数を使用してデータの単調な変換(広義単調増加もしくは広義単調減少)を作成するために適用される関数でバラつきを安定にしたりデータを標準的な分散にする・・・・
・・・
パワー変換は複合的な分野で扱われ・・・医学的な研究、身体上の機能のモデリング・・・
"""
実際の定義式も引用先にあります。box-cox transformationはややシンプルな公式で表される。
パラメータλが1変数のとき
$$y_i^{(λ)} = \frac{(y_i^λ -1)}{λ}  \hspace{1em}  λ≠0 ,\hspace{1em} \log y_i \hspace{1em} \lambda=0  $$

パラメーターはデータから見積もって抽出される必要がある。

時系列データでは、行程に定数的でないバラつきがある。
バラつきが時間に沿って変化するなら定常的ではない. 定常的にするため、時系列データを変換することが望ましい、とされることが多い。Box-Coxを適用して行程が安定的な様に見えることもあるが、時には,そうでないこともある。 ARIMA modeling は違いや周期的な違いが、有用であるかどうか、どのように有用であるかというのは全体的なズレ(ノイズ)にしろ周期的なズレ(ノイズ)にしろ取り除くために有用であるかどうか、ということであるが、その有用性の判断を決定づけるために用いられる。そのモデリングの結果が ARMA model(定常課程)なのかもしれない。その行程中の判断がARMA modelの位数pを決定づけるかもしれない。 the AR and MAパラメータが見積もられる.

```python
# Box-Cox Transformations
btc_month['close_box'], lmbda = stats.boxcox(btc_month.Close)
print("Dickey–Fuller test: p=%f" % adfuller(btc_month.close_box)[1])
```
#差分化

一連のデータが定常的である点を得るまでに、時系列データを予報するためにモデルをビルドするとき別の前処理がデータの差分化である。ズレでなく振動のためのモデル,差分化によるズレのためのモデルによってわら士たちに振動のためのモデルを使用可能です。 

モデルが構築すれば、傾向を成分ごとに付け加えることで区分ごとのズレを扱うことができる。

周期的な差分化 
データを差分化するには,　周期的な差分化が見られる、ある観測と前年の観測の違いを計算することを含む。

```python
# Seasonal differentiation (12 months)
btc_month['box_diff_seasonal_12'] = btc_month.close_box - btc_month.close_box.shift(12)
print("Dickey–Fuller test: p=%f" % adfuller(btc_month.box_diff_seasonal_12[12:])[1])
```
Regular differentiation 
Sometimes it may be necessary to difference the data a second time to obtain a stationary time series, which is referred to as second order differencing.