MENU

【Python】株価のチャート分析入門

当ページには広告が含まれています。

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ!
  • Pythonを用いた株式投資のチャート分析に興味がある
目次

本記事の目的

本記事を読了いただくことで次のようなことができるようになります。

  • ある銘柄の株価データを一括取得
  • 株価データのチャート分析

【Python実践】銘柄別の株価チャート分析

それでは実際に株価のチャート分析を実現するコードを記載していきます。

コード作成

まず、以下のコードを実行しましょう。

import requests
import pandas as pd
import numpy  as np
from bs4            import BeautifulSoup
from urllib.request import urlopen
from datetime       import datetime
import plotly.graph_objects as go
  
# ================================================
# Data Cleaner
# ================================================
def clean_text_numeric(text):
    try:
        text = text.replace(",","").replace("+","")
        text = float(text)
    except:
        text = float('nan')
    return text

def clean_text_date(text):
    try:
        text = datetime.strptime(text, "%y/%m/%d")
    except:
        pass
    return text

# ================================================
# 移動平均・ボリンジャーバンドの計算
# ================================================

def calculate_index(df):
    # 昇順に変更
    df.sort_index(ascending=False, inplace = True)
    df.reset_index(drop=True, inplace=True)
    # 移動平均線の計算
    ma_day = [5,25,50,75]
    for ma in ma_day:
        column_name = "MA_{}".format(ma)
        df[column_name] = df["終値"].rolling(window=ma).mean()
    
    # ボリンジャーバンド(-2σ), 期間(term):25日の計算
    term            = 25
    sigma           = 2
    mean_in_term    = df["終値"].rolling(window=term, min_periods=term).mean()  # 25日移動平均線
    std_in_term     = df["終値"].rolling(window=term, min_periods=term).std()   # 25日の標準偏差
    sigmam2_pos     = mean_in_term + std_in_term * sigma                       # +2sigma
    sigmam2_neg     = mean_in_term + std_in_term * sigma * (-1)                # -2sigma
    df["+2sigma"] = sigmam2_pos
    df["-2sigma"] = sigmam2_neg
    
    # -2σボリンジャーバンド乖離率
    # 乖離率=((当日の終値-移動平均値)÷移動平均値)×100
    sigma_deviation_rate = ((df["終値"] - df["-2sigma"]) / df["-2sigma"]) * 100
    df["乖離率[%]"] = sigma_deviation_rate
    
    return df

# ================================================
# Table要素取得
# ================================================

def get_data_to_dict(row):
    try:
        date         = clean_text_date(row.find("time").getText())
        columns      = row.find_all("td")
        open_val     = clean_text_numeric(columns[0].getText())
        high_val     = clean_text_numeric(columns[1].getText())
        low_val      = clean_text_numeric(columns[2].getText())
        close_val    = clean_text_numeric(columns[3].getText())
        zenzitu      = clean_text_numeric(columns[4].getText())
        zenzitu_rate = clean_text_numeric(columns[5].getText())
        volume       = clean_text_numeric(columns[6].getText())
        return {"日付":date,"始値":open_val,"高値":high_val,"低値":low_val,"終値":close_val,"前日比":zenzitu,"前日比[%]":zenzitu_rate,"出来高[株]":volume}
    except:
        pass
        
# ================================================
# 株価取得
# ================================================

def Stock(code,pages):
    data  = []
    try:
        for page in range(int(pages)):
            # ウェブ要素取得
            html  = urlopen(f"https://kabutan.jp/stock/kabuka?code={code}&ashi=day&page={page+1}")
            bsobj = BeautifulSoup(html, "html.parser")
        
            # 最新断面
            if page == 0:
                table_new     = bsobj.find("div", {"id":"stock_kabuka_table"}).find("table", {"class":"stock_kabuka0"})
                rows          = table_new.find_all("tr")
                for row in rows:
                    row_data = get_data_to_dict(row)
                    if row_data != None:
                        data.append(row_data)
                    
            # ヒストリカル
            table_hist     = bsobj.find("div", {"id":"stock_kabuka_table"}).find("table", {"class":"stock_kabuka_dwm"})
            data_dict_hist = get_data_to_dict(table_hist.find_all("tr"))
            rows           = table_hist.find_all("tr")
            for row in rows:
                row_data = get_data_to_dict(row)
                if row_data != None:
                    data.append(row_data)
    except:
        print("page not found")
        
    df   = pd.DataFrame(data)
    df   = calculate_index(df)
    df["銘柄コード"] = str(code)
        
    return df

# ================================================
# グラフ描画
# ================================================
def plotly_graph(df, X,Y):
    # グラフ描画
    fig = go.Figure()
    for i in range(len(Y)):
        fig.add_trace(go.Scatter(x=df[X], y=df[Y[i]], mode='lines', name=Y[i]))
    
    # レイアウト
    line_style = dict(width=2)
    marker_style = dict(size=8, symbol='circle')
    fig.update_layout(
        title=f"{df['銘柄コード'][0]}の株価推移",
        xaxis_title="日付",
        yaxis_title="価格[円]",
        xaxis=dict(type="date"),
        template="plotly_white"
    )
    
    # 表示
    fig.show()

コード利用|データの取得

上記コードを用いてある銘柄の株価を取得したい場合、以下のコードを実行します。

# =======================================
# 実行
# =======================================
# code: 銘柄コードを指定
# pages:取得したいデータ範囲

df = Stock(code=6745,pages=4)
df.head(30)

# =======================================
# 出力イメージ
# =======================================

# 	日付	始値	高値	低値	終値	前日比	前日比[%]	出来高[株]	MA_5	MA_25	MA_50	MA_75	+2sigma	-2sigma	乖離率[%]	銘柄コード
# 0	2024-02-09	2122.0	2157.0	2103.0	2152.0	NaN	NaN	51100.0	NaN	NaN	NaN	NaN	NaN	NaN	NaN	6745
# 1	2024-02-13	2180.0	2209.0	2160.0	2197.0	45.0	2.1	39500.0	NaN	NaN	NaN	NaN	NaN	NaN	NaN	6745
# 2	2024-02-14	2166.0	2218.0	2161.0	2214.0	17.0	0.8	45800.0	NaN	NaN	NaN	NaN	NaN	NaN	NaN	6745
# 3	2024-02-15	2222.0	2249.0	2170.0	2234.0	20.0	0.9	40900.0	NaN	NaN	NaN	NaN	NaN	NaN	NaN	6745
# 4	2024-02-16	2249.0	2249.0	2203.0	2221.0	-13.0	-0.6	34100.0	2203.6	NaN	NaN	NaN	NaN	NaN	NaN	6745

コード利用|グラフの描画

上図のように、取得したデータを元にグラフを描画する場合は以下を実行します。

終値

# =======================================
# データ取得
# =======================================
# code: 銘柄コードを指定
# pages:取得したいデータ範囲

df = Stock(code=6745,pages=4)

# =======================================
# 描画
# =======================================

plotly_graph(df,                                # 参照データ
             X = "日付",                         # X軸
             Y =["終値","MA_5","MA_25","MA_50"]  # Y軸
            )

移動平均

# =======================================
# データ取得
# =======================================
# code: 銘柄コードを指定
# pages:取得したいデータ範囲

df = Stock(code=6745,pages=4)

# =======================================
# 描画
# =======================================

plotly_graph(df,         # 参照データ
             X = "日付",  # X軸
             Y =["終値"]  # Y軸
            )

ボリンジャーバンド

# =======================================
# データ取得
# =======================================
# code: 銘柄コードを指定
# pages:取得したいデータ範囲

df = Stock(code=6745,pages=4)

# =======================================
# 描画
# =======================================

plotly_graph(df,                             # 参照データ
             X = "日付",                      # X軸
             Y =["終値","+2sigma","-2sigma"]  # Y軸
            )

【参考】株式投資の自動化|Pythonによるシステムトレード

本記事ではPythonを用いた株式投資のシステムトレーディング手法を多数配信しています。

株式の関連記事一覧

株式投資の「自動売買」「システムトレード」に興味がある方向けの記事を多数配信しています。

人気記事一覧

#記事タイトル
1【Python】日本株銘柄の株価・財務データの取得方法
2【Python】日本株銘柄のファンダメンタルズ分析
3【Python】日本株価データを用いたテクニカル分析
4【Python】米国株銘柄の株価・財務データの取得方法

全ての関連記事を見る

【有料版】株式投資のシステムトレード

株式投資のシステムトレード実現に際して、中・上級者向け応用情報も配信しております。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次