今回はPandas_Datareaderを使って
日本の株価を取得して分析する方法についてです。
解説動画はこちら
始めに
最近、日本の株価がバブル期並みの
高音を付けている様です。
この際
Pythonで株価のデータ分析が行える様に
なってみるのも面白いかと思います。
日本の株価を取得するには
pandas_datareaderというものを使います。
Google Colabであれば
最初から使えるので、こちらを使っていきましょう。
pandas_datareader
様々な金融商品のデータを取得する事ができます
その中でも、日本の株価は「stooq」というもので
ポーランドかどこかの会社のデータの様です。
こちらを取得して分析を始めていきましょう。
基本的な使い方はこのようになっています。
銘柄コードを指定して取得します。
データを取得するコードはこちら
銘柄を変えたい場合は
codeの数字を変えて下さい。
株価から指標を計算してみる
ここからは取得したデータを使って
株価の分析に必要な指標を計算していきます。
移動平均
過去X日間の価格の平均値です
通常は終値を使います。
ボリンジャーバンド
+-1-3@までが一般的に良く用いられます。
@は標準偏差の様な意味合いです。
移動平均などの指標の計算
指標が計算できたら描画してみましょう。
描画には「Plotly」を用います。
これはライブで操作が出来る描画ライブラリで
静止画ではないので、色々な操作が行え捗ります。
ここからはテクニカル指標を
計算して描画していきましょう。
日本の株価を取得して分析する方法についてです。
解説動画はこちら
始めに
最近、日本の株価がバブル期並みの
高音を付けている様です。
この際
Pythonで株価のデータ分析が行える様に
なってみるのも面白いかと思います。
日本の株価を取得するには
pandas_datareaderというものを使います。
Google Colabであれば
最初から使えるので、こちらを使っていきましょう。
pandas_datareader
様々な金融商品のデータを取得する事ができます
その中でも、日本の株価は「stooq」というもので
ポーランドかどこかの会社のデータの様です。
こちらを取得して分析を始めていきましょう。
基本的な使い方はこのようになっています。
import pandas_datareader.data as web web.DataReader(銘柄コード, data_source='stooq', start=開始日,end=終了日)株価は銘柄ごとのデータになっているので
銘柄コードを指定して取得します。
データを取得するコードはこちら
# ライブラリのインポート import os import datetime as dt import pandas_datareader.data as web import plotly.graph_objects as go import pandas as pd # 銘柄コード入力(7203はトヨタ自動車) code = "7203" symbol = code + ".JP" # 2023-01-01以降の株価取得 start , end = '2023-01-01', dt.date.today() #データ取得 df = web.DataReader(symbol, data_source='stooq', start=start,end=end) df.insert(0, "code", code, allow_duplicates=False) df = df.sort_index() df.tail(3)
銘柄を変えたい場合は
codeの数字を変えて下さい。
株価から指標を計算してみる
ここからは取得したデータを使って
株価の分析に必要な指標を計算していきます。
移動平均
過去X日間の価格の平均値です
通常は終値を使います。
ボリンジャーバンド
移動平均を表す線と
その上下に値動きの幅を示す線を加えた指標で
その上下に値動きの幅を示す線を加えた指標で
「価格の大半がこの帯(バンド)の中に収まる」という
統計学を応用したテクニカル指標のひとつです。
+-1-3@までが一般的に良く用いられます。
@は標準偏差の様な意味合いです。
移動平均などの指標の計算
# 移動平均を計算する期間 period = 20 # 移動平均を計算 df[f'MA{period}'] = df['Close'].rolling(window=period).mean() # ボリンジャーバンドを計算 std = df['Close'].rolling(window=period).std() df['Upper Band1'] = df[f'MA{period}'] + 1 * std df['Upper Band2'] = df[f'MA{period}'] + 2 * std df['Upper Band3'] = df[f'MA{period}'] + 3 * std df['Lower Band1'] = df[f'MA{period}'] - 1 * std df['Lower Band2'] = df[f'MA{period}'] - 2 * std df['Lower Band3'] = df[f'MA{period}'] - 3 * std
指標が計算できたら描画してみましょう。
描画には「Plotly」を用います。
これはライブで操作が出来る描画ライブラリで
静止画ではないので、色々な操作が行え捗ります。
# プロット用のデータを作成 data = [ go.Candlestick( x=df.index, open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'], name='株価', ), go.Scatter(x=df.index,y=df['Upper Band2'],mode='lines',name='+2@',), go.Scatter(x=df.index,y=df['Upper Band1'],mode='lines',name='+1@',), go.Scatter(x=df.index,y=df[f'MA{period}'],mode='lines',name='移動平均',), go.Scatter(x=df.index,y=df['Lower Band2'],mode='lines',name='-2@',), go.Scatter(x=df.index,y=df['Lower Band1'],mode='lines',name='-1@',), ] # レイアウト設定 layout = go.Layout( title='株価の移動平均とボリンジャーバンド', xaxis=dict( title='日付', tickformat='%Y-%m-%d' ), yaxis=dict(title='株価'), ) # グラフを描画 fig = go.Figure(data=data, layout=layout) fig.show()
ここからはテクニカル指標を
計算して描画していきましょう。
# RSIを計算する関数 def calculate_rsi(data, window=14): delta = data.diff() up = delta.copy() down = delta.copy() up[up < 0] = 0 down[down > 0] = 0 avg_gain = up.rolling(window).mean() avg_loss = abs(down.rolling(window).mean()) rs = avg_gain / avg_loss rsi = 100 - (100 / (1 + rs)) return rsi # ストキャスティクスを計算する関数 def calculate_stochastic_oscillator(data, window=14): lowest_low = data.rolling(window).min() highest_high = data.rolling(window).max() stochastic_oscillator = (data - lowest_low) / (highest_high - lowest_low) * 100 return stochastic_oscillator # MACDを計算する関数 def calculate_macd(data, short_window=12, long_window=26, signal_window=9): short_ema = data.ewm(span=short_window, adjust=False).mean() long_ema = data.ewm(span=long_window, adjust=False).mean() macd = short_ema - long_ema signal_line = macd.ewm(span=signal_window, adjust=False).mean() histogram = macd - signal_line return macd, signal_line, histogram # RSIを計算 df['RSI'] = calculate_rsi(df['Close']) # ストキャスティクスを計算 df['%K'] = calculate_stochastic_oscillator(df['Close']) df['%D'] = df['%K'].rolling(3).mean() # MACDを計算 macd, signal_line, histogram = calculate_macd(df['Close']) df['MACD'] = macd df['Signal'] = signal_line df['Histogram'] = histogram
MACD(移動平均収束拡散手法)
短期の移動平均線と中長期の移動平均線を使用することで
買いと売りを判断する手法です。
MACDは基本となる線(MACD線)
MACDの移動平均線である
シグナル線の推移でマーケットを判断
シグナル線の推移でマーケットを判断
MACD線がシグナル線を上抜けると
ゴールデンクロス(買いタイミング)
ゴールデンクロス(買いタイミング)
MACD線がシグナル線を下抜けると
デッドクロス(売りタイミング)
デッドクロス(売りタイミング)
# MACD fig = go.Figure( data=[ go.Candlestick( x=df.index, open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'], name='株価', yaxis='y1' ), go.Scatter(x=df.index, y=df['MACD'], line=dict(color='red', width=1), name="macd", yaxis='y2'), go.Scatter(x=df.index, y=df['Signal'], line=dict(color='blue', width=1), name="signal", yaxis='y2') ], layout = go.Layout( xaxis=dict( title='日付', tickformat='%Y-%m-%d' ), yaxis = dict(title='株価', side='left', showgrid=False, range=[df.Low.min(), df.High.max()]), yaxis2 = dict(title='指標', side='right', overlaying='y', range=[min(df.Signal.min(), df.MACD.min()), max(df.MACD.max(), df.Signal.max())] ) ) ) fig.show()
RSI
「Relative Strength Index」の略で
「Relative Strength Index」の略で
日本語に訳すと「相対力指数」
買われすぎか、売られすぎかを判断するための指標です。
過去一定期間の上げ幅(前日比)の合計を
同じ期間の上げ幅の合計と下げ幅の合計を足した数字で割って
100を掛けたもの
一般的に70~80%以上で買われすぎ
20~30%以下で売られすぎと判断します。
ストキャスティクス
トレードシミュレーション
ここからは株価と指標を用いて
売買のシミュレーションを行ってみましょう。
MACDでエントリーポイントを決めて売買する
簡単なシミュレーションを行ってみます。
結果を描画してみると
こんな感じで、売買ポイントの可視化が出来ました。
今回は簡易なデータ取得と
分析手法になっているので
気軽に始められるかと思います。
色々試してみて下さいね
それでは。
# RSI fig = go.Figure( data=[ go.Candlestick( x=df.index, open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'], name='株価', yaxis='y1' ), go.Scatter(x=df.index, y=df['RSI'], line=dict(color='blue', width=1), name="RSI", yaxis='y2'), ], layout = go.Layout( xaxis=dict( title='日付', tickformat='%Y-%m-%d' ), yaxis = dict(title='株価', side='left', showgrid=False, range=[df.Low.min(), df.High.max()]), yaxis2 = dict(title='指標', side='right', overlaying='y', range=[df.RSI.min(), df.RSI.max()] ) ) ) fig.show()
ストキャスティクス
チャートは%K(Fast)と%D(Slow)の2本の線で表され
数値は0%から100%の範囲で推移します。
%Kラインは相場に対して敏感に動き
Dラインは%Kラインよりも遅く動きますが
より重要とされているのは%Dラインです。
一般的には20~30%以下で売られすぎ
70~80%以上で買われすぎと判断しますが
相場の勢いが強い場合には
20%や80%を突破することもあります。
20%や80%を突破することもあります。
# ストキャスティクス fig = go.Figure( data=[ go.Candlestick( x=df.index, open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'], name='株価', yaxis='y1' ), go.Scatter(x=df.index, y=df['%K'], line=dict(color='blue', width=1), name="%K", yaxis='y2'), go.Scatter(x=df.index, y=df['%D'], line=dict(color='red', width=1), name="%D", yaxis='y2') ], layout = go.Layout( xaxis=dict( title='日付', tickformat='%Y-%m-%d' ), yaxis = dict(title='株価', side='left', showgrid=False, range=[df.Low.min(), df.High.max()]), yaxis2 = dict(title='指標', side='right', overlaying='y', range=[min(df['%K'].min(), df['%D'].min()), max(df['%K'].max(), df['%D'].max())] ) ) ) fig.show()
トレードシミュレーション
ここからは株価と指標を用いて
売買のシミュレーションを行ってみましょう。
MACDでエントリーポイントを決めて売買する
簡単なシミュレーションを行ってみます。
# トレードのシミュレーションを行う関数 def simulate_trades(df): positions = [] # トレードのポジション(買い or 売り) entry_prices = [] # エントリー価格 exit_prices = [] # エグジット価格 pnl = [] # 損益 for i in range(len(df)): if i == 0: positions.append(None) entry_prices.append(None) exit_prices.append(None) pnl.append(None) else: if df['MACD'][i] > df['Signal'][i] and df['MACD'][i-1] <= df['Signal'][i-1]: # MACDがシグナルを上回った時に買いポジション positions.append('Buy') entry_prices.append(df['Close'][i]) exit_prices.append(None) pnl.append(None) elif df['MACD'][i] < df['Signal'][i] and df['MACD'][i-1] >= df['Signal'][i-1]: # MACDがシグナルを下回った時に売りポジション positions.append('Sell') entry_prices.append(df['Close'][i]) exit_prices.append(None) pnl.append(None) elif positions[-1] == 'Buy': # 買いポジションを保持している場合 positions.append('Buy') entry_prices.append(entry_prices[-1]) exit_prices.append(df['Close'][i]) pnl.append(df['Close'][i] - entry_prices[-1]) elif positions[-1] == 'Sell': # 売りポジションを保持している場合 positions.append('Sell') entry_prices.append(entry_prices[-1]) exit_prices.append(df['Close'][i]) pnl.append(entry_prices[-1] - df['Close'][i]) else: positions.append(None) entry_prices.append(None) exit_prices.append(None) pnl.append(None) df['Position'] = positions df['Entry Price'] = entry_prices df['Exit Price'] = exit_prices df['P&L'] = pnl return df # トレードのシミュレーションを実行 df = simulate_trades(df)
結果を描画してみると
# プロット用のデータを作成 buy_indices = df[df['Position'] == 'Buy'].index sell_indices = df[df['Position'] == 'Sell'].index fig = go.Figure() # Closeをプロット fig.add_trace(go.Scatter(x=df.index, y=df['Close'], name='Close', mode='lines')) # Entry Priceをプロット fig.add_trace(go.Scatter(x=df.loc[buy_indices].index, y=df.loc[buy_indices]['Entry Price'], name='Entry Price (BUY)', mode='markers', marker=dict(color='blue', size=8))) fig.add_trace(go.Scatter(x=df.loc[sell_indices].index, y=df.loc[sell_indices]['Entry Price'], name='Entry Price (SELL)', mode='markers', marker=dict(color='red', size=8))) # Exit Priceをプロット fig.add_trace(go.Scatter(x=df.loc[buy_indices].index, y=df.loc[buy_indices]['Exit Price'], name='Exit Price (BUY)', mode='markers', marker=dict(color='blue', size=8, symbol='triangle-up'))) fig.add_trace(go.Scatter(x=df.loc[sell_indices].index, y=df.loc[sell_indices]['Exit Price'], name='Exit Price (SELL)', mode='markers', marker=dict(color='red', size=8, symbol='triangle-down'))) # P&Lをプロット(二番目の軸) fig.add_trace(go.Scatter(x=df.index, y=df['P&L'], name='P&L', mode='lines', yaxis='y2')) # レイアウト設定 fig.update_layout(title='Trading Simulation', xaxis_title='Date', yaxis=dict(title='Price', side='left'), yaxis2=dict(title='P&L', side='right', overlaying='y', showgrid=False), legend=dict(x=0, y=1), hovermode='x unified') # グラフの表示 fig.show()
こんな感じで、売買ポイントの可視化が出来ました。
今回は簡易なデータ取得と
分析手法になっているので
気軽に始められるかと思います。
色々試してみて下さいね
それでは。