前回の記事では、30年もの国債のデータを抜き出した。今度は、FF金利-30年もの国債までのデータを抜き出せるようにしたい。
データの公表体制
データのurlを並べると、次のようになっている。
FF金利:https://www.federalreserve.gov/feeds/Data/H15_H15_RIFSPFF_N.B.XML
1ヶ月もの:https://www.federalreserve.gov/feeds/Data/H15_H15_RIFLGFCM01_N.B.XML
1年もの:https://www.federalreserve.gov/feeds/Data/H15_H15_RIFLGFCY01_N.B.XML
30年もの:https://www.federalreserve.gov/feeds/Data/H15_H15_RIFLGFCY
とすると、URLはfederalreserve.gov/feeds/Data/H15_H15_RIFまでは共通で、そこから、FF金利は"SPFF_N.B.XML"、国債は、1年未満のものはLGFCM0+(残存月数)_N.B.XMLで、10年未満のものはLGFCY0+(残存年数)_N.B.XML、それ以上のものはLGFCM+(残存年数)+_N.B.XMLとなっていることがわかった。これでコードがかけそうだ。
コーディング
URL生成関数
さて、URLの規則性がわかったところで、コーディングを始めていこう。まずは、さっき見つけた規則性に則ってURLを生成する関数を作った。色々悩んだが、センスのない条件分岐で妥協した。想定外のデータが入力されるとシステムが止まるようにしている。
def url_adjust(text):
if text=="FF":
adjText="SP"+text
elif text in {"M01" ,"M03","M06","Y01","Y02","Y03","Y05","Y10","Y20","Y30"}:
adjText="LGFC"+text
else:
sys.exit()
return adjText
金利の取得
前回のコードを関数にして少し改良してみた。
def get_rate(data):
text=url_adjust(data)
url= "https://www.federalreserve.gov/feeds/Data/H15_H15_RIF"+ text + "_N.B.XML"
res=req.urlopen(url)
soup=BeautifulSoup(res,"lxml")
d=soup.item
return d.find("cb:value").string
get_rateに期日を入れると、その期日の金利が取得できるようになっている。関数を何度も呼び出すのも面倒なので、リストとforを使ってコードを短くした。また、現在データはstring型で定義されているが、今後データベースに放り込みたいと思っているので、floatで数値に直し、リストに放り込むかたちにした。
import urllib.request as req
from bs4 import BeautifulSoup
def get_rate(data):
text=url_adjust(data)
url= "https://www.federalreserve.gov/feeds/Data/H15_H15_RIF"+ text + "_N.B.XML"
res=req.urlopen(url)
soup=BeautifulSoup(res,"lxml")
d=soup.item
return d.find("cb:value").string
def url_adjust(text):
if text=="FF":
adjText="SP"+text
elif text in {"M01" ,"M03","M06","Y01","Y02","Y03","Y05","Y10","Y20","Y30"}:
adjText="LGFC"+text
else:
sys.exit()
return adjText
Namelist=["FF","M01","M03","M06","Y01","Y02","Y03","Y05","Y10","Y20","Y30"]
rateList=[]
for Namelist in Namelist:
rateList.append(float(get_rate(Namelist)))
print(rateList)
出力:[1.69, 1.67, 1.82, 2.01, 2.21, 2.44, 2.58, 2.77, 2.92, 3.01, 3.11]
※日によって変わります
これでほしいデータを全て取得することができた。次はクローリングでデータベース化していきたい。