Todo
株価の分析をより高度なものにする為、テクニカル指標を追加しグラフで表示する
移動平均
MACD
RSI
ボリンジャーバンド
ローソク足
これらのテクニカル指標の追加は、Pythonだとpandas_datareaderやTA-Libというライブラリを使用することで簡単に出来る。
TA-Libのインストールは環境によって上手くいかないケースがあるためDockerを使い環境構築を行う。
用語
テクニカル指標
-
移動平均
- 過去〇〇日分の平均
- ゴールデンクロス
- 「短期の移動平均線」が「中期以上の移動平均線」を下から上に抜けること
- 価格が上昇しているサイン
- デッドクロス
- 「短期の移動平均線」が「中期以上の移動平均線」を上から下に抜けること
- 価格が下降しているサイン
-
MACD
-
トレンドを見る指標
- 0以上なら上昇トレンド
- 0以下なら下降トレンド
-
トレンドを見る指標
-
RSI
-
売られ過ぎ・買われ過ぎを判断する指標
- 20〜30%を下回る・・・売られ過ぎ
- 70〜80%を上回る・・・買われ過ぎ
-
売られ過ぎ・買われ過ぎを判断する指標
-
ボリンジャーバンド
- 売られ過ぎ・買われ過ぎを判断する指標
- 移動平均などの一定期間の平均に対して、一定期間の標準偏差を足したものと引いたものの2本のラインを引く
- 一般的にプラスマイナス「標準偏差の2倍」を使うことが多い
- 統計学の考え方から終値はこの2本の間に収まると考えられる
- 収まらなかった場合は、売られ過ぎ・買われ過ぎだと判断する
-
ローソク足
-
取引時間中の株価の値動き(始値、終値、高値、安値など)を1本のローソクの形で表現したもの
- 数字の羅列で変化し続ける為替レートを視覚的に、かつ過去のデータも含めて一目で値動きの推移を把握できるのがローソク足の特徴
-
取引時間中の株価の値動き(始値、終値、高値、安値など)を1本のローソクの形で表現したもの
これらの指標を用いて分析をし、株の売買の意思決定が行われている。
株の他、Bitcoinや為替、FXにも活用可能。
前提
Dockerのインストールを済ませておく(目安:5分)
環境構築
先にも述べたように、TA-Libのインストールは環境によって上手くいかない or インストール出来るとしても手順として複雑になるケースがある為、Dockerを使い環境構築を行う
1. 任意のフォルダを作成
今回はDesktop上にdata_analysis
フォルダを新規作成
2. Dockerfileを作成し、フォルダに格納
FROM --platform=linux/amd64 ubuntu:20.04
RUN apt-get update && apt-get install -y sudo wget vim curl gawk make gcc
RUN wget https://repo.continuum.io/archive/Anaconda3-2019.03-Linux-x86_64.sh && \
sh Anaconda3-2019.03-Linux-x86_64.sh -b && \
rm -f Anaconda3-2019.03-Linux-x86_64.sh && \
sudo curl -sL https://deb.nodesource.com/setup_10.x | sudo bash - && \
sudo apt-get install -y nodejs
ENV PATH $PATH:/root/anaconda3/bin
RUN pip install --upgrade pip
RUN pip install pandas_datareader
RUN pip install mplfinance
RUN wget --quiet http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz -O ta-lib-0.4.0-src.tar.gz && \
tar xvf ta-lib-0.4.0-src.tar.gz && \
cd ta-lib/ && \
./configure --prefix=/usr && \
make && \
sudo make install && \
cd .. && \
pip install TA-Lib && \
rm -R ta-lib ta-lib-0.4.0-src.tar.gz
RUN mkdir /workspace
CMD ["jupyter-lab", "--ip=0.0.0.0","--port=8888" ,"--no-browser", "--allow-root", "--LabApp.token=''"]
3. ビルド
$ docker build -t 任意のタグ名:latest フォルダまでのパス
パスはファイルを直接ドラックアンドドロップすれば入力される
(base) sample@SampleMBP ~ % cd Desktop/data_analysis/
(base) sample@SampleMBP data_analysis % ls
Dockerfile
(base) sample@SampleMBP data_analysis % docker build -t da:latest /Users/sample/Desktop/data_analysis
コマンド実行後、完了まで20分以上要する
4. イメージIDを確認
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
da latest cdf22f203d75 a minute ago 3.86GB
5. JupyterLabを起動
$ docker run -p ローカルの任意のポート番号:8888 -v フォルダまでのパス:/workspace –-name ビルド時のタグ名 イメージID
(base) sample@SampleMBP data_analysis % docker run -p 8888:8888 -v /Users/sample/Desktop/data_analysis:/workspace --name da cdf22f203d75
コマンド実行後にブラウザで下記URLにアクセスし、JupyterLabが起動したら環境構築完了🎉
(例)http://127.0.0.1:8888/
ローカルと同期されている為、workspaceディレクトリに移動すればDockerfileが存在することを確認できる
workspaceディレクトリ配下に任意の実行ファイルを作成し作業を行う
単純移動平均をグラフで可視化する
1. ライブラリをimport
import pandas as pd
import talib as ta
# 日経平均やNASDAQ、個別銘柄の株価データを取得できるライブラリ
from pandas_datareader import data
# matplotlibのpyplotモジュールを使用
import matplotlib.pyplot as plt
# JupyterLab上で作成したグラフを表示
%matplotlib inline
import warnings
# すべての警告を表示させない
warnings.simplefilter('ignore')
2. 移動平均と出来高をグラフで可視化
- 下記実行
start_date = '2021-10-01'
end_date = '2022-10-01'
# data.DataReader('取得したいティッカーシンボル', 'データソースの名前', '取得したい期間の開始日付', '終了日付')
df = data.DataReader('^N225', 'yahoo', start_date, end_date)
date = df.index
close = df['Adj Close']
# 過去5日、25日、50日の移動平均を算出する為に定義
span01 = 5
span02 = 25
span03 = 50
# 移動平均を算出
# smaは単純移動平均の略称
df['sma01'] = close.rolling(window=span01).mean()
df['sma02'] = close.rolling(window=span02).mean()
df['sma03'] = close.rolling(window=span03).mean()
plt.figure(figsize=(30, 15))
# グラフ領域を二分割する
# plt.subplot(縦方向を分割する数, 横方向に分割する数, グラフを配置する位置を示すindex)
plt.subplot(2,1,1)
# 線グラフ(単純移動平均)
plt.plot(date, close, 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()
MACDの指標を追加
MACD
:トレンドを見る指標
- 0以上なら上昇トレンド
- 0以下なら下降トレンド
1. MACDの計算
# ta.MACD(終値, 短期移動平均, 長期移動平均, MACDシグナル)
df['macd'], df['macdsignal'], df['macdhist'] = ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
一般的に短期移動平均は12
、長期移動平均は26
、 MACDシグナルは9
を設定することが多い
2. データが出来ていることを確認
df.tail()
3. MACDをグラフ化
-
塗りつぶし折れ線グラフを用いる
- ヒストグラムよりも分かりやすい
plt.figure(figsize=(30, 15))
# グラフ領域を二分割する
# plt.subplot(縦方向を分割する数, 横方向に分割する数, グラフを配置する位置を示すindex)
plt.subplot(2,1,1)
# 線グラフ(調整後の終値)
plt.plot(date, close, label='Adj Close', color='#99b898')
plt.legend()
plt.subplot(2,1,2)
# 塗りつぶし折れ線グラフ(MACD)
# plt.fill_between(x軸, y軸, 色, 塗りつぶしの透過, ラベル)
plt.fill_between(date, df['macdhist'], color='gray', alpha=0.5, label='MACD_hist')
# y = 0に水平線を描画
# plt.hlines(y軸, 開始するx軸, 終了するx軸, 色, 線の種類)
plt.hlines(0, start_date, end_date, 'gray', linestyles='dashed')
plt.legend()
0を基準にトレンドが簡単にわかる
RSI
RSI
:売られ過ぎ・買われ過ぎを判断する指標
- 20〜30%を下回る・・・売られ過ぎ
- 逆張りの「買い」と判断する
- 70〜80%を上回る・・・買われ過ぎ
- 逆張りの「売り」と判断する
1. 25日
のRSIを計算
# df['RSI'] = ta.RSI(終値, RSIを作成する期間)
df['RSI'] = ta.RSI(close, timeperiod=span02)
2. データが出来ていることを確認
df.tail()
3. RSIをグラフ化
plt.figure(figsize=(30, 15))
# グラフ領域を二分割する
# plt.subplot(縦方向を分割する数, 横方向に分割する数, グラフを配置する位置を示すindex)
plt.subplot(2,1,1)
# 単純移動平均
plt.plot(date, close, 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()
# RSI
plt.subplot(2,1,2)
plt.plot(date, df['RSI'], label='RSI', color='gray')
# y軸の範囲を設定
plt.ylim(0, 100)
# 30%、50%、70%の場所に転線を引く
plt.hlines([30, 50, 70], start_date, end_date, 'gray', linestyles='dashed')
plt.legend()
RSIの可視化に成功
ボリンジャーバンド
ボリンジャーバンド
:売られ過ぎ・買われ過ぎを判断する指標
- 移動平均などの一定期間の平均に対して、一定期間の標準偏差を足したものと引いたものの2本のラインを引く
- 一般的にプラスマイナス「標準偏差の2倍」を使うことが多い
- 統計学の考え方から終値はこの2本の間に収まると考えられる
- 収まらなかった場合は、売られ過ぎ・買われ過ぎだと判断する
1. ボリンジャーバンドの計算
# matype: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3 (デフォルト=SMA)
# 上のボリンジャーバンド, 移動平均, 下のボリンジャーバンド = ta.BBANDS(調整済み終値, 日経平均日数, 上のラインの標準偏差, 下のラインの標準偏差, 移動平均の計算方法)インの標準偏差, ○○移動平均)
df['upper'], df['middle'], df['lower'] = ta.BBANDS(close, timeperiod=span02, nbdevup=2, nbdevdn=2, matype=0)
-
matype
-
0
・・・単純移動平均 -
1
・・・指数移動平均 -
2
・・・加重移動平均
-
2. データが出来ていることを確認
df.tail()
3. ボリンジャーバンドをグラフ化
plt.figure(figsize=(30, 15))
plt.plot(date, close, label='Adj Close', color='#99b898')
# plt.fill_between(x軸, 塗りつぶし上側, 塗りつぶし下側, 色, 透過)
plt.fill_between(date, df['upper'], df['lower'], color='gray', alpha=0.3)
plt.legend()
ボリンジャーバンドの可視化に成功
5つのグラフを同時に表示
plt.figure(figsize=(30, 15))
# 移動平均
plt.subplot(5,1,1)
plt.plot(date, close, 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.subplot(5,1,2)
plt.bar(date, df['Volume'], label='Volume', color='gray')
plt.legend()
# MACD
plt.subplot(5,1,3)
plt.fill_between(date, df['macdhist'], color='gray', alpha=0.5, label='MACD_hist')
plt.hlines(0, start_date, end_date, 'gray', linestyles='dashed')
plt.legend()
# RSI
plt.subplot(5,1,4)
plt.plot(date, df['RSI'], label='RSI', color='gray')
plt.ylim(0, 100)
plt.hlines([30, 50, 70], start_date, end_date, 'gray', linestyles='dashed')
plt.legend()
# ボリンジャーバンド
plt.subplot(5,1,5)
plt.plot(date, close, label='Adj Close', color='#99b898')
plt.fill_between(date, df['upper'], df['lower'], color='gray', alpha=0.3)
plt.legend()
同時に5つのグラフ表示成功
ここまでのコードまとめ
import pandas as pd
import talib as ta
import mplfinance as mpf
from pandas_datareader import data
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.simplefilter('ignore')
start_date = '2021-10-01'
end_date = '2022-10-01'
df = data.DataReader('^N225', 'yahoo', start_date, end_date)
date = df.index
close = df['Adj Close']
span01 = 5
span02 = 25
span03 = 50
# 移動平均を算出。smaは単純移動平均の略称
df['sma01'] = close.rolling(window=span01).mean()
df['sma02'] = close.rolling(window=span02).mean()
df['sma03'] = close.rolling(window=span03).mean()
plt.figure(figsize=(30, 60))
# 移動平均
plt.subplot(5,1,1)
plt.plot(date, close, 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.subplot(5,1,2)
plt.bar(date, df['Volume'], label='Volume', color='gray')
plt.legend()
# MACD
plt.subplot(5,1,3)
df['macd'], df['macdsignal'], df['macdhist'] = ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
plt.fill_between(date, df['macdhist'], color='gray', alpha=0.5, label='MACD_hist')
plt.hlines(0, start_date, end_date, 'gray', linestyles='dashed')
plt.legend()
# RSI
plt.subplot(5,1,4)
df['RSI'] = ta.RSI(close, timeperiod=span02)
plt.plot(date, df['RSI'], label='RSI', color='gray')
plt.ylim(0, 100)
plt.hlines([30, 50, 70], start_date, end_date, 'gray', linestyles='dashed')
plt.legend()
# ボリンジャーバンド
plt.subplot(5,1,5)
df['upper'], df['middle'], df['lower'] = ta.BBANDS(close, timeperiod=span02, nbdevup=2, nbdevdn=2, matype=0)
plt.plot(date, close, label='Adj Close', color='#99b898')
plt.fill_between(date, df['upper'], df['lower'], color='gray', alpha=0.3)
plt.legend()
ローソク足
ローソク足
:取引時間中の株価の値動き(始値、終値、高値、安値など)を1本のローソクの形で表現したもの
-
mplfinance
- ファイナンスに特化した可視化ライブラリ
1. ローソク足を表示
# mplfinanceをインポート
import mplfinance as mpf
start_date = '2021-10-01'
end_date = '2022-10-01'
# 日経平均株価を取得
df = data.DataReader('^N225', 'yahoo', start_date, end_date)
date = df.index
close = df['Adj Close']
span02 = 25
# ボリンジャーバンド
df['upper'], df['middle'], df['lower'] = ta.BBANDS(close, timeperiod=span02, nbdevup=2, nbdevdn=2, matype=0)
# ローソク足用のデータフレームを作成
df_candle = df[['High', 'Low', 'Open', 'Close', 'Volume']]
# ローソク足のグラフを作成
# df_candle[100:200]のように記述し、データを絞ることも可能
mpf.plot(df_candle, type='candle', style='yahoo', figsize=(30, 15))
すべてのテクニカル指標をまとめて表示する場合
start_date = '2022-04-01'
end_date = '2022-10-15'
# 日経平均株価を取得
df = data.DataReader('^N225', 'yahoo', start_date, end_date)
# MACD
# ta.MACD(終値, 短期移動平均, 長期移動平均, MACDシグナル)
df['macd'], df['macdsignal'], df['macdhist'] = ta.MACD(df['Adj Close'], fastperiod=12, slowperiod=26, signalperiod=9)
# ボリンジャーバンド
# matype: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3 (デフォルト=SMA)
# 上のボリンジャーバンド, 移動平均, 下のボリンジャーバンド = ta.BBANDS(調整済み終値, 日経平均日数, 上のラインの標準偏差, 下のラインの標準偏差, 移動平均の計算方法)
df['upper'], df['middle'], df['lower'] = ta.BBANDS(df['Adj Close'], timeperiod=25, nbdevup=2, nbdevdn=2, matype=0)
# RSI
df['RSI'] = ta.RSI(df['Adj Close'], timeperiod=25)
# グラフに追加したい項目を代入
apds = [
mpf.make_addplot(df['upper'], color='g'),
mpf.make_addplot(df['middle'], color='b'),
mpf.make_addplot(df['lower'], color='r'),
mpf.make_addplot(df['macdhist'], type='bar', color='gray', width=1.0, panel=1, alpha=0.5, ylabel='MACD'),
mpf.make_addplot(df['RSI'], type='line', panel=2, alpha=0.5, ylabel='RSI')
]
mpf.plot(df, type='candle', figsize=(30, 10), style='yahoo', volume=True, addplot=apds, volume_panel=3, panel_ratios=(5,2,2,1))
# 画像として保存する場合は以下に変更
# mpf.plot(df, type='candle', figsize=(30, 10), style='yahoo', volume=True, addplot=apds, volume_panel=3, panel_ratios=(5,2,2,1), savefig='株価テクニカル分析.png')