Pythonを学び始めて早3ヶ月。データ解析学習中です。
Jupyter Notebookなどが主流だと思いますが、PyCharmを使用してデータ解析をしていきたいと思います。
#使用するソフトウェア
-
PyCharm
https://www.jetbrains.com/pycharm/
Professional版を使用。
#記事内容
株式データを元にデータの可視化についてメモを(主に自分用に)残す。
#インポート
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. 様々なグラフ表示
stock_analysis.py
# 続き
tech_list = ['AAPL', 'GOOG', 'MSFT', 'AMZN'] # 左から Apple, Google, Microsoft, Amazon
# 直近1年分のデータを取得するため。
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()
上記を実行すると、以下のようなグラフが実行結果として得られる。
使用されたそれぞれの関数の引数は、
引数 | 説明 | |
---|---|---|
DataReader(name, data_source, start, end) | name | (株価データを獲得したい&すでに定義した)企業名 |
data_source | データソース元 | |
start, end | データの取得期間(start & end) | |
plot(legend, figsize) | legend | 凡例を表示させるか否か(=True or False)[default: False] |
figsize | 表示するサイズ (x, y) |
移動平均を算出するには
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:調整後終値
そして、これをグラフで表す。
stock_analysis.py
# 続き
AAPL[['Adj Close', 'MA 10', 'MA 20', 'MA 50']].plot(subplots=False, figsize=(10, 4))
plt.show()
次に、日毎の調整後終値の変動推移を計算する。
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 |
グラフで可視化するには、
stock_analysis.py
# 続き
AAPL['Daily Return'].plot(figsize=(10, 4), legend=True, linestyle='--', marker='o')
plt.show()
##2. 分布図
次に、snsを使用して正規分布を取得する、
stock_analysis.py
# 続き
sns.distplot(AAPL['Daily Return'].dropna(), bins=100, color='purple')
plt.show()
stock_analysis.py
# 続き
sns.distplot(AAPL['Daily Return'].dropna(), bins=100, color='purple')
# dropna(): テーブル上でNaNになっている部分を無くす。
plt.show()
次にそれぞれの調整後終値(Adj Close)を取得する。
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 |
次に、それぞれの変動値を求める。
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 |