💸

2022年7月版 - 米国株時系列データの入手方法

2022/07/13に公開

概要

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社は有料サービスも提供しており取得できる情報も多いので、ビジネスとして利用するデータを取得するには第一候補になるかもしれません。

SRE Holdings 株式会社

Discussion