2022年7月版 - 米国株時系列データの入手方法
概要
SREホールディングス株式会社の佐々木です。
Pythonでアメリカ株のスクリーニング等をするときに必要になるのが時系列データですが、この記事では2022年7月現在で米国株時系列データをフリーで入手する方法をいくつか紹介します。
この記事で扱う時系列データ
この記事では株価(日足)の4本値(OHLC)にVolume(出来高)を加えたOHLCVを扱います。
株価の4本値とは以下のとおりです。
Open:始値
High:高値
Low:安値
Close:終値(分割調整後)
これにVolume(出来高)を加えると以下のような日足チャートを作成することができます。
(以下チャートはmplfinanceというライブラリで作成できます)
この記事で使ったライブラリ等のバージョン
Python 3.9.7
numpy 1.23.1
pandas 1.4.3
pandas-datareader 0.10.0
yfinance 0.1.72
yfinanceの利用方法
最初におすすめの方法を紹介します。おすすめはyfinanceというライブラリを利用することです。
特に問題がなければ他の方法を選択する必要はないと思います。
1銘柄のOHLCVを取得
IBM社の株価(日足)の20日前からのOHLCVを取得するには以下のようにします。
尚、アメリカ株の銘柄を指定するにはticker-symbolという文字列を使います。
たとえばIBM社のticker-symbolは"IBM"です。3M社のticker-symbolは"MMM"です。
from datetime import date, timedelta
from pandas_datareader import data as pdr
import yfinance as yfin
yfin.pdr_override()
today = date.today()
startday = today - timedelta(days=20)
ticker = "IBM"
pd_data = pdr.get_data_yahoo(ticker, startday)
print(pd_data)
実行すると以下のようにpandas.DataFrame形式でデータを取得できていることが分かります。
尚、"Adj Close"は配当落調整後の終値です。
[*********************100%***********************] 1 of 1 completed
Open High Low Close Adj Close Volume
Date
2022-06-21 135.899994 138.500000 135.899994 137.850006 137.850006 4089300
2022-06-22 136.100006 138.179993 136.029999 137.080002 137.080002 3791500
2022-06-23 137.139999 138.619995 136.500000 138.440002 138.440002 4547900
2022-06-24 139.199997 142.369995 139.130005 142.059998 142.059998 11493000
2022-06-27 142.259995 143.830002 141.949997 142.800003 142.800003 3936000
2022-06-28 142.919998 144.160004 141.320007 141.860001 141.860001 4064800
2022-06-29 142.740005 143.520004 139.500000 140.710007 140.710007 4161500
2022-06-30 139.580002 142.460007 139.279999 141.190002 141.190002 4878000
2022-07-01 141.000000 141.669998 139.259995 141.119995 141.119995 4011900
2022-07-05 139.970001 139.970001 135.270004 137.619995 137.619995 6273400
2022-07-06 138.000000 139.139999 137.130005 138.080002 138.080002 3237000
2022-07-07 138.910004 141.320007 138.830002 140.830002 140.830002 3897100
2022-07-08 140.759995 141.320007 139.820007 140.470001 140.470001 2820800
複数銘柄のOHLCVを取得
複数銘柄のデータを一度に取得するにはticker-symbolをlistにします。
from datetime import date, timedelta
from pandas_datareader import data as pdr
import yfinance as yfin
yfin.pdr_override()
today = date.today()
startday = today - timedelta(days=20)
ticker_list = ["IBM", "AAPL", "MSFT"]
pd_data = pdr.get_data_yahoo(ticker_list, startday)
print(pd_data)
実行すると以下のようにpandas.DataFrame形式でデータを取得できていることが分かります。
[*********************100%***********************] 3 of 3 completed
Adj Close Close ... Open Volume
AAPL IBM MSFT AAPL IBM MSFT ... AAPL IBM MSFT AAPL IBM MSFT
Date ...
2022-06-21 135.869995 137.850006 253.740005 135.869995 137.850006 253.740005 ... 133.419998 135.899994 250.259995 81000500 4089300 29928300
2022-06-22 135.350006 137.080002 253.130005 135.350006 137.080002 253.130005 ... 134.789993 136.100006 251.889999 73409200 3791500 25939900
2022-06-23 138.270004 138.440002 258.859985 138.270004 138.440002 258.859985 ... 136.820007 137.139999 255.570007 72433800 4547900 25861400
2022-06-24 141.660004 142.059998 267.700012 141.660004 142.059998 267.700012 ... 139.899994 139.199997 261.809998 89116800 11493000 33923200
2022-06-27 141.660004 142.800003 264.890015 141.660004 142.800003 264.890015 ... 142.699997 142.259995 268.209991 70207900 3936000 24615100
2022-06-28 137.440002 141.860001 256.480011 137.440002 141.860001 256.480011 ... 142.130005 142.919998 263.980011 67083400 4064800 27295500
2022-06-29 139.229996 140.710007 260.260010 139.229996 140.710007 260.260010 ... 137.460007 142.740005 257.589996 66242400 4161500 20069800
2022-06-30 136.720001 141.190002 256.829987 136.720001 141.190002 256.829987 ... 137.250000 139.580002 257.049988 98964500 4878000 31730900
2022-07-01 138.929993 141.119995 259.579987 138.929993 141.119995 259.579987 ... 136.039993 141.000000 256.390015 71007500 4011900 22825200
2022-07-05 141.559998 137.619995 262.850006 141.559998 137.619995 262.850006 ... 137.770004 139.970001 256.160004 73353800 6273400 22941000
2022-07-06 142.919998 138.080002 266.209991 142.919998 138.080002 266.209991 ... 141.350006 138.000000 263.750000 74064300 3237000 23824400
2022-07-07 146.350006 140.830002 268.399994 146.350006 140.830002 268.399994 ... 143.289993 138.910004 265.119995 66253700 3897100 20859900
2022-07-08 147.039993 140.470001 267.660004 147.039993 140.470001 267.660004 ... 145.259995 140.759995 264.790009 64493200 2820800 19648100
4本値の1つの値を抽出
複数銘柄を指定した場合に得られるデータは多次元構造になっています。
このデータから、たとえば複数銘柄のClose(終値)だけを抽出するには以下のようにします。
print(pd_data['Close'])
AAPL IBM MSFT
Date
2022-06-21 135.869995 137.850006 253.740005
2022-06-22 135.350006 137.080002 253.130005
2022-06-23 138.270004 138.440002 258.859985
2022-06-24 141.660004 142.059998 267.700012
2022-06-27 141.660004 142.800003 264.890015
2022-06-28 137.440002 141.860001 256.480011
2022-06-29 139.229996 140.710007 260.260010
2022-06-30 136.720001 141.190002 256.829987
2022-07-01 138.929993 141.119995 259.579987
2022-07-05 141.559998 137.619995 262.850006
2022-07-06 142.919998 138.080002 266.209991
2022-07-07 146.350006 140.830002 268.399994
2022-07-08 147.039993 140.470001 267.660004
1銘柄のOHLCVを抽出
たとえばIBMのOHLCVを抽出するには以下のようにします。
print(pd_data.xs("IBM", level=1, axis=1))
Adj Close Close High Low Open Volume
Date
2022-06-21 137.850006 137.850006 138.500000 135.899994 135.899994 4089300
2022-06-22 137.080002 137.080002 138.179993 136.029999 136.100006 3791500
2022-06-23 138.440002 138.440002 138.619995 136.500000 137.139999 4547900
2022-06-24 142.059998 142.059998 142.369995 139.130005 139.199997 11493000
2022-06-27 142.800003 142.800003 143.830002 141.949997 142.259995 3936000
2022-06-28 141.860001 141.860001 144.160004 141.320007 142.919998 4064800
2022-06-29 140.710007 140.710007 143.520004 139.500000 142.740005 4161500
2022-06-30 141.190002 141.190002 142.460007 139.279999 139.580002 4878000
2022-07-01 141.119995 141.119995 141.669998 139.259995 141.000000 4011900
2022-07-05 137.619995 137.619995 139.970001 135.270004 139.970001 6273400
2022-07-06 138.080002 138.080002 139.139999 137.130005 138.000000 3237000
2022-07-07 140.830002 140.830002 141.320007 138.830002 138.910004 3897100
2022-07-08 140.470001 140.470001 141.320007 139.820007 140.759995 2820800
他の方法
yfinanceが利用できなくなった場合に備えて他の方法をいくつか紹介します。
Stooq社からデータを取得する
pandas-datareaderではStooq社からデータを取得可能です。
from datetime import date, timedelta
from pandas_datareader import data as pdr
today = date.today()
startday = today - timedelta(days=20)
ticker_list = ["IBM", "AAPL", "MSFT"]
pd_data = pdr.DataReader(ticker_list, "stooq", startday)
print(pd_data)
結果は以下のとおりで、yfinanceとの違いは以下のとおりです。
- "Adj Close"(配当落調整後終値)がない
- 日付の昇順が逆
Attributes Close High Low Open Volume
Symbols IBM AAPL MSFT IBM AAPL MSFT IBM AAPL MSFT IBM AAPL MSFT IBM AAPL MSFT
Date
2022-07-11 141.00 144.889 264.55 141.8700 146.640 266.530 140.13 143.7800 262.1814 140.62 145.670 265.650 3904689 63137156 19454682
2022-07-08 140.47 147.040 267.66 141.3203 147.550 268.100 139.82 145.0000 263.2850 140.76 145.265 264.790 2820928 64547798 19658751
2022-07-07 140.83 146.350 268.40 141.3250 146.550 269.055 138.83 143.2800 265.0200 138.91 143.290 265.120 3897077 66253709 20859874
2022-07-06 138.08 142.920 266.21 139.1400 144.120 267.990 137.13 141.0800 262.4000 138.00 141.355 263.750 3237059 74064254 23824419
2022-07-05 137.62 141.560 262.85 139.9700 141.610 262.980 135.27 136.9300 254.7400 139.97 137.770 256.160 6274067 73429641 22971634
2022-07-01 141.12 138.930 259.58 141.6700 139.040 259.770 139.26 135.6600 254.6100 141.00 136.040 256.390 4012106 71051552 22837692
2022-06-30 141.19 136.720 256.83 142.4600 138.370 259.530 139.28 133.7737 252.9000 139.58 137.250 257.050 4878020 98964467 31730868
2022-06-29 140.71 139.230 260.26 143.5213 140.670 261.970 139.50 136.6700 255.7600 142.74 137.460 257.590 4161491 66242411 20069839
2022-06-28 141.86 137.440 256.48 144.1550 143.422 266.910 141.32 137.3250 256.3200 142.92 142.130 263.980 4065202 67315328 27380247
2022-06-27 142.80 141.660 264.89 143.8300 143.490 268.300 141.95 140.9650 263.2800 142.26 142.695 268.205 3935968 70207908 24615114
2022-06-24 142.06 141.660 267.70 142.3700 141.910 267.980 139.13 139.7700 261.7200 139.20 139.900 261.808 11493012 89116837 33923231
2022-06-23 138.44 138.270 258.86 138.6200 138.590 259.370 136.50 135.6300 253.6300 137.14 136.820 255.570 4547925 72433768 25861449
2022-06-22 137.08 135.350 253.13 138.1800 137.760 257.170 136.03 133.9100 250.3700 136.10 134.790 251.890 3791635 73409234 25961215
日付の昇順をyfinanceと合わせるには以下のようにします。
print(pd_data.sort_index())
Alpha Vantage社からデータを取得する
pandas-datareaderではAlpha Vantage社からデータを取得可能です。
Alpha Vantage社からデータを取得するにはAPI-Keyが必要でこちらで無料で取得できます。
以下サンプルコードの"xxxxxxxxxxxxxxxx"は取得したAPI-Keyが入ります。
from datetime import date, timedelta
from pandas_datareader import data as pdr
today = date.today()
startday = today - timedelta(days=20)
ticker = "IBM"
av = "xxxxxxxxxxxxxxxx"
pd_data = pdr.DataReader(ticker, "av-daily", startday, api_key=av)
print(pd_data)
結果は以下のとおりで、yfinanceとの違いは以下のとおりです。
- "Adj Close"(配当落調整後終値)がない
- 複数銘柄をまとめて取得できない
open high low close volume
2022-06-22 136.10 138.1800 136.03 137.08 3791635
2022-06-23 137.14 138.6200 136.50 138.44 4547925
2022-06-24 139.20 142.3700 139.13 142.06 11493012
2022-06-27 142.26 143.8300 141.95 142.80 3935968
2022-06-28 142.92 144.1550 141.32 141.86 4065202
2022-06-29 142.74 143.5213 139.50 140.71 4161491
2022-06-30 139.58 142.4600 139.28 141.19 4878020
2022-07-01 141.00 141.6700 139.26 141.12 4012106
2022-07-05 139.97 139.9700 135.27 137.62 6274067
2022-07-06 138.00 139.1400 137.13 138.08 3237059
2022-07-07 138.91 141.3250 138.83 140.83 3897077
2022-07-08 140.76 141.3203 139.82 140.47 2820928
2022-07-11 140.62 141.8700 140.13 141.00 3900185
Tiingo社からデータを取得する
pandas-datareaderではTiingo社からデータを取得可能です。
Tiingo社からデータを取得するにはアカウント作成が必要です。アカウント作成自体は無料ですが、API利用は無料コースと有料コースがあり、制限が異なります。詳細はこちらを御覧ください。
以下サンプルコードの"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"は取得したAPI-Keyが入ります。
from datetime import date, timedelta
from pandas_datareader import data as pdr
today = date.today()
startday = today - timedelta(days=20)
ticker_list = ["IBM", "AAPL", "MSFT"]
tiingo = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
pd_data = pdr.DataReader(ticker_list, "tiingo", startday, api_key=tiingo)
print(pd_data)
結果は以下のとおりで、yfinanceとの違いは以下のとおりです。
- データ構造が異なる
close high low open volume ... adjLow adjOpen adjVolume divCash splitFactor
symbol date ...
IBM 2022-06-22 00:00:00+00:00 137.08 138.1800 136.0300 136.100 3791635 ... 136.0300 136.100 3791635 0.0 1.0
2022-06-23 00:00:00+00:00 138.44 138.6200 136.5000 137.140 4547925 ... 136.5000 137.140 4547925 0.0 1.0
2022-06-24 00:00:00+00:00 142.06 142.3700 139.1300 139.200 11493012 ... 139.1300 139.200 11493012 0.0 1.0
2022-06-27 00:00:00+00:00 142.80 143.8300 141.9500 142.260 3935968 ... 141.9500 142.260 3935968 0.0 1.0
2022-06-28 00:00:00+00:00 141.86 144.1550 141.3200 142.920 4065202 ... 141.3200 142.920 4065202 0.0 1.0
2022-06-29 00:00:00+00:00 140.71 143.5213 139.5000 142.740 4161491 ... 139.5000 142.740 4161491 0.0 1.0
2022-06-30 00:00:00+00:00 141.19 142.4600 139.2800 139.580 4878020 ... 139.2800 139.580 4878020 0.0 1.0
2022-07-01 00:00:00+00:00 141.12 141.6700 139.2600 141.000 4012106 ... 139.2600 141.000 4012106 0.0 1.0
2022-07-05 00:00:00+00:00 137.62 139.9700 135.2700 139.970 6274067 ... 135.2700 139.970 6274067 0.0 1.0
2022-07-06 00:00:00+00:00 138.08 139.1400 137.1300 138.000 3237059 ... 137.1300 138.000 3237059 0.0 1.0
2022-07-07 00:00:00+00:00 140.83 141.3250 138.8300 138.910 3897077 ... 138.8300 138.910 3897077 0.0 1.0
2022-07-08 00:00:00+00:00 140.47 141.3203 139.8200 140.760 2820928 ... 139.8200 140.760 2820928 0.0 1.0
2022-07-11 00:00:00+00:00 141.00 141.8700 140.1300 140.620 3912773 ... 140.1300 140.620 3912773 0.0 1.0
AAPL 2022-06-22 00:00:00+00:00 135.35 137.7600 133.9100 134.790 73409234 ... 133.9100 134.790 73409234 0.0 1.0
2022-06-23 00:00:00+00:00 138.27 138.5900 135.6300 136.820 72433768 ... 135.6300 136.820 72433768 0.0 1.0
2022-06-24 00:00:00+00:00 141.66 141.9100 139.7700 139.900 89116837 ... 139.7700 139.900 89116837 0.0 1.0
2022-06-27 00:00:00+00:00 141.66 143.4900 140.9650 142.695 70207908 ... 140.9650 142.695 70207908 0.0 1.0
2022-06-28 00:00:00+00:00 137.44 143.4220 137.3250 142.130 67315328 ... 137.3250 142.130 67315328 0.0 1.0
2022-06-29 00:00:00+00:00 139.23 140.6700 136.6700 137.460 66242411 ... 136.6700 137.460 66242411 0.0 1.0
2022-06-30 00:00:00+00:00 136.72 138.3700 133.7737 137.250 98964467 ... 133.7737 137.250 98964467 0.0 1.0
2022-07-01 00:00:00+00:00 138.93 139.0400 135.6600 136.040 71051552 ... 135.6600 136.040 71051552 0.0 1.0
2022-07-05 00:00:00+00:00 141.56 141.6100 136.9300 137.770 73429641 ... 136.9300 137.770 73429641 0.0 1.0
2022-07-06 00:00:00+00:00 142.92 144.1200 141.0800 141.355 74064254 ... 141.0800 141.355 74064254 0.0 1.0
2022-07-07 00:00:00+00:00 146.35 146.5500 143.2800 143.290 66253709 ... 143.2800 143.290 66253709 0.0 1.0
2022-07-08 00:00:00+00:00 147.04 147.5500 145.0000 145.265 64547798 ... 145.0000 145.265 64547798 0.0 1.0
2022-07-11 00:00:00+00:00 144.87 146.6400 143.7800 145.670 63305113 ... 143.7800 145.670 63305113 0.0 1.0
MSFT 2022-06-22 00:00:00+00:00 253.13 257.1700 250.3700 251.890 25961215 ... 250.3700 251.890 25961215 0.0 1.0
2022-06-23 00:00:00+00:00 258.86 259.3700 253.6300 255.570 25861449 ... 253.6300 255.570 25861449 0.0 1.0
2022-06-24 00:00:00+00:00 267.70 267.9800 261.7200 261.808 33923231 ... 261.7200 261.808 33923231 0.0 1.0
2022-06-27 00:00:00+00:00 264.89 268.3000 263.2800 268.205 24615114 ... 263.2800 268.205 24615114 0.0 1.0
2022-06-28 00:00:00+00:00 256.48 266.9100 256.3200 263.980 27380247 ... 256.3200 263.980 27380247 0.0 1.0
2022-06-29 00:00:00+00:00 260.26 261.9700 255.7600 257.590 20069839 ... 255.7600 257.590 20069839 0.0 1.0
2022-06-30 00:00:00+00:00 256.83 259.5300 252.9000 257.050 31730868 ... 252.9000 257.050 31730868 0.0 1.0
2022-07-01 00:00:00+00:00 259.58 259.7700 254.6100 256.390 22837692 ... 254.6100 256.390 22837692 0.0 1.0
2022-07-05 00:00:00+00:00 262.85 262.9800 254.7400 256.160 22971634 ... 254.7400 256.160 22971634 0.0 1.0
2022-07-06 00:00:00+00:00 266.21 267.9900 262.4000 263.750 23824419 ... 262.4000 263.750 23824419 0.0 1.0
2022-07-07 00:00:00+00:00 268.40 269.0550 265.0200 265.120 20859874 ... 265.0200 265.120 20859874 0.0 1.0
2022-07-08 00:00:00+00:00 267.66 268.1000 263.2850 264.790 19658751 ... 263.2850 264.790 19658751 0.0 1.0
2022-07-11 00:00:00+00:00 264.51 266.5300 262.1800 265.650 19519108 ... 262.1800 265.650 19519108 0.0 1.0
[39 rows x 12 columns]
Tiingo社は有料サービスも提供しており取得できる情報も多いので、ビジネスとして利用するデータを取得するには第一候補になるかもしれません。
Discussion