Pythonによる株式予測の移動平均とヒストグラムの求め方


# 株式予測の移動平均とヒストグラムの求め方
![graph_python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/bd12b6c5-9b99-935e-66e7-0add8016f99a.png)

金融ファイナンスを分析することがPythonの強みです。
時系列データを分析して株価予測も可能になります。

## 必要ライブラリをインポートする
```py:python
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
# 可視化ライブラリ
import matplotlib.pyplot as plt
import seaborn as sns# 罫線
sns.set_style('whitegrid')
#pickleファイルで必要なデータを一括保存
#pickleはPythonオブジェクトの直列化（シリアライズ）や非直列化（デシリアライズ）を扱うライブラリ
import pickle
# Pythonで日付と時刻を扱うモジュール
from datetime import datetime
```

## pklファイルより株価データを取得
```py
# 証券コード(GOOG(Google))と同じ変数名 | 2022年4月から23年の4月まで
with open('ファイル名.pkl', 'br') as f:
    GOOG = pickle.load(f)
```
## APIで取得する方法
J-Quants APIに登録
無料プランはデータ提供期間が過去2年分[12週間遅延]


リフレッシュトークンとIDトークンの取得と株価データ取得

リフレッシュトークンを取得するPythonコード
```py:python
# リフレッシュトークン取得
import requests
import json
import pandas as pd

# 登録したメールアドレス、パスワードを設定
# EMAIL_ADDRESSに登録メールアドレス、PASSWORDにパスワードを入力
mail_password={"mailaddress":"EMAIL_ADDRESS", "password":"PASSWORD"}

# リフレッシュトークン取得
r_ref = requests.post("https://api.jquants.com/v1/token/auth_user", data=json.dumps(mail_password))

# リフレッシュトークン取得の表示
print(r_ref.json())

# 受け取ったリフレッシュトークンを設定
RefreshToken = r_ref.json()["refreshToken"]

# IDトークン取得
r_token = requests.post(f"https://api.jquants.com/v1/token/auth_refresh?refreshtoken={RefreshToken}")

# IDトークン表示
print(r_token.json())

# 取得したIDトークンを設定
idToken = r_token.json()["idToken"]
headers = {'Authorization': 'Bearer {}'.format(idToken)}

# 銘柄コード、期間を指定
code_ = "8697" 
from_ = "2022-12-01"
to_ = "2023-02-28"

# 株価四本値の取得
re_daily_OHLCV = requests.get(f"https://api.jquants.com/v1/prices/daily_quotes?code={code_}&from={from_}&to={to_}", headers=headers)

# pandasデータフレームに変換
df_daily_OHLCV = pd.DataFrame(re_daily_OHLCV.json()["daily_quotes"])

# 'Date'をdatetime型へ変換
df_daily_OHLCV['Date'] = pd.to_datetime(df_daily_OHLCV['Date'])
```
参照：J-Quants API（無料プランあり）を使用した株価・財務データ取得（Python）
https://taimuoreganoblog.com/miscellaneous_notes/data-acquisition/stock_data_acquisition/

## describeで各列の要約統計量（平均、標準偏差など）取得
参照：note.nkmk.me：https://note.nkmk.me/python-pandas-describe/
```py
GOOG.describe()

#情報の出力
GOOG.info()

# 終値時系列をプロット
GOOG['adjClose'].plot(legend=True, figsize=(10, 4))
# 1日に取引が成立した株の数をプロット
GOOG['volume'].plot(legend=True, figsize=(10, 4))
```

### 　移動平均線（moving average）と呼ばれるグラフ
「移動平均とは、時系列データにおいて、ある一定区間ごとの平均値を区間をずらしながら求めたもの」
参照：統計WEB | https://bellcurve.jp/statistics/blog/15528.html


## 間隔ごとに移動平均を取得
pandasは金融情報が得意
```py
ma_day = [10, 20, 50]

for ma in ma_day:
    column_name = f"MA {ma}"
    GOOG[column_name] = GOOG['adjClose'].rolling(ma).mean()
    
GOOG[['adjClose','MA 10','MA 20','MA 50']].plot(figsize=(10, 4))
```

## pct_changeを使うと変化の割合を算出
```py
GOOG['daily'] = GOOG['adjClose'].pct_change()
```

## 日ごとの株式市場の変化率
```py
GOOG['daily'].plot(figsize=(16, 9),#HDサイズのグラフ(1920×1080)が作りたかったら、figsizeを(16, 9)、dpiを120
                          legend=True,
                          linestyle='--'#折れ線グラフをイメージ,
                          marker='v')# 35種類のマーカーが使用可能
```

## 前日パーセンテージのヒストグラム
```py
GOOG['daily'].hist(bins=100)

sns.histplot(GOOG['daily'],
             bins=100,
             kde=True,#カーネル密度推定グラフ / ガウス分布
             #実績データをサンプルとして、実績のない値の確率を導き出す手法
             color='purple')
```

![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/2a7830fa-f8e6-6cdb-624e-d6d7a2ebd7f0.png)