Todo
株価を取得し、分析用データとしてグラフで表示する
- 日経平均株価をライブラリでダウンロード
- 単純移動平均を計算
- 移動平均・出来高(株取引量)をグラフ化
- 個別銘柄のデータ取得
用語
-
ライブラリ
- 幾つかのパッケージをまとめたもの
-
パッケージ
- 複数のモジュールをまとめたもの
-
モジュール
- 関数やクラスなどをひとつのPythonファイルにまとめたもの
- Python のファイル=「.py」ファイルのこと
Pythonで開発する上で使用される代表的なライブラリ
-
pandas(パンダス)
- データ解析を支援する機能を提供するライブラリ
- 一次元のデータを扱う時:Series
- 二次元のデータを扱う時:DataFrame
- numpy(ナムパイ)
- matplotlib(マット•プロット•リブ)
前提
JupyterLabをインストールしておく(目安:5分)
1. JupyterLabを起動
$ jupyter lab
2. ライブラリのインストール
pandas_datareaderをインストール
!pip install pandas_datareader
pandas_datareader
を使用すると、日経平均やナスダック、日本の個別銘柄のデータを取得できる
import
# 日経平均やNASDAQ、個別銘柄の株価データを取得できるライブラリ
from pandas_datareader import data
import pandas as pd
# matplotlibのpyplotモジュールを使用
import matplotlib.pyplot as plt
# JupyterLab上で作成したグラフを表示
%matplotlib inline
import warnings
# すべての警告を表示させない
warnings.simplefilter('ignore')
3. 日経平均のデータを取得し線グラフとして可視化
start = '2021-10-01'
end = '2022-10-01'
# data.DataReader('取得したいティッカーシンボル', 'データソースの名前', '取得したい期間の開始日付', '終了日付')
df = data.DataReader('^N225', 'yahoo', start, end)
最初の10件を表示
df.head(10)
-
High
:高値 -
Low
:安値 -
Open
:始値 -
Close
:終値 -
Volume
:出来高(株取引された量) ←「出来高は株価に先行する」とも言われている -
Adj Close
:調整後の終値 ←分析に使用
indexの中身を確認
- DatetimeIndex
- 時系列データとして扱うことができる
- matplotlibでの可視化の際にも便利
matplotlibで可視化
date = df.index
price = df['Adj Close']
# figsize = (表示する横のサイズ, 縦のサイズ)
plt.figure(figsize=(30, 10))
# plot(X軸, Y軸, label='凡例名')
plt.plot(date, price, label='Adj Close')
# グラフのタイトル
plt.title('N225', color='blue', backgroundcolor='white', size=35, loc='center')
# X軸とY軸の名前
plt.xlabel('Date', color='black', size=30)
plt.ylabel('Price', color='black', size=30)
# 凡例を表示させる
plt.legend()
4. 単純移動平均を線グラフで可視化
- 移動平均・・・過去〇〇日分の平均
- pandasのrollingメソッドを用いる
- meanメソッドで平均を算出
- meanではなくmaxにするとその区間の最大値、minにすればその区間の最小値を取得できる
# 過去5日、25日、50日の移動平均を算出する為に定義
span01 = 5
span02 = 25
span03 = 50
# 移動平均を算出
# smaは単純移動平均の略称
df['sma01'] = price.rolling(window=span01).mean()
df['sma02'] = price.rolling(window=span02).mean()
df['sma03'] = price.rolling(window=span03).mean()
最初の100件を表示
# 行を省略して表示させないようにする
pd.set_option('display.max_rows', None)
df.head(100)
sma01は過去5日間の平均なので4日目までNaNと表示されているのはOK。
同様にsma02は過去25日間の平均、sma03は過去50日の平均。
移動平均を線グラフで表示
plt.figure(figsize=(30, 10))
plt.plot(date, price, label='Adj 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.title('N225', color='white', backgroundcolor='grey', size=35, loc='center')
plt.xlabel('Date', color='black', size=30)
plt.ylabel('Price', color='black', size=30)
plt.legend()
いつ売り、いつ買えばよかったかを検討する(データ分析)
株や為替において使われる分析方法
-
ゴールデンクロス
- 「短期の移動平均線」が「中期以上の移動平均線」を下から上に抜けること
- 価格が上昇しているサイン
- 「短期の移動平均線」が「中期以上の移動平均線」を下から上に抜けること
-
デッドクロス
- 「短期の移動平均線」が「中期以上の移動平均線」を上から下に抜けること
- 価格が下降しているサイン
- 「短期の移動平均線」が「中期以上の移動平均線」を上から下に抜けること
今回作成した表のsma01とsma03の交差している箇所を見ると分かりやすい
5. 出来高を棒グラフで表示
株式相場の世界には「出来高は株価に先行する」という格言がある
plt.figure(figsize=(30, 15))
# グラフ領域を二分割する
# plt.subplot(縦方向を分割する数, 横方向に分割する数, グラフを配置する位置を示すindex)
plt.subplot(2,1,1)
# 線グラフ(単純移動平均)
plt.plot(date, price, label='Adj 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='gray')
plt.legend()
おさらい
日本企業の個別銘柄の株のデータ取得
例
- 銘柄名 (会社名)で検索
- 今回は
ANAホールディングス
- 検索結果の証券
コード
を使ってデータ取得を行う
- 今回は
以下、JupyterLabでセルを順に実行
1. pandas_datareaderをインストール
!pip install pandas_datareader
2. import
# 日経平均やNASDAQ、個別銘柄の株価データを取得できるライブラリ
from pandas_datareader import data
import pandas as pd
# matplotlibのpyplotモジュールを使用
import matplotlib.pyplot as plt
# JupyterLab上で作成したグラフを表示
%matplotlib inline
import warnings
# すべての警告を表示させない
warnings.simplefilter('ignore')
3. 共通処理を関数化
def company_stock(start_date, end_date, company_code):
# data.DataReader('証券コード', 'データソース')
df = data.DataReader(company_code, 'stooq')
# 日付を絞る
df = df[(df.index>=start_date) & (df.index<=end_date)]
date = df.index
price = df['Close']
# 過去5日、25日、50日の移動平均を算出する為に定義
span01 = 5
span02 = 25
span03 = 50
# 移動平均を算出
# smaは単純移動平均の略称
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(縦方向を分割する数,横方向に分割する数,グラフを配置する位置を示すindex)
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='gray')
plt.legend()
4. 実行
start_date = '2022-01-01'
end_date = '2022-10-01'
# ANAホールディングス
company_code = '9202.jp'
company_stock(start_date, end_date, company_code)
調べたい期間や証券コードが変わっても引数の値を変えるだけで表示可能に
NEXT