こんにちは、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】米国株銘柄の株価・財務データの取得方法 |
全ての関連記事を見る
【有料版】株式投資のシステムトレード
株式投資のシステムトレード実現に際して、中・上級者向け応用情報も配信しております。
最後に

お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら


