LS Focus On The Week Ahead
Key Events

It is a busy week for interest rate decisions, with monetary policy announcements due from the US Federal Reserve, Bank of England, Norges Bank, Riksbank and others.

Monday is a bank holiday in the UK.

From Tuesday, European central bankers will convene at the annual Banco de Portugal-European Central Bank Governing Council retreat, which runs until 7 May.

Minutes from the Bank of Japan’s March policy meeting are scheduled for release on 8 May.

Over the weekend, voters in Singapore and Australia returned both incumbent parties to power in landslide victories.

In a boost for the US administration and Treasury market, media reports said Tokyo had given assurances it would not use the sale of US bond holdings as leverage in ongoing tariff negotiations.

Monday 12 May

Speakers: BoE’s Lombardelli, Taylor, Greene, Mann | Fed’s Kugler

Tuesday 6 May

22:45 – NZ Q1 Household Labour Force Survey
Consensus: Q/Q Employment change 0.1% (prev -0.1%)

Commonwealth Bank of Australia said, “In the overall employment levels are expected to remain little changed over Q1, with firms still gun-shy on hiring. Modest increases in the labour force (driven by easing labour force participation and modest working age population growth) are expected to push the unemployment rate slightly higher to 5.2%, its highest in 4½ years. The unsettled and uncertain local and global scene and soft domestic demand are expected to contribute to subdued hiring over much of the year until strengthening domestic activity feeds through into more hiring. Low growth in the labour force will dampen the peak in the unemployment rate (in the low 5s for much of 2025), with the unemployment rate subsequently easing."

Speakers: ECB’s Panetta | SNB’s Schlegel 

Wednesday 7 May

06:00 - Sweden Apr CPI (Fash)
Consensus: Y/Y 0.5% (prev 0.5%)

Danske noted that the same morning as the Riksbank conducts its monetary policy meeting, preliminary inflation numbers for April are set to be released. “We expect CPI at +0.4% y/y, CPIF at 2.5% y/y and CPIF ex Energy at 3.2%. This can be compared to the Riksbank forecasts of CPI +0.5% y/y, CPIF +2.3% y/y and CPIFxE +3.2%, respectively, which is relatively close to our own assessment.”

06:00 - Germany Mar Industrial Orders
Consensus: M/M 1.0% (prev 0.0%)

Daiwa posited that German new factory orders data will likely suggest that underlying goods demand remained subdued in March as economic uncertainties surrounding global trade policies mounted.

18:00 - FOMC May Interest Rate Decision
Consensus: On Hold (prev 4.25% - 4.50%)
 
Barclays said it anticipates the FOMC will hold policy for a third consecutive meeting in May. “We expect adjustments to the first paragraph of the statement to give a nod to the slight decline in measured GDP in Q1 but note that consumer spending and fixed investment continued to expand at a solid pace. We also expect the committee to add new language that notes increases in some market- and survey-based measures of near-term inflation, as well as survey measures showing declines in sentiment and elevated uncertainty about the outlook on the part of households and businesses. We do not expect any adjustments to forward guidance, which currently makes policy moves contingent on data and policy developments. Given the uncertainties, we would be very surprised if Powell, or the statement, explicitly cited the possibility of a June cut.”

21:30 - Brazil May Selic Interest Rate Decision
Consensus: 50bps Hike (prev 14.25%)

JPMorgan said Brazil’s central bank stood out in early 2025 for its aggressive tightening cycle, but signs point to an imminent shift in stance, making Wednesday’s COPOM decision the main event of the week. The bank maintains its view that the BCB will deliver a final 50 basis point hike to counter persistent inflationary pressures. However, recent comments from board members suggest a more cautious approach may be on the table. Policymakers have signalled a preference for a gradual path, citing uncertainty over the outlook, which could mean a 25 basis point increase next week, followed by a similar move in June.

Speakers:  Fed's Powell | SNB’s Tschudin

Thursday 8 May

07:30 – Riksbank May Interest Rate Decision
Consensus: On Hold (prev 2.25%)

Danske Bank said, “We expect the Riksbank to keep the rate unchanged at 2.25% due to the uncertain inflation outlook. It is a smaller Riksbank meeting without new macroeconomic projections, but we expect the Riksbank to highlight the high level of uncertainty.”

08:00 - Norges Bank May Interest Rate Decision
Consensus: On Hold (prev 4.50%)

Danske said it expected Norges Bank (NB) to keep the policy rate unchanged at 4.5% at its monetary policy meeting this week, in line with signals given at the March meeting. "We do not expect NB to give any clear signals as to whether the rate outlook has changed since March, when they signalled the first cut in September, but with about a 25% probability of a cut in June."

12:00 - BoE May Interest Rate Decision
Consensus: 25bps Cut (prev 4.50%)

Analysts at BofA forecast the Bank of England (BoE) to cut the bank rate by 25 basis points from 4.50% to 4.25% at this week's meeting. "We expect a vote of 8-1, with Dhingra voting for a 50bps cut. There are risks of a more dovish voting pattern, but with Taylor/ Ramsden becoming more cautious, we see it as a risk case rather than a base case. Mann could once again surprise by voting for a 50bps cut (after a 50bps cut vote in February and no cut vote in March). We interpreted her 50bps cut in February as a one-off and not a sign of a continued dovish stance, but with tariff growth risks lingering, her activist strategy might prompt her to vote for a 50bps cut once again."

Speakers: BoE's Bailey | Norges' Bache | Riksbank's Thedéen

Friday 9 May

12:30 - Canada Net change in employment
Consensus: 2.5k (prev -32.6k)

BMO Capital Markets Benjamin Reitzes noted that the tariff chaos of early April, combined with tariffs already in place on steel/aluminium and non-USMCA products, likely weighed on the Canadian economy and labour market. “The uncertainty alone is enough to prompt many businesses to pause hiring, with some downsizing in tariff-hit sectors. However, the headline figure will probably be a bit misleading as the federal election hiring will provide a solid lift (we’re estimating around a 25k boost). Unfortunately, even with that one-off positive, the unemployment rate is poised to rise another notch to 6.8%. The latter would be more indicative of the direction of the labour market, especially with labour force growth decelerating. Watch hours worked, as that could provide a glimpse of how the broader economy fared in the month. Lastly, the slowing in wage growth could stall for a month as April 2024 was soft,” posited the economist."

Speakers: ECB’s Rehn, Simkus| BoE’s Bailey, Pill | Fed’s Williams, Barr, Kugler, Goolsbee, Waller

TUESDAY US Mar Trade Balance  (12:30)  The gap is set to widen for the month when US tariffs on foreign steel and aluminum began, with the headline reading expected at USD -129.0 bn following USD -122.7 bn in February.    Canada Mar Trade Balance  (12:30)  With Canada serving as a major focus of US trade policy ire, one analyst expected March’s shortfall to be around the CAD 1.52 bn drop in February, with another estimating the deficit at some CAD 2 bn.WEDNESDAY Fed Rate Decision  (18:00)  April’s unexpectedly strong result for non-farm payrolls has most likely guaranteed specifically what US President Donald Trump says he doesn’t want: Another rate hold from the Federal Reserve. Analysts were predicting that officials at the US central bank will keep the rate range at 4.25%-4.50%, a move bound to crank up the protestation machine in the White House. A move lower was unlikely before the jobs data, with officials in wait-and-see mode due to the erratic nature of US trade and other policies under the current Trump administration.THURSDAY German Mar Trade Balance  (06:00)  The surplus in Europe’s largest economy is forecast at EUR 19.0 bn versus EUR 17.7 bn in February. How about that frontloading, folks?   BoE Rate Decision (11:00)  A quarter-point cut to bring the benchmark rate to 4.25% is on the cards, analysts said, noting that a slowdown in inflation and multiplying growth concerns warrant softer monetary policy from UK central bankers, especially considering the shifts in US trade policy.FRIDAY  China Apr Trade Balance (03:00)  Another top target of Washington’s import levies, China is forecast to report a surplus of only USD 88.8 bn versus USD 102.6 bn in March as tariffs bite.   Canada Apr Jobless Data  (12:30)  Employment is expected to climb 22.5K versus the fall of 32.6K in March, the first drop since January 2022. CIBC called for an increase of 10K. This would nudge the jobless rate to 6.8% from February’s 6.7% –the latter is also the market forecast.
All Times GMT
/*jshint esversion: 6 */ var socket; var assigned_server = 3001; var distributor_server = 3010; var publisher_channel = ''; var broadcaster_channel = ''; var remote_ip = ''; var session_info = {}; var logging_interval; var logging_interval_time = 120000; var socket_emits = 0; var session_start_time; var reconnectionDelayGrowFactor = 1.2; var reconnection_delay = 1000; var playing = false; var connected_to_assigned = false; var socket_close_timeout; var player_disconnected_annoucement_play_delay = 1500; var player_disconnected_annoucement_play_timeout = null; self.onmessage = function (msg) { switch(msg.data.action) { case 'Reactivate': reactivate(); break; case 'ConnectDistributor': connect_to_distributor(msg); break; case 'SessionStaticInfo': session_static_info(msg); break; case 'SessionInfo': update_session_info(msg.data); break; case 'PauseLogging': clearTimeout(logging_interval); break; case 'RestartLogging': postMessage({action: 'RequestSessionStaticInfo' }); break; case 'JoinPublisherChannel': join_publisher_channel(msg.data); break; case 'JoinPlayerChannel': join_player_channel(msg.data); break; case 'CheckChannelStatus': check_channel_status(msg.data); break; case 'PlayerLogResponse': player_log_response(msg.data); break; case 'CloseSocket': close_socket(); break; case 'RequestMessageSearch': request_message_search(msg.data); break; case 'RequestMoreMessages': request_more_messages(msg.data); break; case 'PlayerDisconnectedAnnoucementTimeoutStart': player_disconnected_annoucement_timeout_start(); break; case 'PlayerDisconnectedAnnoucementTimeoutClear': player_disconnected_annoucement_timeout_clear(); break; } }; function player_disconnected_annoucement_timeout_clear() { clearTimeout(player_disconnected_annoucement_play_timeout); player_disconnected_annoucement_play_timeout = null; } function player_disconnected_annoucement_timeout_start() { player_disconnected_annoucement_play_timeout = setTimeout(function() { send_play_disconnect_annoucement(); }, player_disconnected_annoucement_play_delay ); } function send_play_disconnect_annoucement() { postMessage({action: "PlayDisconnectAnnoucement"}); } function reactivate() { playing = false; connect_to_assigned_server(); } function player_log_response(data) { var data_array = {}; data_array.type = 'PlayerLogResponse'; data_array.respond_to_socket_final = data.respond_to_socket_final; data_array.respond_to_socket = data.respond_to_socket; data_array.player_socket_id = data.player_socket_id; data_array.logs = data.logs; var msg_string = JSON.stringify(data_array); if (socket.readyState == 1) { socket.send(msg_string); } } function request_message_search(data) { var data_array = {}; data_array.type = 'request_message_search'; data_array.publisher_channel = data.publisher_channel; data_array.search_term = data.search_term; var msg_string = JSON.stringify(data_array); if (socket.readyState == 1) { socket.send(msg_string); } } function request_more_messages(data) { var data_array = {}; data_array.type = 'request_more_messages'; data_array.publisher_channel = data.publisher_channel; data_array.last_record_id = data.last_record_id; var msg_string = JSON.stringify(data_array); if (socket.readyState == 1) { socket.send(msg_string); } } function check_channel_status(data) { var data_array = {}; data_array.type = 'check_channel_status'; data_array.app_name = data.app_name; var msg_string = JSON.stringify(data_array); if (socket.readyState == 1 && connected_to_assigned) { socket.send(msg_string); } else { setTimeout(function() { check_channel_status(data); },500); } } function check_channel_status_response(data) { postMessage({ action: 'CheckChannelStatusReponse', stream_status: data.stream_status.status, onair: data.stream_status.onair, connected: data.stream_status.connected }); } function join_publisher_channel(data) { var data_array = {}; data_array.type = 'join_publisher_channel'; if (typeof data.api_key !== 'undefined') { data_array.api_key = data.api_key; } else { data_array.publisher_channel = data.publisher_channel; data_array.username = data.username; data_array.subscriber_group = data.subscriber_group; data_array.display_name = data.display_name; data_array.single_sign_on = data.single_sign_on; data_array.remote_ip = data.remote_ip; data_array.http_referrer = data.http_referrer; data_array.current_page = data.current_page; data_array.php_session_id = data.php_session_id; data_array.from_react = data.from_react; } var msg_string = JSON.stringify(data_array); if (socket.readyState == 1) { socket.send(msg_string); } postMessage({action: 'PublisherChannelJoined' }); } function session_static_info(msg) { set_static_session_info(msg.data); start_log(); } function connect_to_distributor(msg) { publisher_channel = msg.data.publisher_channel; remote_ip = msg.data.remote_ip; socket = new WebSocket("wss://ws.livesquawk.com/ws"+distributor_server); socket.onopen = function(event) { request_server_assignment(); }; socket.onmessage = function(event) { var msg_string = event.data.toString(); var data = JSON.parse(msg_string); switch(data.type) { case 'server_assignment_response': server_assignment_response(data); break; } }; } function session_info_interval() { postMessage({action: 'RequestSessionInfo' }); logging_interval = setTimeout(session_info_interval,logging_interval_time); } function server_assignment_response(data) { assigned_server = data.selected_server; socket.close(); connect_to_assigned_server(); } function request_server_assignment() { var data_array = {}; data_array.type = 'request_server_assignment'; var msg_string = JSON.stringify(data_array); if (socket.readyState == 1) { socket.send(msg_string); } } function connect_to_assigned_server() { socket = new WebSocket("wss://ws.livesquawk.com/ws"+assigned_server); socket.onopen = function(event) { postMessage({ action: 'VisibleConsole',console_string: "Connected to server "+assigned_server }); console.log("Connected to server "+assigned_server); postMessage({ action: 'ConnectedToAssigned' }); connected_to_assigned = true; if (playing) { postMessage({ action: 'RejoinPlayerChannel' }); } }; socket.onmessage = function(event) { var msg_string = event.data.toString(); var data = JSON.parse(msg_string); if (data.type != 'server_ping') { /* console.log(data.type); */ } switch(data.type) { case 'reconnect': postMessage({ action: 'VisibleConsole',console_string: "Reconnected" }); break; case 'reload': postMessage({ action: 'Reload' }); break; case 'start_log_response': start_log_response(data); break; case 'application_refresh_start': application_refresh_start(data); break; case 'application_refresh_stop': application_refresh_stop(data); break; case 'player_log_request': case 'check_channel_status_response': check_channel_status_response(data); break; case 'PlayerLogRequest': case 'new_tweet': case 'new_latest_news': case 'delete_report': case 'add_report': case 'add_ref_doc': case 'calendar_change': case 'calendar_insert': case 'calendar_delete': case 'new_note': case 'AppStart': case 'AppStop': case 'BroadcasterStarted': case 'BroadcasterStopped': case 'added_cme_report': case 'updated_cme_report': case 'added_cme_commentary': case 'updated_cme_commentary': case 'server_assignment_response': case 'initial_messages': case 'message_categories': case 'more_messages': case 'matched_messages': pass_straight_to_post_message(data); break; case 'output': case 'server_ping': case 'reconnect': case 'disconnect': break; } }; socket.onerror = function(event) { postMessage({ action: 'VisibleConsole',console_string: "LS Socket Error" + event.type }); console.log(event); postMessage({ action: 'LSSocketConnectionError' }); }; socket.onclose = function(event) { console.log('Socket is closed. Reconnect will be attempted in 1 second.', event.reason); socket_close_timeout = setTimeout(connect_to_assigned_server, reconnection_delay); reconnection_delay = reconnection_delay*reconnectionDelayGrowFactor; connected_to_assigned = false; }; } function close_socket() { clearTimeout(socket_close_timeout); socket_close_timeout = null; socket.onclose = function(event) {}; socket.onmessage = function(event) {}; socket.onerror = function(event) {}; socket.close(1000); console.log('Socket Closed'); } function pass_straight_to_post_message(data) { data.action = data.type; postMessage(data); } function join_player_channel(data) { var data_array = {}; data_array.type = 'join_player_channel'; data_array.player_channel = data.player_channel; data_array.remote_ip = data.remote_ip; data_array.username = data.username; data_array.app_name = data.app_name; data_array.onair_status = data.onair_status; data_array.http_referrer = data.http_referrer; data_array.current_page = data.current_page; data_array.php_session_id = data.php_session_id; var msg_string = JSON.stringify(data_array); if (socket.readyState == 1) { socket.send(msg_string); } postMessage({action: 'PlayerChannelJoined' }); playing = true; } function start_log_response(data) { session_info.session_id = data.log_record_id; session_info_interval(); } function application_refresh_start(data) { if (data.app_name == session_info.application_name) { postMessage({action: 'ApplicationRefreshStart' }); } } function application_refresh_stop(data) { if (data.app_name == session_info.application_name) { postMessage({action: 'ApplicationRefreshStop' }); } } function set_static_session_info(data) { session_info.browser_codename = data.browser_codename; session_info.browser_name = data.browser_name; session_info.user_agent = data.user_agent; session_info.browser_version = data.browser_version; session_info.cookies_enabled = data.cookies_enabled; session_info.platform = data.platform; session_info.player_version = data.player_version; session_info.stream = data.stream; session_info.connection_protocol = data.protocol; session_info.delay_target = data.delay_target; session_info.session_email = data.session_email; session_info.remote_ip = data.remote_ip; session_info.php_session_id = data.php_session_id; session_info.application_name = data.application_name; session_info.http_referrer = data.http_referrer; } function start_log() { var session_start_date = new Date(); session_start_time = session_start_date.getTime(); var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; var session_start_date_string = session_start_date.getDate() + " " + months[session_start_date.getMonth()] + " " + session_start_date.getFullYear(); var data_array = {}; data_array.type = 'webrtc_start_log'; data_array.remote_ip = session_info.remote_ip; data_array.username = session_info.session_email; data_array.php_session_id = session_info.php_session_id; data_array.webrtc_protocol = ''; data_array.session_start_time = (session_start_time/1000).toFixed(0); data_array.stream_name = session_info.stream; data_array.session_start_date = session_start_date_string; var msg_string = JSON.stringify(data_array); if (socket.readyState == 1) { socket.send(msg_string); } } function update_session_info(data) { var data_array = {}; var msg_string = ''; var current_date = new Date(); var current_time = current_date.getTime(); session_info.protocol = data.protocol; session_info.curr_delay = (data.effective_latency / 1000).toFixed(2); session_info.session_length = current_time - session_start_time; session_info.ping_time = data.ping_time; session_info.jitter = data.jitter; session_info.packet_loss = data.packet_loss; session_info.effective_latency = data.effective_latency; session_info.mean_opinion_score = data.mean_opinion_score; session_info.restarts = data.restarts; if (socket_emits == 0) { data_array = {}; data_array.type = 'webrtc_log_data_full'; data_array.connection_protocol = session_info.protocol; data_array.threshold = 0; data_array.curr_delay = session_info.curr_delay; data_array.session_length = session_info.session_length; data_array.date = current_time; data_array.browser_codename = session_info.browser_codename; data_array.browser_name = session_info.browser_name; data_array.user_agent = session_info.user_agent; data_array.browser_version = session_info.browser_version; data_array.cookies_enabled = session_info.cookies_enabled; data_array.platform = session_info.platform; data_array.player_version = session_info.player_version; data_array.stream = session_info.stream; data_array.restarts = session_info.restarts; data_array.delay_target = 0; data_array.op_sys = ''; data_array.flash_version = ''; data_array.remote_ip = session_info.remote_ip; data_array.http_referrer = session_info.http_referrer; data_array.php_session_id = session_info.php_session_id; data_array.user_email = session_info.session_email; data_array.webrtc_protocol = session_info.protocol; data_array.ping_time = session_info.ping_time; data_array.jitter = session_info.jitter; data_array.packet_loss = session_info.packet_loss; data_array.effective_latency = session_info.effective_latency; data_array.mean_opinion_score = session_info.mean_opinion_score; data_array.session_id = session_info.session_id; msg_string = JSON.stringify(data_array); if (socket.readyState == 1) { socket.send(msg_string); } } else { data_array = {}; data_array.type = 'webrtc_log_data'; data_array.session_id = session_info.session_id; data_array.php_session_id = session_info.php_session_id; data_array.connection_protocol = session_info.protocol; data_array.restarts = session_info.restarts; data_array.threshold = 0; data_array.curr_delay = session_info.curr_delay; data_array.session_length = session_info.session_length; data_array.date = current_time; data_array.webrtc_protocol = session_info.protocol; data_array.ping_time = session_info.ping_time; data_array.jitter = session_info.jitter; data_array.packet_loss = session_info.packet_loss; data_array.effective_latency = session_info.effective_latency; data_array.mean_opinion_score = session_info.mean_opinion_score; data_array.stream = session_info.stream; msg_string = JSON.stringify(data_array); if (socket.readyState == 1) { socket.send(msg_string); } } socket_emits++; if (socket_emits == 100) { socket_emits = 0; } }