米国株投資を行うにあたり、上昇トレンドにある銘柄を把握したいと思いました。証券会社から色々とツールは出ていますが、とりあえず全銘柄の株価を取得できれば自分でも色々できると考え、手始めにS&P500全銘柄の株価をCSVファイルに出力してみました。
目次
結果イメージ
日付と各銘柄の株価一覧を取得します。
Date | MMM | AOS | ABT | ABBV | ATVI |
2021/1/20 | 169.039993 | 57.3800011 | 112.650002 | 112.910004 | 93.9599991 |
2021/1/21 | 170.220001 | 57.5600014 | 112.25 | 112.629997 | 95.4700012 |
2021/1/22 | 170.199997 | 57.8100014 | 113 | 110.650002 | 94.6800003 |
2021/1/25 | 168.880005 | 57.6100006 | 113.059998 | 109.730003 | 95.5299988 |
2021/1/26 | 173.779999 | 57.0400009 | 114.25 | 111.300003 | 93.3499985 |
2021/1/27 | 177.309998 | 53.7099991 | 115.199997 | 106.279999 | 91 |
2021/1/28 | 185 | 55.4799995 | 117.910004 | 104 | 89.5699997 |
2021/1/29 | 182.289993 | 56.3199997 | 120.25 | 104 | 90 |
環境
・Mac Sierra バージョン 10.12.6
・jupyter
ソースコード
import pandas as pd import pandas_datareader.data as pdr import datetime from tqdm import tqdm df = pd.read_csv('S&P500.csv') end = datetime.date.today() start = end - datetime.timedelta(days=10) stock = {} #株価データ格納 error_symbols = [] #エラー用 #株価取得 for s in tqdm(df['Symbol']): try: stock[s] = pdr.DataReader(s,"yahoo",start, end) except: error_symbols.append(s) #Open時のみの株価を抽出 open_stock_values={} for s in df['Symbol']: try: single_stock = stock[s] open_stock_values[s] = single_stock['Open'].values except: error_symbols.append(s) #データフレームに変換 df_stock = pd.DataFrame.from_dict(open_stock_values, orient='index').T #日付抽出 #日付はどの銘柄にも付与されているので、ここではAppleで実施 apple_stock = stock['AAPL'] apple_open_stock = apple_stock['Open'] #pandas_seriesに変換 ser_date = pd.Series(apple_open_stock.keys()) #辞書型に変換 dic_date={} dic_date["Date"]=ser_date #データフレームに変換 df_date = pd.DataFrame.from_dict(dic_date, orient='index').T #株価と日付を結合 join_stock = df_date.join(df_stock) #CSV出力 join_stock.to_csv("stock.csv")
動作説明
取得する銘柄を指定するCSVファイルを作成する。
以下リンクのようにCSVファイルを作成します。
取得する期間をstart,endで指定する。
daysを変更することで取得期間を調整します。
end = datetime.date.today() start = end - datetime.timedelta(days=10)
株価をpandas.datareaderで取得する
以下の処理で株価を取得しています。
取得までに数分〜数十分かかります。
#株価取得 for s in tqdm(df['Symbol']): try: stock[s] = pdr.DataReader(s,"yahoo",start, end) except: error_symbols.append(s)
stockの中身を見ると銘柄毎にOpen,High,Low等の株価が取得できています。
Open時のみの株価を抽出
今回はOpen時のみの株価を使うことにします。
以下の処理で抽出します。
#Open時のみの株価を抽出 open_stock_values={} for s in df['Symbol']: try: single_stock = stock[s] open_stock_values[s] = single_stock['Open'].values except: error_symbols.append(s) #データフレームに変換 df_stock = pd.DataFrame.from_dict(open_stock_values, orient='index').T
日付を抽出
うまい方法が思いつかず変換づくしで何とか抽出しました。
#日付抽出 #日付はどの銘柄にも付与されているので、ここではAppleで実施 apple_stock = stock['AAPL'] apple_open_stock = apple_stock['Open'] #pandas_seriesに変換 ser_date = pd.Series(apple_open_stock.keys()) #辞書型に変換 dic_date={} dic_date["Date"]=ser_date #データフレームに変換 df_date = pd.DataFrame.from_dict(dic_date, orient='index').T
日付と株価を結合
日付(df_date)と株価(df_stockj)を両方ともデータフレーム型としてのでjoinで結合しました。
#株価と日付を結合 join_stock = df_date.join(df_stock)
CSV出力
データフレームなのでto_csvの1行で出力できます。
#CSV出力 join_stock.to_csv("stock.csv")
出力結果
出力したCSVファイルを添付しておきます。
グラフ化したら下図のようになりました。
最後に
自分が探した限りでは株価の生データ一覧をサクッと取得できなかったので、今回試してみましたが、pandasのdatareaderという便利機能のおかげで思ったより簡単に達成できました。株価データさえ取れればあとはグラフで可視化したり株価上昇率でフィルタリングしたりと自由にデータ分析ができそうです。
以上。