LoginSignup
5
8

More than 1 year has passed since last update.

【データ可視化】株・ビットコイン・為替

Last updated at Posted at 2022-10-17

用語

テクニカル指標

  • 移動平均
    • 過去〇〇日分の平均
    • ゴールデンクロス
      • 「短期の移動平均線」が「中期以上の移動平均線」を下から上に抜けること
      • 価格が上昇しているサイン
    • デッドクロス
      • 「短期の移動平均線」が「中期以上の移動平均線」を上から下に抜けること
      • 価格が下降しているサイン
  • MACD
    • トレンドを見る指標
      • 0以上なら上昇トレンド
      • 0以下なら下降トレンド
  • RSI
    • 売られ過ぎ・買われ過ぎを判断する指標
      • 20〜30%を下回る・・・売られ過ぎ
        • 「買い」と判断する
      • 70〜80%を上回る・・・買われ過ぎ
        • 「売り」と判断する
  • ボリンジャーバンド
    • 売られ過ぎ・買われ過ぎを判断する指標
    • 移動平均などの一定期間の平均に対して、一定期間の標準偏差を足したものと引いたものの2本のラインを引く
      • 一般的にプラスマイナス「標準偏差の2倍」を使うことが多い
      • 統計学の考え方から終値はこの2本の間に収まると考えられる
      • 収まらなかった場合は、売られ過ぎ・買われ過ぎだと判断する

これらの指標を用いて分析をし、株の売買の意思決定が行われている。
の他、Bitcoin為替FXにも活用可能。

これらのテクニカル指標の追加は、pandas_datareaderTA-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/

スクリーンショット 2022-10-15 16.49.54.png


ローカルと同期されている為、workspaceディレクトリに移動すればDockerfileが存在することを確認できる

スクリーンショット 2022-10-15 16.53.58.png

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)

移動平均
スクリーンショット 2022-10-16 16.03.24.png

出来高(取引量)
スクリーンショット 2022-10-16 16.03.33.png

MACD
スクリーンショット 2022-10-16 16.03.46.png

RSI
スクリーンショット 2022-10-16 16.03.57.png

ボリンジャーバンド
スクリーンショット 2022-10-16 16.04.08.png

補足

df.head(10)

スクリーンショット 2022-10-16 16.07.19.png

用語 意味
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)

移動平均
スクリーンショット 2022-10-16 15.50.13.png

出来高(取引量)
スクリーンショット 2022-10-16 15.50.59.png

MACD
スクリーンショット 2022-10-16 15.51.17.png

RSI
スクリーンショット 2022-10-16 15.51.36.png

ボリンジャーバンド

スクリーンショット 2022-10-16 15.51.51.png

為替のデータ可視化

為替の場合は出来高が無いため、関数を微修正

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)

移動平均
スクリーンショット 2022-10-16 15.54.40.png

MACD
スクリーンショット 2022-10-16 15.54.53.png

RSI
スクリーンショット 2022-10-16 15.55.04.png

ボリンジャーバンド
スクリーンショット 2022-10-16 15.55.13.png

すべてのテクニカル指標をまとめて表示する場合

関数を定義

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)

スクリーンショット 2022-10-16 18.21.48.png

関連

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8