データ解析への道 #1 　〜株価編〜

Pythonを学び始めて早３ヶ月。データ解析学習中です。
Jupyter Notebookなどが主流だと思いますが、PyCharmを使用してデータ解析をしていきたいと思います。


#使用するソフトウェア
######
>
- <b>PyCharm</b>  
   https://www.jetbrains.com/pycharm/  
Professional版を使用。



#記事内容
株式データを元にデータの可視化についてメモを（主に自分用に）残す。

#インポート

```python:stock_analysis.py
import pandas as pd
from pandas import Series, DataFrame
import pandas_datareader as web

import numpy as np
import matplotlib.pyplot as plt

from datetime import datetime

import seaborn as sns
sns.set_style('whitegrid')
```


# データ可視化
## 1. 様々なグラフ表示
```python:stock_analysis.py
# 続き

tech_list = ['AAPL', 'GOOG', 'MSFT', 'AMZN']  # 左から Apple, Google, Microsoft, Amazon

# 直近１年分のデータを取得するため。
end = datetime.now()
start = datetime(end.year - 1, end.month, end.day)

# comp_list内の企業それぞれの株価データの取得。
for entry in comp_list:
    globals()[entry] = web.DataReader(entry, 'yahoo', start, end)

# globals()関数はグローバル変数を返してくれる。
AAPL['Adj Close'].plot(legend=True, figsize=(10, 4))
plt.show()
```
上記を実行すると、以下のようなグラフが実行結果として得られる。
![myplot1.png](https://qiita-image-store.s3.amazonaws.com/0/293241/e5637917-6db7-cb76-2650-0f484f79e7c9.png)

使用されたそれぞれの関数の引数は、

|　　　　　　　　　|引数　        | 説明      |
|:-------------:|:-------:|:-----------:|
|DataReader(<b>name, data_source, start, end</b>)|<b>name|（株価データを獲得したい＆すでに定義した）企業名|
|         |<b>data_source   |データソース元|
|         |<b>start, end | データの取得期間（start & end）|
|plot(<b>legend, figsize</b>)|<b>legend|凡例を表示させるか否か(=True or False)[default: False]|
|      |<b>figsize|表示するサイズ (x, y)|

移動平均を算出するには

```python:stock_analysis.py

# 続き

# 移動平均を算出する。
ma_day = [10, 20, 50] # ma: moving average
for ma in ma_day:
    column_name = 'MA {}'.format(ma)
    # 移動平均算出（old version: pd.rolling_mean(AAPL['Adj Close'], ma)
    AAPL[column_name] = AAPL['Adj Close'].rolling(ma).mean()

print(AAPL.head())

```
＜実行結果：テーブル＞

|            |      High  |       Low  |      Open  |...    |MA 10  |MA 20  |MA 50
|:----------:|:----------:|:----------:|:----------:|:-----:|:-----:|:-----:|:---:
|Date        |            |            |            |...    |       |       |     
|2017-11-27  |175.080002  |173.339996  |175.050003  |...    |  NaN  |  NaN  |  NaN
|2017-11-28  |174.869995  |171.860001  |174.300003  |...    |  NaN  |  NaN  |  NaN
|2017-11-29  |172.919998  |167.160004  |172.630005  |...    |  NaN  |  NaN  |  NaN
|2017-11-30  |172.139999  |168.440002  |170.429993  |...    |  NaN  |  NaN  |  NaN
|2017-12-01  |171.669998  |168.500000  |169.949997  |...    |  NaN  |  NaN  |  NaN

>- Open：始値
- High：高値
- Low：安値
- Close：終値
- Volume：出来高（1日に取引が成立した株の数）
- Adj Close：調整後終値  

そして、これをグラフで表す。


```python:stock_analysis.py
#　続き

AAPL[['Adj Close', 'MA 10', 'MA 20', 'MA 50']].plot(subplots=False, figsize=(10, 4))
plt.show()
```
＜実行結果：グラフ＞
![myplot２.png](https://qiita-image-store.s3.amazonaws.com/0/293241/16319948-a184-b5db-9ef9-151c7cd120cb.png)

次に、日毎の調整後終値の変動推移を計算する。

```python:stock_analysis.py
 # 続き

# pct_change: 変動推移を計算
AAPL['Daily Return'] = AAPL['Adj Close'].pct_change()
print(AAPL.head())
```

＜実行結果：テーブル＞

|            |      High  |       Low  |...    |MA 50  |Daily Return  |
|:----------:|:----------:|:----------:|:-----:|:-----:|:------------:|
|Date        |            |            |...    |       |              |     
|2017-11-27  |175.080002  |173.339996  |...    |  NaN  |  NaN         | 
|2017-11-28  |174.869995  |171.860001  |...    |  NaN  |   -0.005859  |   
|2017-11-29  |172.919998  |167.160004  |...    |  NaN  |    -0.020743 |  
|2017-11-30  |172.139999  |168.440002  |...    |  NaN  |   0.013984   |  
|2017-12-01  |171.669998  |168.500000  |...    |  NaN  |  -0.004655   |  

グラフで可視化するには、

```python:stock_analysis.py
# 続き

AAPL['Daily Return'].plot(figsize=(10, 4), legend=True, linestyle='--', marker='o')
plt.show()
```
＜実行結果：グラフ＞
![myplot3.png](https://qiita-image-store.s3.amazonaws.com/0/293241/6b33ac07-b702-27d1-370b-cc54b359b743.png)


##2. 分布図
次に、snsを使用して正規分布を取得する、

```python:stock_analysis.py
# 続き

sns.distplot(AAPL['Daily Return'].dropna(), bins=100, color='purple')
plt.show()
```

＜実行結果：分布図＞
![myplot4.png](https://qiita-image-store.s3.amazonaws.com/0/293241/83b10d77-121d-6a36-3924-619d7ece5ef2.png)

```python:stock_analysis.py
# 続き

sns.distplot(AAPL['Daily Return'].dropna(), bins=100, color='purple')  
# dropna(): テーブル上でNaNになっている部分を無くす。
plt.show()
```
＜実行結果：分布図＞
![myplot5.png](https://qiita-image-store.s3.amazonaws.com/0/293241/2c3df2b5-bf13-bff3-e4ba-0d881e2906c7.png)

次にそれぞれの調整後終値（Adj Close）を取得する。

```python:stock_analysis.py
# 続き
closing_df = web.DataReader(['AAPL', 'GOOG', 'MSFT', 'AMZN'], 'yahoo', start, end)['Adj Close']  # 左から、Apple, Google, Microsoft, Amazon
print(closing_df.head())
```
＜実行結果：テーブル＞

|Symbols    |      AAPL |       AMZN  |       GOOG   |    MSFT    |
|:---------:|:---------:|:-----------:|:------------:|:----------:|
|Date       |           |             |              |            |
|2017-11-27 | 171.514999|  1195.829956|  1054.209961 | 82.442818  |
|2017-11-28 | 170.510101|  1193.599976|  1047.410034 | 83.435616  |
|2017-11-29 | 166.973206|  1161.270020|  1021.659973 | 81.921829  |
|2017-11-30 | 169.308151|  1176.750000|  1021.409973 | 82.737709  | 
|2017-12-01 | 168.519974|  1162.349976|  1010.169983 | 82.826172  |



次に、それぞれの変動値を求める。

```python:stock_analysis.py
# 続き
tech_rets = closing_df.pct_change()
print(tech_rets.head())
```
＜実行結果：テーブル＞

|Symbols    |     AAPL |     AMZN |     GOOG |     MSFT|
|:---------:|:--------:|:--------:|:--------:|:-------:|
|Date       |          |          |          |         |
|2017-11-27 |      NaN |      NaN |      NaN |      NaN|
|2017-11-28 |-0.005859 |-0.001865 |-0.006450 | 0.012042|
|2017-11-29 |-0.020743 |-0.027086 |-0.024585 |-0.018143|
|2017-11-30 | 0.013984 | 0.013330 |-0.000245 | 0.009959|
|2017-12-01 |-0.004655 |-0.012237 |-0.011004 | 0.001069|