Python　株価データ分析

使用環境：
window10
jupyternotebook

参考サイト：
キノコード / プログラミング学習チャンネル

Python学習の一環で、日経平均株価からデータ分析することをスタディしました。
備忘録としてアップしています。


日経平均日ごとの株価を取得します。panda datareaderというライブラリーを取得します。
これを使うと日経平均、ナスダック、日本の個別銘柄の株価を取得することができます。
!(イクスクラメーションマーク）を忘れないように。

```python
! pip install pandas_datareader
````
インポートしたpandas_datareaderを使えるようにする。

```python
from pandas_datareader import data
#pandasはデーター解析を支援するライブラリー　データー集計、データー加工
#1次元のデーターを扱う：Series, 2次元のデーターを扱うDataFrame
import pandas as pd
# グラフを書くためのライブラリー
import matplotlib.pyplot as plt
import numpy as np
#jupyterlabで作成したグラフを表示
%matplotlib inline
```

#####日経平均データー取得, start 取得する日を代入

```python
start = '2019-06-01'
#取得する最後の日
end = '2020-06-01'
# data:pandas datereaderの省略、第一引数：取得したいティッカーシンボル、第二引数：データーソースの名前、第三引数:取得したい期間
df = data.DataReader('^N225', 'yahoo', start,end)
```

```python
# 上位10件表示
df.head(10)
````
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/2fce8e7f-35da-90ea-70a1-f1f39376a046.png)


```python
インデックスの中身を見ていきます。
df.index
```
DatetimeIndexとして表示されています。この形だと時系列データとしても扱え、matplptlirで可視化にも便利です。

```
DatetimeIndex(['2019-06-03', '2019-06-04', '2019-06-05', '2019-06-06',
               '2019-06-07', '2019-06-10', '2019-06-11', '2019-06-12',
               '2019-06-13', '2019-06-14',
               ...
               '2020-05-19', '2020-05-20', '2020-05-21', '2020-05-22',
               '2020-05-25', '2020-05-26', '2020-05-27', '2020-05-28',
               '2020-05-29', '2020-06-01'],
              dtype='datetime64[ns]', name='Date', length=242, freq=None)
```

このdf.indexをdate変数に代入。Adj Closeはpriceという変数に代入します。

```python
date=df.index
price=df['Adj Close']
```

これをmatplotlibで可視化してみます。

```python
# date=ｘ軸。ｙ軸
plt.plot(date,price)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/517f54bd-c7c9-dd44-edc7-4bfcab00b5ad.png)

#####グラフが小さいので大きくします。30：横, 10: 縦
```python
plt.figure(figsize=(30, 10))
#凡例を付けます。labelの名前をNikkei225とする
plt.plot(date, price, label='Nikkei225')
#ラベルを表示するにはlegendが必要になります。
plt.legend()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/322ebb47-7106-521c-f799-0c4882220cc3.png)

#####グラフにタイトルを付けます。
```python
plt.figure(figsize=(30, 10))
plt.plot(date, price, label='Nikkei225')
# グラフにタイトルを付けるplt.titleにする（第一：タイトル、第二：フォントカラー、第三：タイトル背景、第4：フォントサイズ、第五：タイトル位置
plt.title('N225', color='blue', backgroundcolor='white',size=40,loc='center')
plt.legend()
````

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/c1b39a67-1257-006c-49d1-8b2cffa7c204.png)

#####X軸とY軸の設定を行う。
```python
plt.figure(figsize=(30, 10))
plt.plot(date, price, label='Nikkei225')
plt.title('N225', color='blue', backgroundcolor='white',size=40,loc='center')
# ｘ軸、ｙ軸の設定行う、x軸第一：x軸名前、第二：フォントカラー、第三：フォントサイズ
plt.xlabel('date',color='black',size=30)
plt.ylabel('price', color='black',size=30)
plt.legend()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/51dd2e43-2851-acac-93fd-ff998b332939.png)


#####いつ買っていつ売るかを検証する-移動平均を今までのグラフに追加
移動平均:過去○○日分の平均

```python
# 移動平均の期間５日間、25日間、50日間の移動平均
span01=5
span02=25
span03=50
# 移動平均算出には、rollingメソッド使う。窓関数を適用できるサンプリングの間隔を指定できる
# データーフレームから一列取り出したprice,window:間隔、平均の意味mean使う。max() その区間の最大値　min()最小値
df['sma01']=price.rolling(window=span01).mean()
df['sma02']=price.rolling(window=span02).mean()
df['sma03']=price.rolling(window=span03).mean()
```

```python
pd.set_option('display.max_rows', None)
df.head(100)
````
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/16ef08cc-f811-c5eb-6cb9-ac181afda409.png)



###### 移動平均を今までのグラフに追加します。
```python
plt.figure(figsize=(30, 10))
plt.plot(date, price, label='Nikkei225')

plt.plot(date,df['sma01'],label='sma01')
plt.plot(date,df['sma02'],label='sma02')
plt.plot(date,df['sma03'],label='sma03')

plt.title('N225', color='blue', backgroundcolor='white',size=40,loc='center')
plt.xlabel('date',color='black',size=30)
plt.ylabel('price', color='black',size=30)
plt.legend()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/a9b7e4f7-eae6-bd49-7f55-d4d8a13f05f4.png)


https://colorhunt.co/pallette/184189 
色をRGBで指定することができます。上記サイト参考web

```python
plt.figure(figsize=(30, 10))
plt.plot(date, price, label='Nikkei225',color='#99b898')

plt.plot(date,df['sma01'],label='sma01',color='#e84a5f')
plt.plot(date,df['sma02'],label='sma02',color='#ff847c')
plt.plot(date,df['sma03'],label='sma03',color='#feceab')

plt.title('N225', color='blue', backgroundcolor='white',size=40,loc='center')
plt.xlabel('date',color='black',size=30)
plt.ylabel('price', color='black',size=30)
plt.legend()
```

いつ買っていつ売ればよかったか分析:
ゴールデンクロス：短期移動平均線が中期以上の移動平均線を下から上に抜ける。価格上昇サイン
デッドクロス分析：短期移動平均線が中期以上の移動平均線を上から下に抜けること。価格が下降するサイン



#####棒グラフを作ります。
出来高を示す為、棒グラフを作成。

```python
plt.figure(figsize=(30,15))
棒グラフの場合、barです。第一：date, 第二：dfの中のvolume, 第三：ラベル名、第４：色
plt.bar(date,df['Volume'],label='Volume', color='grey')
plt.legend()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/61726714-fb37-ec3e-b10a-5c084ac1aa87.png)



#####棒グラフと線グラフを２つ表示
```python
plt.figure(figsize=(30,15))
# サブプロット関数使用（縦方向を分割する数（今回は上下2つなので２、横方向一列で表示したいので一列、ｸﾞﾗフの配置）
plt.subplot(2,1,1)
# セングラフの記述
plt.plot(date, price, label='Nikkei225',color='#99b898')
plt.plot(date,df['sma01'],label='sma01',color='#e84a5f')
plt.plot(date,df['sma02'],label='sma02',color='#ff847c')
plt.plot(date,df['sma03'],label='sma03',color='#feceab')
plt.legend()
# 棒グラフ（第3　2は2番目に位置）
plt.subplot(2,1,2)
plt.bar(date,df['Volume'],label='Volume',color='grey')
plt.legend()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/fc88c532-d47f-949c-d883-5cf62c798676.png)



次に、個別銘柄の株価を取得します。例えば、リクルートの株価を取得する為には、東京証券取引所サイトへ行き、会社名入力。リクルートホールディングスの証券コード確認(6098)し、DataReaderにて取得する。

```python
# 第一：証券コード(6098)、第二：データーソース
df = data.DataReader('6098.JP','stooq')
````
df.head()　上位５つの情報を取得。

````
	Open	High	Low	Close	Volume
Date					
2021-04-22	5000.0	5071.0	4984.0	5071.0	2690900
2021-04-21	4920.0	4958.0	4857.0	4895.0	3147900
2021-04-20	4958.0	5015.0	4941.0	5008.0	3422000
2021-04-19	5110.0	5164.0	5028.0	5035.0	3307800
2021-04-16	5186.0	5210.0	5097.0	5114.0	3141400
````

```python
最安値を求めます。
df.index.min()
Timestamp('2016-04-26 00:00:00')
最高値を求めます。
df.index.max()
Timestamp('2021-04-22 00:00:00')
```

上記のdfでは、新しい順に並んでいるので、古い順に要素変えたい場合は,sort_valuesで変換、インデックスの場合はsort_index()で変換。

```python
# データフレームのインデックス並び替え
df = df.sort_index()

```
日付け古い順に変換されました。

```
	Open	High	Low	Close	Volume
Date					
2016-04-26	1147.75	1151.01	1116.68	1139.59	4209261
2016-04-27	1142.83	1142.83	1123.22	1133.04	3184163
2016-04-28	1142.83	1144.49	1113.41	1116.68	5341700
2016-05-02	1072.54	1093.80	1069.27	1090.51	5000103
2016-05-06	1082.34	1100.34	1080.72	1097.05	3611083
```

次に日にちを絞ったやり方は下記になります。2019年6月1日から2020年5月1日とします。

```python
df.index>='2019-06-01 00:00:00'
```

```python
上記をデータフレームの中に入れます。
df[df.index>='2019-06-01 00:00:00']
```
2019年6月1日以上の株価が取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/19fe2b94-3f8f-b839-4849-512bf68cb151.png)

2020年5月1日以下株価取得します。

```python
df[df.index<='2020-05-01 00:00:00']
```
2016年4月26日からの株価情報が取得出来ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/bcd6c8d2-8eaa-e821-9baa-5e95b0a22969.png)

以上から2019年6月1日から2020年5月1日までの株価を取得します。

```python
df[(df.index>='2019-06-01 00:00:00')&(df.index<='2020-05-01 00:00:00')]
```
2019年6月1日から2020年5月1日の株価が取得出来ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/ab641997-08fe-626b-7203-a445da9160e7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/db16d0b0-4957-9719-6f1d-60564446f241.png)

```python
#リクルートホールディングス株価を可視化してみる。
日付けを変数start, endに入れ、銘柄情報もcompany codeの変数に変換。それを下のコードに編入してみる。
#df[(df.index>=start)&(df.index<=end)]
#df = data.DataReader('6098.JP','stooq')

start = '2019-06-01'
end = '2020-05-01'
company_code = '6502.JP'

df[(df.index>=start)&(df.index<=end)]
df = data.DataReader('6098.JP','stooq')

date=df.index
price=df['Close']

span01=5
span02=25
span03=50

df['sma01']=price.rolling(window=span01).mean()
df['sma02']=price.rolling(window=span02).mean()
df['sma03']=price.rolling(window=span03).mean()

plt.figure(figsize=(30,15))
plt.subplot(2,1,1)

plt.plot(date, price, label='Close',color='#99b898')
plt.plot(date,df['sma01'],label='sma01',color='#e84a5f')
plt.plot(date,df['sma02'],label='sma02',color='#ff847c')
plt.plot(date,df['sma03'],label='sma03',color='#feceab')
plt.legend()

plt.subplot(2,1,2)
plt.bar(date,df['Volume'],label='Volume',color='grey')
plt.legend()
```

更にどの銘柄でもある一定期間の株価を確認し、比較できるように関数にすれば、簡単に株価を取得できる。

```python
#company_stock関数を作り、引数をstart, end, compnay_codeに設定。
def company_stock (start,end,company_code):
    df = data.DataReader(company_code, 'stooq')
    df = df[(df.index>=start)&(df.index<=end)]
    
    date = df.index
    price = df['Close']
    
    span01=5
    span02=25
    span03=50

    df['sma01']=price.rolling(window=span01).mean()
    df['sma02']=price.rolling(window=span02).mean()
    df['sma03']=price.rolling(window=span03).mean()

    plt.figure(figsize=(20,10))
    plt.subplot(2,1,1)

    plt.plot(date, price, label='Close',color='#99b898')
    plt.plot(date,df['sma01'],label='sma01',color='#e84a5f')
    plt.plot(date,df['sma02'],label='sma02',color='#ff847c')
    plt.plot(date,df['sma03'],label='sma03',color='#feceab')
    plt.legend()

    plt.subplot(2,1,2)
    plt.bar(date,df['Volume'],label='Volume',color='grey')
    plt.legend()
```

関数実行、呼び出すには関数名に引数を渡して実行します。

```python
company_stock('2017-06-01','2020-06-01','6502.JP')
```

以上、株価銘柄のデータ分析をトライしてみました。今度は、違った分析も取り入れ、チャレンジしたいと思います。