LoginSignup
2
1

More than 5 years have passed since last update.

FRBの金利データをRSSから抜き出してみる-2

Last updated at Posted at 2018-04-21

 前回の記事では、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]
※日によって変わります

これでほしいデータを全て取得することができた。次はクローリングでデータベース化していきたい。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1