概要
日経平均株価が4万円を超えるという歴史的な節目を迎えたということで,様々な記事がありますが,株価と為替データの取得をやってみました.取得したデータを利用してローソク足チャートを作成してみます.
Pythonのライブラリを利用してデータのダウンロードとローソク足チャートの描画をしてみたいと思います.証券会社の口座を開設することで,株価データのエクセルファイルを無償(有償かも)でダウンロードでき,グラフ描画ボタンで終わってしまう作業ではあるのですが(笑)
【紹介項目】
- 株価・為替データの取得
- ローソク足チャートの描画
1. 株価データ取得
1.1 ライブラリのインストール
ライブラリのyfinanceを利用して,株価データを取得します.ライブラリのインストールをします.
最新版をインストールすることをおすすめします.
pip install yfinance
yfinanceには,様々な機能があります.詳細については公式のページを参照してください.
株価データの取得は簡単で基本的に2行で完成します.銘柄コード・ティッカーシンボルを指定してdownload関数を利用するだけです.
株価データ取得の基本形
import yfinance as yf
data = yf.download(銘柄コード, start=開始日時, end=終了日時)
- yfinanceを利用して,株価データを取得するには,取得する株価の名前と取得期間の年月日が必要
- 取得する株価の名前は,銘柄コード,ティッカーシンボルと呼ばれる
- 銘柄コードは,日本の証券取引所に上場する企業に対して、「証券コード協議会」が付与する識別番号
- ティッカーシンボルは,欧米などで金融商品取引所に上場する銘柄を識別するために付けられるコード
この記事では,銘柄コードと記載しておきます
1.2 銘柄コードはどうやって調べるの
銘柄コードはヤフーファイナンスの株式ページで検索することによって知ることができます.図の赤い枠で囲まれた部分に銘柄コードが記載されています.
トヨタ自動車は7203.T,キヤノンは7751.Tであることがわかります.プログラムではTまで含めて利用します.この拡張子のように付随しているアルファベットは取引している市場を表しています.
市場略称 | アルファベット | 正式名称 |
---|---|---|
東証 | .T | 東京証券取引所(外国株市場を含む) |
名証 | .N | 名古屋証券取引所 |
札証 | .S | 札幌証券取引所(アンビシャスを含む) |
福証 | .F | 福岡証券取引所(Q-Boardを含む) |
多くの場合,東京証券取引所を示す .T が付加されますが, 日本テクノ・ラボ(株)【3849.S】
日経平均株価
日経平均株価は,検索すると,日経平均株価【998407.O】 となるのですが,998407.Oを利用すると,エラーになります.
日経平均株価は,別名,日経225なので ^N225を使用するようです.インデックスは特殊な記号を利用するようです.
外国株市場
基本的にヤフーファイナンスで検索できる銘柄の株価を取得することが可能なので,GoogleやAppleの株価情報も取得可能です.GAFAMとNvidiaの銘柄コード(米国なのでティッカーシンボルのほうがよいかも)を探してみました1. ティッカーシンボルGOOGでGoogleの株式情報を取得することができます.
名称 | 銘柄コード(ティッカーシンボル) |
---|---|
アルファベット | GOOG |
アップル | AAPL |
メタ・プラットフォームズ | META |
アマゾン・ドット・コム | AMZN |
マイクロソフト | MSFT |
エヌビディア | NVDA |
1.3 具体例(日経平均株価)
2024年2月1日から2024年3月4日までの日経平均株価(日経225)データを取得してみました.
import yfinance as yf
stock_num = "^N225" # 日経平均株価
start = "2024-02-01" # 取得開始日
end = "2024-03-04" # 取得終了日
data = yf.download(stock_num, start=start, end=end)
print(data.tail())
# Open High Low Close Adj Close Volume
# Date
# 2024-02-27 39260.781250 39426.289062 39113.031250 39239.519531 39233.710938 125700000
# 2024-02-28 39189.218750 39283.949219 39075.468750 39208.031250 39239.519531 119100000
# 2024-02-29 38935.531250 39250.121094 38876.808594 39166.191406 39208.031250 119900000
# 2024-03-01 39254.691406 39990.230469 39224.640625 39910.820312 39166.191406 166000000
# 2024-03-04 40201.761719 40314.640625 40001.550781 40109.230469 39910.820312 122800000
取得されるデータはpandasのデータフレームで,次のようなデータを得ることができます.
- Open: 始値
- High: 高値
- Low: 安値
- Close: 終値
- Adj Close: 調整後終値
- Volume: 取引量
Adj Closeは,調整後終値と呼ばれるもので,株式が分割されたとき株価が急に安価になり,株価データの値が急に変わってしまうのを防ぐような調整らしい.ヤフーファイナンスの解説ページでは,株式分割の実施の前後で株価を連続的にとらえるために,分割実施前の終値を分割後の値に調整したものを「調整後終値」として表示すると解説しています.
- sample_01.pyでは,日経平均株価なので銘柄コード部分に ^N225を利用しています.
stock_num = ^225 - トヨタの株価を取得する場合は,
stock_num = 7203.T
と変更することになります.
1.4 他のオプションを利用した株価取得方法
downloadのオプションを指定することで,日単位のデータは以外も取得可能となります.
【オプションの例】
- interval: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo
- period: “1d”, “5d”, “1mo”, “3mo”, “6mo”, “1y”, “2y”, “5y”, “10y”, “ytd”, “max”
start, endとintervalの組み合わせだと,組み合わせによっては「直近60日にしてね」などのワーニングが表示されることがあるようです.
【例 1】 直近1ヶ月90分間隔のトヨタ株データ取得
直近1ヶ月で90分間隔なので,
- stock_num = 7203.T # トヨタの銘柄コード
- period="1mo"
- interval="90m"
を利用します.
import yfinance as yf
stock_num = "7203.T" # トヨタの銘柄コード
toyota_data = yf.download(stock_num, period="1mo", interval="90m")
print(toyota_data.head())
# Open High Low Close Adj Close Volume
# Datetime
# 2024-02-06 09:00:00 2999.5 3001.0 2958.0 2961.0 2961.0 11545600
# 2024-02-06 10:30:00 2961.5 2977.0 2956.0 2959.0 2959.0 3841100
# 2024-02-06 12:00:00 2958.0 3064.0 2951.5 3050.0 3050.0 31990800
# 2024-02-06 13:30:00 3050.0 3148.0 3031.0 3134.0 3134.0 42387600
# 2024-02-07 09:00:00 3195.0 3363.0 3190.0 3322.0 3322.0 51017000
【例 2】 GAFAMデータの一括取得
一度に5社の株価データも取得することが可能です.銘柄コードの部分に5社すべてを並べるだけでOKです.銘柄コードは米国株式の場合アルファベット4文字のティッカーシンボルになっています.
import yfinance as yf
gafam_data = yf.download("GOOG AAPL META AMZN MSFT", start=start, end=end)
print(gafam_data.head())
# Price Adj Close Close ... Open Volume
# Ticker AAPL AMZN GOOG META MSFT AAPL AMZN GOOG META MSFT ... AAPL AMZN GOOG META MSFT AAPL AMZN GOOG META MSFT
# Date
2# 024-02-01 186.621872 159.279999 142.710007 394.361572 403.034698 186.860001 159.279999 142.710007 394.779999 403.779999 ... 183.990005 155.869995 143.690002 393.940002 401.829987 64885400 76542400 25526900 29727100 30657700
# 2024-02-02 185.613159 171.809998 143.539993 474.486542 410.460968 185.850006 171.809998 143.539993 474.989990 411.220001 ... 179.860001 169.190002 140.889999 459.600006 403.809998 102518000 117154900 42116900 84615500 28245000
# 2024-02-05 187.440811 170.309998 144.929993 458.923065 404.901245 187.679993 170.309998 144.929993 459.410004 405.649994 ... 188.149994 170.199997 144.039993 469.880005 409.899994 69668800 55081300 29254400 40832400 25352300
# 2024-02-06 189.058762 169.149994 145.410004 454.238037 404.741516 189.300003 169.149994 145.410004 454.720001 405.489990 ... 186.860001 169.389999 145.960007 464.000000 405.880005 43490800 42505500 21517700 21655200 18382600
# 2024-02-07 189.168625 170.529999 146.679993 469.092285 413.285706 189.410004 170.529999 146.679993 469.589996 414.049988 ... 190.639999 169.479996 146.119995 458.000000 407.440002 53439000 47174100 21436100 23066000 22340500
2. 為替データ取得
為替データもyfinanceを利用して取得可能です.しかも,銘柄コード部分を為替コードに変換すればよいだけというシンプル仕様です.
2.1 通貨ペアのコードはどうやって調べるの
株価と同様ヤフーファイナンスのFX・為替のページから取得したい通貨ペアを探します.
ユーロ/円と豪ドル/ドルのページを表示してみました.
赤い四角で囲んである部分が通貨ペアの表すコードになります.yfinanceで利用するには,一箇所削除が必要みたいです.表に記載のようにFXのFを削除した値を利用します.
通貨ペア | 表示名 | コード |
---|---|---|
ユーロ/円 | EURJPY=FX | EURJPY=X |
豪ドル/ドル | AUDUSD=FX | AUDUSD=X |
米ドル/円 | USDJPY=FX | USDJPY=X |
2.2 実例
豪ドル/ドルの通貨ペアデータで,直近5日間の1時間ごとのデータを取得してみました.
fx_num = "AUDUSD=X" # 豪ドル/ドル
fx_data = yf.download(fx_num, period="5d", interval="1h" )
print(fx_data.tail())
# Open High Low Close Adj Close Volume
# Datetime
# 2024-03-01 18:00:00+00:00 0.653211 0.653381 0.652529 0.653117 0.653117 0
# 2024-03-01 19:00:00+00:00 0.653296 0.653467 0.653100 0.653159 0.653159 0
# 2024-03-01 20:00:00+00:00 0.653253 0.653253 0.652878 0.653100 0.653100 0
# 2024-03-01 21:00:00+00:00 0.653168 0.653168 0.652550 0.653019 0.653019 0
# 2024-03-01 22:00:00+00:00 0.653019 0.653019 0.652571 0.652571 0.652571 0
3. ローソク足チャートの描画
株価や為替データの取得が完了したのでローソク足チャートを作成したみたいと思います.
3.1 ローソク足チャートについて
ローソク足チャートは,株価や為替相場の値動きを時系列に沿って図(箱ひげ図みたいな形状の図)で表す方法です.
1時間や1日などの単位期間を決めてからデータを集めます.
- 始値:期間の最初の取引価格
- 終値:期間の最後の取引価格
- 高値:期間中の最も高い取引価格
- 安値:最も安い取引価格
4種類の価格をローソクと呼ばれる「中」のように四角に棒が伸びたような図形に思いを込めてグラフ化したものがローソク足チャートです.
ローソクは2種類あり,「始値<終値」 型,つまり,取引価格が高くなっていく状況と,「始値>終値」 型,つまり,取引価格が安くなっていく状況の2種類に大別されます.期間中,取引価格が上昇したことを意味する「始値<終値」型のローソクは陽線,反対に取引価格が減少したしたことを意味する「始値>終値」型のローソクは陰線と呼ばれています2.
赤い色の図(左側・上側)のローソクが陽線の例です.ローソクの右側に取引価格の動きの一例を描いてみました.価格の取引価格は始値から開始して,安値,高値を付けつつ最終的に終値に至ります.4種類の価格しかわからないので,途中で取引価格が変動することもありえます.青い色の図(右側・下側)は陰線の例です.取引価格は始値から開始して,高値,安値を経由しつつ終値に至ります.
3.2 描画
mplfinance を利用してローソク足チャートを描画してみましょう.
最新版をインストールすることをおすすめします.
pip install mplfinance
mplfinanceの基本的な機能については,公式のページを参考にしてください.
ローソク足チャート描画の基本形
import mplfinance as mpf
mpf.plot(取得株価データ, type="candle")
取得株価データはyfinanceを利用して得られたデータのことです.列の名称はそのまま利用でき,type="candle" オプションを追加してチャートを表示させると
となります.図は2024年2月から3月6日までの日経平均株価に関する日足ローソク足チャートです.白色が陽線,黒色が陰線となります.
背景を黒色,陽線を赤色,陰線を青色,タイトルを付加するなどの見た目を変更したコードが次のsample_05.pyです.
import yfinance as yf # yfinanceでデータダンロード
import mplfinance as mpf # mplfinanceでローソク足チャート描画
stock_num = "^N225"
start = "2024-02-01"
end = "2024-03-04"
# 日経平均株価である^N225のデータをdataとして取得
data = yf.download(stock_num, start=start, end=end)
# 陽線;赤色,陰線:青色
mc = mpf.make_marketcolors(up="red", down="blue", inherit=True)
# チャートの色,背景の色
style = mpf.make_mpf_style(marketcolors=mc, base_mpf_style="nightclouds")
# ローソク足チャートを表示
mpf.plot(data, title="N225", type="candle", style=style)
最後にライブラリを追加して,日本語タイトルやボリンジャーバンドもローソク足チャートに追加したコードと結果を掲載しておきます.
追加ライブラリ
pip install pyti
詳細はpytiの公式サイトを参考にしてください.
ubuntuを利用しているので,フォント部分がIPAexGothicになっています.
import mplfinance as mpf
import japanize_matplotlib
from pyti.bollinger_bands import upper_bollinger_band as bb_up
from pyti.bollinger_bands import middle_bollinger_band as bb_mid
from pyti.bollinger_bands import lower_bollinger_band as bb_low
# 豪ドル/ドルのレート 直近5日 1時間足
fx_num = "AUDUSD=X"
fx_data = yf.download(fx_num, period="5d", interval="1h" )
# 陽線:赤
# 陰線:青
# 背景:黒
# 日本語フォント:IPAexGothic
mc = mpf.make_marketcolors(up="red", down="blue", inherit=True)
style = mpf.make_mpf_style(marketcolors=mc,
base_mpf_style="nightclouds",
rc={"font.family":"IPAexGothic"}
)
# ボリンジャーバンド
close_data = fx_data['Close'].values.tolist()
period = 15
# 上下2シグマの計算
fx_data['bb_up2'] = bb_up(close_data, period, 2)
fx_data['bb_up1'] = bb_up(close_data, period, 1)
fx_data['bb_mid'] = bb_mid(close_data, period)
fx_data['bb_low1'] = bb_low(close_data, period, 1)
fx_data['bb_low2'] = bb_low(close_data, period, 2)
# ボリンジャーバンド 2シグマをローソク足チャートに追記
apd = mpf.make_addplot(fx_data[['bb_up2','bb_up1','bb_mid','bb_low1','bb_low2']])
mpf.plot(fx_data,title="豪/US ドル", ylabel="USドル", type="candle", figsize=(20,10), style=style,addplot=apd)
【表示結果】
FXアプリのような画面になりました
雑感
- 陽線・陰線の色が国で異なるのは面白い.しかし!一瞬,驚くのは私だけなのだろうか?
- 集めた時系列データを利用して時系列解析へZzz