前回出力した CSV の結果をよく見てみると、いくつか修正するべき点が見つかります。
2014-04-21 None:None,None,ZA,ZAR,<font color=red>休場(家族の日)</font>,,,
2014-04-21 08:50,3,JP,JPY,3月貿易収支(通関ベース),-1兆809億円,-8025億円↓,-1兆809億円
2014-04-21 08:50,3,JP,JPY,3月貿易収支(通関ベース)<季調済>,-1兆4276億円,-1兆1840億円↓,-1兆4276億円
2014-04-21 21:30,3,US,USD,3月シカゴ連銀全米活動指数,0.20,0.53↑,0.20
2014-04-21 23:00,3,US,USD,3月景気先行指数(前月比),+0.7%,+0.5%,+0.7%
2014-04-22 14:00,2,JP,JPY,2月景気先行CI指数<確報値>,-,108.5,-
2014-04-22 14:00,2,JP,JPY,2月景気一致CI指数<確報値>,-,113.4,-
2014-04-22 18:00,2,EU,EUR,2月建設支出(前月比),-,+1.6%↑,-
2014-04-22 18:00,2,EU,EUR,2月建設支出(前年比),-,+8.0%↓,-
2014-04-22 23:00,4,US,USD,4月リッチモンド連銀製造業景況指数,2,-7,2
2014-04-22 23:00,4,US,USD,<A Href=http://www.dailyfx.co.jp/market/data/usd-data11.html>3月中古住宅販売件数</A>,456万件,460万件,456万件
2014-04-22 23:00,4,US,USD,3月中古住宅販売件数(前月比),-0.9%,-0.4%,-0.9%
2014-04-22 23:00,3,EU,EUR,4月消費者信頼感指数<速報値>,-9.3,-9.3,-9.3
2014-04-22 23:30,2,CA,CAD,オリバー加財務相講演,,,
2014-04-22 24:45,2,US,USD,バーナンキ前FRB議長講演,,,
2014-04-22 26:00,1,US,USD,米2年債入札,,,
まず明らかに直すべき箇所は
- 一行目の時刻と重要度が
None:None,None
になっているところ
- 一行目のイベント名に含まれる font タグ
- イベント名の中の a タグ
- 時刻が 24 時以上になっているイベントがある
といったところです。
また、今作っている指標フィルタの目的は、指標を避けるためのデータを提供することですから、同じ国/通貨に影響する指標で同じ日時に発表されるものは、最も重要度の高いもの一つにまとめてしまうことにします。
さらに欲を言えば、指標の種別さえ分かれば良く、それが何月の値の発表なのかはどうでもいいので、たとえば 「3月中古住宅販売件数(前月比)」 という指標ならば、「3月」 や 「(前月比)」 などの情報も削除した方が個人的にはすっきりして好みです。
None と 24 時以上の日時の修正
最初に None と出力されている箇所から修正していきます。
重要度が None の場合は、祝日などの終日イベントであることを意味するので、重要度を 0 にします。
impact = e.group(7) or '0'
こんな感じでimpact
という変数に適切な文字列を格納することが出来るでしょう。
日時のフィールドも同様に処理できますが、時間が 24 時以上になっていることがあるので、その対処も合わせて行うことにします。
・・・が、ここが意外と面倒なところで、ただ日時だけを気軽に修正してしまうと、次のような結果になります:
2014-04-24 21:30,4,US,USD,新規失業保険申請件数,+31.5万件,+30.4万件,+31.5万件
2014-04-24 21:30,2,US,USD,失業保険継続受給者数,+274.5万人,+273.9万人,+274.5万人
2014-04-25 01:15,3,EU,EUR,コンスタンシオECB副総裁講演,,,
2014-04-25 02:00,1,US,USD,米7年債入札,,,
2014-04-25 00:00,0,AU,AUD,<font color=red>休場(アンザック・デー)</font>,,,
2014-04-25 00:00,0,NZ,NZD,<font color=red>休場(アンザック・デー)</font>,,,
2014-04-25 00:00,4,US,USD,オバマ米大統領訪日(~25日),,,
2014-04-25 08:30,4,JP,JPY,3月全国CPI(前年比),+1.6%,+1.5%,+1.6%
24 日の 25:15 と 26:00 の指標が、25 日の終日イベント(時刻 00:00)よりも先に出力されていますね。
そのため、時刻が 24 時以上のイベントは、すぐさま出力せず一旦キューに積んでおき、
時刻が 24 時未満で、かつ時間的にもっと未来のイベント X
が出現したら、キューから取り出した行をX よりも先に出力する、という一工夫が必要になります。
以上を反映して、スクリプトはこんな感じになりました:
queue = []
for daily_block in daily_blocks:
date_match = re.match('\s+([0-9-]+)\s+', daily_block)
if date_match != None:
curr_datetime = datetime.datetime.strptime(date_match.group(1), '%Y-%m-%d')
matches = regex.finditer(daily_block)
for e in matches:
impact = e.group(7) or '0'
correct_hour = hour = int(e.group(2) or '00')
minute = int(e.group(3) or '00')
event_date = curr_datetime
if hour >= 24:
# 24時以上なら時間と日付を補正
correct_hour -= 24
event_date += datetime.timedelta(days=1)
line = '{0} {1:0>2}:{2:0>2},{3},{4},{5},{6},{7},{8},{9}'.format(
event_date.date(), correct_hour, minute,
impact,
country_table[e.group(4)],
currency_table[e.group(4)],
e.group(5),
e.group(9), e.group(8), e.group(9))
if hour < 24:
# 24時未満ならキューを調べる
# より過去のイベントがあればそれを先に出力
earlier_events = [x for x in queue if x < line]
for earlier_event in earlier_events:
print(earlier_event)
print(line)
# キューから処理済みのエントリを除去
queue = [x for x in queue if x >= line]
else:
# 24時以上なら出力せずキューに追加
queue.append(line)
# キューに残っている行があれば出力
for queue_line in queue:
print(queue_line)
スクリプト全体はこちら:
DailyFxCalendarToCsv.py 4KB
6 ダウンロード
次は、イベント/指標のタイトルに時々含まれている font や a タグを取り除く予定です。