ども♪マコトです。
去年から米国の金利が逆イールドしているので景気が低迷するのではないかと話題があったので、FRBのHPからFFレートと米国金利を取得するプログラムをpyhtonで作ってみました。
Cドライブのdataフォルダに格納後にデータベースに格納するように作成しているので dataフォルダを作成してください。
プログラムは以下
""" アメリカの金利とFFRateを取得する https://www.federalreserve.gov/datadownload """ # -*- coding: utf-8 -*- #!/usr/bin/env python import mysql.connector as sqlc import csv import sys import time import requests from contextlib import closing import os import Cls_Connect as Conn try: # 実行時間を測るStart start = time.time() #保存先ファイル名 file_name = r"C:\data\FRB_H15.csv" # プロキシの設定(プロキシーを設定している場合は必要ない) Con = Conn.Connect() os.environ["http_proxy"] = Con.http_proxy() os.environ["https_proxy"] = Con.https_proxy() # 米国金利 URL = "https://www.federalreserve.gov/datadownload/Output.aspx?rel=H15&series=bf17364827e38702b42a58cf8eaa3f78&lastobs=&from=&to=&filetype=csv&label=omit&layout=serieslist" response = requests.get(URL, stream=True) # ファイルの保存 if response.status_code == 200: f = open(file_name, 'wb') f.write(response.content) f.close() # 編集したいファイル(元ファイル)を開く file = open(file_name,"r") # 書き出し用のファイルを開く out_file = open(r"C:\data\FRB_H15_Modify.csv","w") # 元ファイルのレコード部分をreadlinesメソッドで全行を読み取る lines = file.readlines() # for文で1行ずつ取得 for line in lines: if(line[-2:]==",\n" or line[-4:]==",ND\n"): pass else: # ダブルコーテーションでくくる word = line.split(',') line = '"' + word[0].lstrip("H15/H15/").rstrip("_N.B") + '",' + word[1] + ',' + word[2] # 書き出し用のファイルに出力 out_file.write(line) # 2つのファイルを閉じる file.close() out_file.close() # 編集したファイルを開く csv_file = open(r"C:\data\FRB_H15_Modify.csv", "r", encoding="utf_8", errors="", newline="" ) #リスト形式 Modifydata = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\n", quotechar='"', skipinitialspace=True) connect = sqlc.connect( user = Con.user(), password = Con.password(), host = Con.host(), database = Con.database(), charset = Con.charset() ) cursor = connect.cursor() #cursor.execute('LOAD DATA "C:\data\FRB_H15_Modify.csv" INTO TABLE IR_TS FIELDS TERMINATED BY "," LINES TERMINATED BY "\n"') query = "truncate table IR_DT" cursor.execute(query) query = "INSERT INTO IR_DT (TICKER,DATE,DATA) VALUES (%s, %s, %s)" cursor.executemany(query, Modifydata) except sqlc.Error as error: connect.rollback() print ("エラー",error) except Exception: e = sys.exc_info()[1] print("エラー",e.args) else: cursor.close() connect.commit() connect.close() # 編集したファイルを閉じる csv_file.close() finally: # 実行時間を測るEnd elapsed_time = time.time() - start print ("処理時間:{0}".format(elapsed_time) + "[sec]") try: # 実行時間を測るStart start = time.time() file_name = r"C:\data\FF_Rate.csv" # プロキシの設定 #上で行っているのでやらない # FFレート URL = "https://www.federalreserve.gov/datadownload/Output.aspx?rel=H15&series=8e83f7f17c5cea4d190d85ae6737639f&lastobs=&from=&to=&filetype=csv&label=omit&layout=serieslist" response = requests.get(URL, stream=True) # ファイルの保存 if response.status_code == 200: f = open(file_name, 'wb') f.write(response.content) f.close() # 編集したいファイル(元ファイル)を開く file = open(file_name,"r") # 書き出し用のファイルを開く out_file = open(r"C:\data\FF_Rate_Modify.csv","w") # 元ファイルのレコード部分をreadlinesメソッドで全行を読み取る lines = file.readlines() # for文で1行ずつ取得 for line in lines: if(line[-2:]==",\n" or line[-4:]==",ND\n"): pass else: # ダブルコーテーションでくくる word = line.split(',') line = '"' + word[0].lstrip("H15/H15/").rstrip("_N.WW") + '",' + word[1] + ',' + word[2] # 書き出し用のファイルに出力 out_file.write(line) # 2つのファイルを閉じる file.close() out_file.close() # 編集したファイルを開く csv_file = open(r"C:\data\FF_Rate_Modify.csv", "r", encoding="utf_8", errors="", newline="" ) #リスト形式 Modifydata = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\n", quotechar='"', skipinitialspace=True) connect = sqlc.connect( user = Con.user(), password = Con.password(), host = Con.host(), database = Con.database(), charset = Con.charset() ) cursor = connect.cursor() query = "INSERT INTO IR_DT (TICKER,DATE,DATA) VALUES (%s, %s, %s)" cursor.executemany(query, Modifydata) except sqlc.Error as error: connect.rollback() print ("エラー",error) except Exception: e = sys.exc_info()[1] print("エラー",e.args) else: cursor.close() connect.commit() connect.close() # 編集したファイルを閉じる csv_file.close() finally: # 実行時間を測るEnd elapsed_time = time.time() - start print ("処理時間:{0}".format(elapsed_time) + "[sec]")
以下のmysqlで作成したデータベースに格納するように作成しています。
create table IR_DT( TICKER varchar(30) not null, DATE datetime not null, DATA decimal(25, 15) not null, PRIMARY KEY(TICKER,DATE) ) ALTER TABLE IR_DT CONVERT TO CHARACTER SET utf8mb4; ALTER TABLE IR_DT ADD INDEX CD_INDEX(TICKER,DATE);
以下のSQLを使用すれば、時系列で金利が表示されるはずです。
SELECT DATE, SUM(CASE WHEN TICKER like 'RIFLGFCY01' THEN DATA ELSE 0 END) AS 'RIFLGFCY01', SUM(CASE WHEN TICKER like 'RIFLGFCY02' THEN DATA ELSE 0 END) AS 'RIFLGFCY02', SUM(CASE WHEN TICKER like 'RIFLGFCY03' THEN DATA ELSE 0 END) AS 'RIFLGFCY03', SUM(CASE WHEN TICKER like 'RIFLGFCY05' THEN DATA ELSE 0 END) AS 'RIFLGFCY05', SUM(CASE WHEN TICKER like 'RIFLGFCY07' THEN DATA ELSE 0 END) AS 'RIFLGFCY07', SUM(CASE WHEN TICKER like 'RIFLGFCY10' THEN DATA ELSE 0 END) AS 'RIFLGFCY10', SUM(CASE WHEN TICKER like 'RIFLGFCY20' THEN DATA ELSE 0 END) AS 'RIFLGFCY20', SUM(CASE WHEN TICKER like 'RIFLGFCY30' THEN DATA ELSE 0 END) AS 'RIFLGFCY30' FROM IR_DT where date = '1980/1/1' GROUP BY DATE order by DATE desc
何かわからないことがありましたらご連絡お待ちしています。
コメント