株価・為替データの取得とローソク足チャートの描画

# 概要

日経平均株価が４万円を超えるという歴史的な節目を迎えたということで，様々な記事がありますが，株価と為替データの取得をやってみました．取得したデータを利用してローソク足チャートを作成してみます．

Pythonのライブラリを利用してデータのダウンロードとローソク足チャートの描画をしてみたいと思います．証券会社の口座を開設することで，株価データのエクセルファイルを無償（有償かも）でダウンロードでき，グラフ描画ボタンで終わってしまう作業ではあるのですが（笑）

![aududs_chart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/9666038e-43c2-d5cc-ee88-535500ef0a1f.png)




**【紹介項目】**
* 株価・為替データの取得
* ローソク足チャートの描画

# 1. 株価データ取得
## 1.1 ライブラリのインストール
ライブラリの**yfinance**を利用して，株価データを取得します．ライブラリのインストールをします．

:::note
最新版をインストールすることをおすすめします．
pip install yfinance
:::

yfinanceには，様々な機能があります．詳細については[公式のページ](https://github.com/ranaroussi/yfinance)を参照してください．

株価データの取得は簡単で基本的に2行で完成します．銘柄コード・ティッカーシンボルを指定してdownload関数を利用するだけです．

:::note
**株価データ取得の基本形**

import yfinance as yf
data = yf.download(銘柄コード, start=開始日時, end=終了日時)
:::

* yfinanceを利用して，株価データを取得するには，取得する株価の名前と取得期間の年月日が必要
* 取得する株価の名前は，銘柄コード，ティッカーシンボルと呼ばれる
* 銘柄コードは，日本の証券取引所に上場する企業に対して、「証券コード協議会」が付与する識別番号
* ティッカーシンボルは，欧米などで金融商品取引所に上場する銘柄を識別するために付けられるコード

この記事では，銘柄コードと記載しておきます :sweat_smile:


## 1.2  銘柄コードはどうやって調べるの

銘柄コードはヤフーファイナンスの株式ページで検索することによって知ることができます．図の赤い枠で囲まれた部分に銘柄コードが記載されています．

<div style="float:left;"> 
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/989669f1-8bcf-7b2d-87a2-7e004242f570.jpeg">
<img width="350"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/2000c1a7-597a-1c90-d235-cd8889ff5143.jpeg"> 
</div>


トヨタ自動車は**7203.T**，キヤノンは**7751.T**であることがわかります．プログラムではTまで含めて利用します．この拡張子のように付随しているアルファベットは取引している市場を表しています．

|市場略称|アルファベット|正式名称|
|:--:|:--:|:--|
|東証|.T|東京証券取引所（外国株市場を含む）|
|名証|.N|名古屋証券取引所|
|札証|.S|札幌証券取引所（アンビシャスを含む）|
|福証|.F|福岡証券取引所（Q-Boardを含む）|

多くの場合，東京証券取引所を示す **.T** が付加されますが，　日本テクノ・ラボ(株)【3849.S】

<img width=25%><img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/54d6f254-9087-8cec-7496-4085e15b79cc.jpeg">
のように，札幌証券取引所のみで扱われている株式もあります．

**日経平均株価**
日経平均株価は，検索すると，**日経平均株価【998407.O】** となるのですが，998407.Oを利用すると，エラーになります．
日経平均株価は，別名，日経225なので **^N225**を使用するようです．インデックスは特殊な記号を利用するようです．

**外国株市場**
基本的にヤフーファイナンスで検索できる銘柄の株価を取得することが可能なので，GoogleやAppleの株価情報も取得可能です．GAFAMとNvidiaの銘柄コード（米国なのでティッカーシンボルのほうがよいかも）を探してみました[^1]． ティッカーシンボルGOOGでGoogleの株式情報を取得することができます．

<img width=25%><img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/a8399600-c51e-a987-fe34-e50c3f936933.jpeg">      


                

|名称|銘柄コード（ティッカーシンボル）|
|---|:----------------:|
|アルファベット|GOOG|
|アップル|AAPL|
|メタ・プラットフォームズ|META|
|アマゾン・ドット・コム|AMZN|
|マイクロソフト|MSFT|
|エヌビディア|NVDA|

## 1.3 具体例（日経平均株価）

2024年2月1日から2024年3月4日までの日経平均株価（日経225）データを取得してみました．
~~~ sample_01.py
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は，調整後終値と呼ばれるもので，株式が分割されたとき株価が急に安価になり，株価データの値が急に変わってしまうのを防ぐような調整らしい．ヤフーファイナンスの[解説ページ](https://support.yahoo-net.jp/PccFinance/s/article/H000006678)では，株式分割の実施の前後で株価を連続的にとらえるために，分割実施前の終値を分割後の値に調整したものを「調整後終値」として表示すると解説しています．


:::note
* sample_01.pyでは，日経平均株価なので銘柄コード部分に **^N225**を利用しています．
　　　　stock_num = ^N225
* トヨタの株価を取得する場合は，
　　　　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ヶ月90分間隔のトヨタ株データ取得
直近１ヶ月で90分間隔なので，
* stock_num = 7203.T # トヨタの銘柄コード
* period="1mo"
* interval="90m"

を利用します．
~~~ sample_02.py
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
~~~

### 【例 ２】　GAFAMデータの一括取得
一度に5社の株価データも取得することが可能です．銘柄コードの部分に5社すべてを並べるだけでOKです．銘柄コードは米国株式の場合アルファベット4文字のティッカーシンボルになっています．

~~~ sample_03.py
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・為替のページから取得したい通貨ペアを探します．
ユーロ/円と豪ドル/ドルのページを表示してみました．
<div style="float:left;"> 
<img width="350" src="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/4d7aa5f5-a1f1-ad5e-613a-bd1f3a39c1c4.jpeg">
<img width="350"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/872276be-1128-0945-8a3d-5d6fab2ac0df.jpeg"> 
</div>

赤い四角で囲んである部分が通貨ペアの表すコードになります．yfinanceで利用するには，一箇所削除が必要みたいです．表に記載のようにFXのFを削除した値を利用します．

|通貨ペア|表示名|コード|
|--|--|:--:|
|ユーロ/円|EURJPY=FX|**EURJPY=X**|
|豪ドル/ドル|AUDUSD=FX|**AUDUSD=X**|
|米ドル/円| USDJPY=FX |**USDJPY=X**|

## 2.2 実例
豪ドル/ドルの通貨ペアデータで，直近5日間の1時間ごとのデータを取得してみました．

~~~ sample_04.py
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 ローソク足チャートについて

ローソク足チャートは，株価や為替相場の値動きを時系列に沿って図（箱ひげ図みたいな形状の図）で表す方法です．

１時間や１日などの単位期間を決めてからデータを集めます．
* **始値**：期間の最初の取引価格
* **終値**：期間の最後の取引価格
* **高値**：期間中の最も高い取引価格
* **安値**：最も安い取引価格

４種類の価格をローソクと呼ばれる「中」のように四角に棒が伸びたような図形に思いを込めてグラフ化したものがローソク足チャートです．

ローソクは２種類あり，**「始値＜終値」** 型，つまり，取引価格が高くなっていく状況と，**「始値＞終値」** 型，つまり，取引価格が安くなっていく状況の２種類に大別されます．期間中，取引価格が上昇したことを意味する「始値＜終値」型のローソクは<font color="red">**陽線**</font>，反対に取引価格が減少したしたことを意味する「始値＞終値」型のローソクは<font color="blue">**陰線**</font>と呼ばれています[^2]．

<div style="float:left;">
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/a46a36fe-f646-8118-2bbf-2466e2cc4c0e.png"><img width="350 "src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/9ceb1809-b337-3cb7-1e43-4a519426788e.png"></div>

赤い色の図（左側・上側）のローソクが陽線の例です．ローソクの右側に取引価格の動きの一例を描いてみました．価格の取引価格は始値から開始して，安値，高値を付けつつ最終的に終値に至ります．4種類の価格しかわからないので，途中で取引価格が変動することもありえます．青い色の図（右側・下側）は陰線の例です．取引価格は始値から開始して，高値，安値を経由しつつ終値に至ります．



## 3.2 描画
**mplfinance** を利用してローソク足チャートを描画してみましょう．

:::note
最新版をインストールすることをおすすめします．
pip install mplfinance
:::

mplfinanceの基本的な機能については，[公式のページ](https://github.com/matplotlib/mplfinance)を参考にしてください．


:::note
ローソク足チャート描画の基本形

import mplfinance as mpf
mpf.plot(取得株価データ, type="candle")
:::
取得株価データはyfinanceを利用して得られたデータのことです．列の名称はそのまま利用でき，type="candle" オプションを追加してチャートを表示させると

![candle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/a73c3d83-4243-55df-f6f5-db3edf9e38da.png)
となります．図は2024年2月から3月6日までの日経平均株価に関する日足ローソク足チャートです．白色が陽線，黒色が陰線となります．

背景を黒色，陽線を赤色，陰線を青色，タイトルを付加するなどの見た目を変更したコードが次のsample_05.pyです．

~~~ 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)
~~~

sample_05.pyの表示結果は，次のようになります．
![n225_chart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/df8aa833-6e76-2cad-408f-ab92cc7a8c43.png)

最後にライブラリを追加して，日本語タイトルやボリンジャーバンドもローソク足チャートに追加したコードと結果を掲載しておきます．

:::note
追加ライブラリ
pip install pyti
:::
詳細は[pytiの公式サイト](https://github.com/kylejusticemagnuson/pyti)を参考にしてください．

ubuntuを利用しているので，フォント部分がIPAexGothicになっています．


~~~ sample_06.py
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
# 上下２シグマの計算
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アプリのような画面になりました:smile:

![aududs_chart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725285/9666038e-43c2-d5cc-ee88-535500ef0a1f.png)



# 雑感
* 陽線・陰線の色が国で異なるのは面白い．しかし！一瞬，驚くのは私だけなのだろうか？
* 集めた時系列データを利用して時系列解析へZzz

# 更新と注意
1. 2025年5月14日：yfinanceが2025年5月時点でうまく動作しないようです。記事の内容ではデータを取得できない状態となっていましたが、代用としてpandas_datareaderを利用しても株価データを取得できるようです。[参考記事](https://qiita.com/AzukiImo/items/9e72f80ce428e21cc7b7)
2. 2025年5月15日：yfinance復活？使えるようになっています。

[^1]: ChatGPTで有名になったOpen AIは執筆時時点では株式を購入できないぞ〜

[^2]: 陽線に赤色，陰線に青色は日本スタイル．赤色は日が昇るイメージなのか？米国式だと，陽線に青色，陰線に赤色と逆になるので注意が必要です．赤色で下落の注意喚起を表しているのか？