用語
テクニカル指標
-
移動平均
- 過去〇〇日分の平均
- ゴールデンクロス
- 「短期の移動平均線」が「中期以上の移動平均線」を下から上に抜けること
- 価格が上昇しているサイン
- デッドクロス
- 「短期の移動平均線」が「中期以上の移動平均線」を上から下に抜けること
- 価格が下降しているサイン
-
MACD
-
トレンドを見る指標
- 0以上なら上昇トレンド
- 0以下なら下降トレンド
-
トレンドを見る指標
-
RSI
-
売られ過ぎ・買われ過ぎを判断する指標
- 20〜30%を下回る・・・売られ過ぎ
- 「買い」と判断する
- 70〜80%を上回る・・・買われ過ぎ
- 「売り」と判断する
- 20〜30%を下回る・・・売られ過ぎ
-
売られ過ぎ・買われ過ぎを判断する指標
-
ボリンジャーバンド
- 売られ過ぎ・買われ過ぎを判断する指標
- 移動平均などの一定期間の平均に対して、一定期間の標準偏差を足したものと引いたものの2本のラインを引く
- 一般的にプラスマイナス「標準偏差の2倍」を使うことが多い
- 統計学の考え方から終値はこの2本の間に収まると考えられる
- 収まらなかった場合は、売られ過ぎ・買われ過ぎだと判断する
これらの指標を用いて分析をし、株の売買の意思決定が行われている。
株の他、Bitcoinや為替、FXにも活用可能。
これらのテクニカル指標の追加は、pandas_datareaderやTA-Libというライブラリを使用することで簡単に出来る。
前提
Dockerのインストールを済ませておく(目安:5分)
環境構築
TA-Libのインストールは環境によって上手くいかない or インストール出来るとしても手順として複雑になるケースがある為、Dockerを使い環境構築を行う。
1. 任意のフォルダを作成
今回はDocuments/Python/data_analysis
2. Dockerfileを作成し、フォルダに格納
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 ~/Documents/Python/data_analysis/
(base) sample@SampleMBP data_analysis % ls
Dockerfile
(base) sample@SampleMBP data_analysis % docker build -t da:latest /Users/sample/Documents/Python/data_analysis
コマンド実行後、完了まで20分以上要する
4. イメージIDを確認
$ docker images
実行結果例
REPOSITORY TAG IMAGE ID CREATED SIZE
da latest 87dc656c5b2f 2 minutes 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/Documents/Python/data_analysis:/workspace --name da 87dc656c5b2f
コマンド実行後にブラウザで下記URLにアクセスし、JupyterLabが起動したら環境構築完了🎉
(例)http://127.0.0.1:8888/
ローカルと同期されている為、workspaceディレクトリに移動すればDockerfileが存在することを確認できる
workspaceディレクトリ配下に任意の実行ファイルを作成する
テクニカル指標を表示させる関数を作成
1. ライブラリのインポート
import pandas as pd
import talib as ta
# ファイナンスに特化した可視化ライブラリ
import mplfinance as mpf
# 日経平均やNASDAQ、個別銘柄の株価データを取得できるライブラリ
from pandas_datareader import data
# matplotlibのpyplotモジュールを使用
import matplotlib.pyplot as plt
# JupyterLab上で作成したグラフを表示
%matplotlib inline
import warnings
# すべての警告を表示させない
warnings.simplefilter('ignore')
2. 共通処理を関数として定義
def data_analysis(df):
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, 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()
日経平均株価のデータ可視化
start_date = '2021-01-01'
end_date = '2022-10-15'
df = data.DataReader('^N225', 'yahoo', start_date, end_date)
data_analysis(df)
補足
df.head(10)
用語 | 意味 |
---|---|
High | 高値 |
Low | 安値 |
Open | 始値 |
Close | 終値 |
Volume | 出来高(株取引された量) |
Adj Close | 調整後の終値 |
ビットコインのデータ可視化
start_date = '2022-01-01'
end_date = '2022-10-15'
df = data.DataReader('BTC-JPY', 'yahoo', start_date, end_date)
data_analysis(df)
ボリンジャーバンド
為替のデータ可視化
為替の場合は出来高が無いため、関数を微修正
def data_analysis(df):
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, 60))
# 移動平均
plt.subplot(4,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')
# MACD
plt.subplot(4,1,2)
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(4,1,3)
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(4,1,4)
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()
start_date = '2022-01-01'
end_date = '2022-10-15'
# 日本円とUSドル
df = data.DataReader('DEXJPUS', 'fred', start_date, end_date)
# df.head()
# カラム名を変更
df = df.rename(columns={'DEXJPUS':'Adj Close'})
# 欠損値Nanを削除(FX市場が閉じている日はNanで表示されている為)
df = df.dropna()
data_analysis(df)
すべてのテクニカル指標をまとめて表示する場合
関数を定義
def all_technical_analysis(df):
# 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')
日経平均株価データの可視化
start_date = '2022-01-01'
end_date = '2022-10-15'
# 日経平均株価を取得
df = data.DataReader('^N225', 'yahoo', start_date, end_date)
all_technical_analysis(df)