FRANKFURT – The European Central Bank left rates unchanged Thursday as expected, and a surprisingly strong rise in US inflation last month had traders and analysts adjusting forecasts for monetary policy moves on this side of the Atlantic.
The ECB statement on the latest decision said if various factors were to further increase the governing council’s confidence that inflation is converging to its 2% target over the medium term in a sustained manner, “it would be appropriate to reduce the current level of monetary policy restriction.”
This point – and screengrabs thereof – led to a flurry of tweets by analysts predicting the bank is headed for a rate cut in June. Writing on the social media platform X; Danske Bank’s Piet Haines Christiansen wrote:“ECB gives quite explicit indication of coming rate cut in June – unless they are surprised. No rate cut size given.”
In a note, ING’s Carsten Brzeski said: “Even if the policy announcement does not explicitly mention June as the moment for a first rate cut, we think that today’s meeting should mark the final stop before the cut. In fact, the ECB has gone through a very gradual transition of its communication since December, turning from hawkish to dovish.”
Capital Economics added, “The ECB’s decision to update its guidance suggests that an interest rate cut at the next meeting in June is very likely. We forecast 100 basis points of cuts this year, which is more than is discounted in the market.”
The decision to hold came after headline annual consumer price growth in the euro area last month fell to 2.4%, a tenth of a percentage point below the estimate. During the press conference, ECB President Christine Lagarde said inflation was set to meet the bank’s target in mid-2025, further bolstering the chances for a rate cut in six weeks.
The euro lost ground against the greenback following the announcement, but it rose to pre-release levels as the session continued following the announcement of better-than-expected US jobs data.
Not plotting a path, thank you
Lagarde refused to be baited into providing a roadmap for the next ECB steps during the post-decision press conference. She said the bank will follow “a data-dependent, meeting-by-meeting approach” and not set a timetable for policy changes.
“In June we know we will get a lot more information and a lot more data,” Lagarde said, reiterating her position from March. She added that there will also be new projections, including not only those from the ECB staff, but also from the entire Eurosystem, which includes central banks in countries that have adopted the euro.
Although Lagarde was unwilling to commit the bank to a June rate cut, she suggested that some decisionmakers are ready to go for it and wanted to lower rates this week. “Truth be told, a few members felt sufficiently confident”. But she said they “agreed to rally to the consensus” for another rate hold.
While consumer price growth appears to be on the wane, Lagarde warned of possible trouble ahead. “We know there will not be a linear decline in inflation over the next months.”
And it could once again be the energy market that causes further consternation for rate-setters. Speaking with Bloomberg TV before Thursday’s rate hold, Rabobank’s Jane Foley warned that rising oil prices could limit the ECB’s ability to act as concerns remain about Germany’s moribund economy.
“Oil prices really have to be brought into the equation over the next weeks and months,” she said, noting that higher prices might not stop an ECB interest rate cut in June, but they could impact the number and size of expected reductions in borrowing costs in the Eurozone, various G10 countries, and in other high-income nations.
Lagarde said the bank has learned from the recent shocks about the effects of energy prices. “We look at how futures evolve,” she added after noting that the oil market may play a role in upcoming fluctuations in consumer price growth.
Not my circus
The ECB president said euro area monetary policymakers will set their own course – dependent on data, of course – and she declined multiple times to comment on possible moves to be taken by other central banks.
The questions followed Wednesday's report of an unexpectedly strong increase in US headline inflation to 3.5% in March versus the 3.4% estimate and 3.2% in the previous month. This has analysts, such as those a Goldman Sachs, shifting their forecast for the first Fed rate cut of the cycle to July from June and lowering their projections for the total reduction in US borrowing rates this year.
The surprising pace of the US upswing also had traders backtracking on their bets for ECB rate hikes. Although the latest money market data showed a lower likelihood for a reduction in June compared to earlier this week, the chance remained at around 70%, according to market data.
“Yesterday’s US inflation print will have been a good reminder to the central bank that reflation will always be a risk, Brzeski noted. “In fact, still high services inflation and the recent surge in oil prices, as well as wage developments in Germany, suggest that the risk of inflation reaccelerating is also a reality in the Eurozone.”
/*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; }
}
- Lagarde: Inflation to decline to target in mid-2025
- Some officials appeared ready to lower rates now
- Strong US CPI Hits ECB cut expectations
- Oil prices remain a concern
By Eric Culp
European Editor, LiveSquawk News
@EricCulpLS
11 March 2024 | 14:45 GMT
FRANKFURT – The European Central Bank left rates unchanged Thursday as expected, and a surprisingly strong rise in US inflation last month had traders and analysts adjusting forecasts for monetary policy moves on this side of the Atlantic.
The ECB statement on the latest decision said if various factors were to further increase the governing council’s confidence that inflation is converging to its 2% target over the medium term in a sustained manner, “it would be appropriate to reduce the current level of monetary policy restriction.”
This point – and screengrabs thereof – led to a flurry of tweets by analysts predicting the bank is headed for a rate cut in June. Writing on the social media platform X; Danske Bank’s Piet Haines Christiansen wrote:“ECB gives quite explicit indication of coming rate cut in June – unless they are surprised. No rate cut size given.”
In a note, ING’s Carsten Brzeski said: “Even if the policy announcement does not explicitly mention June as the moment for a first rate cut, we think that today’s meeting should mark the final stop before the cut. In fact, the ECB has gone through a very gradual transition of its communication since December, turning from hawkish to dovish.”
Capital Economics added, “The ECB’s decision to update its guidance suggests that an interest rate cut at the next meeting in June is very likely. We forecast 100 basis points of cuts this year, which is more than is discounted in the market.”
The decision to hold came after headline annual consumer price growth in the euro area last month fell to 2.4%, a tenth of a percentage point below the estimate. During the press conference, ECB President Christine Lagarde said inflation was set to meet the bank’s target in mid-2025, further bolstering the chances for a rate cut in six weeks.
The euro lost ground against the greenback following the announcement, but it rose to pre-release levels as the session continued following the announcement of better-than-expected US jobs data.
Not plotting a path, thank you
Lagarde refused to be baited into providing a roadmap for the next ECB steps during the post-decision press conference. She said the bank will follow “a data-dependent, meeting-by-meeting approach” and not set a timetable for policy changes.
“In June we know we will get a lot more information and a lot more data,” Lagarde said, reiterating her position from March. She added that there will also be new projections, including not only those from the ECB staff, but also from the entire Eurosystem, which includes central banks in countries that have adopted the euro.
Although Lagarde was unwilling to commit the bank to a June rate cut, she suggested that some decisionmakers are ready to go for it and wanted to lower rates this week. “Truth be told, a few members felt sufficiently confident”. But she said they “agreed to rally to the consensus” for another rate hold.
While consumer price growth appears to be on the wane, Lagarde warned of possible trouble ahead. “We know there will not be a linear decline in inflation over the next months.”
And it could once again be the energy market that causes further consternation for rate-setters. Speaking with Bloomberg TV before Thursday’s rate hold, Rabobank’s Jane Foley warned that rising oil prices could limit the ECB’s ability to act as concerns remain about Germany’s moribund economy.
“Oil prices really have to be brought into the equation over the next weeks and months,” she said, noting that higher prices might not stop an ECB interest rate cut in June, but they could impact the number and size of expected reductions in borrowing costs in the Eurozone, various G10 countries, and in other high-income nations.
Lagarde said the bank has learned from the recent shocks about the effects of energy prices. “We look at how futures evolve,” she added after noting that the oil market may play a role in upcoming fluctuations in consumer price growth.
Not my circus
The ECB president said euro area monetary policymakers will set their own course – dependent on data, of course – and she declined multiple times to comment on possible moves to be taken by other central banks.
The questions followed Wednesday's report of an unexpectedly strong increase in US headline inflation to 3.5% in March versus the 3.4% estimate and 3.2% in the previous month. This has analysts, such as those a Goldman Sachs, shifting their forecast for the first Fed rate cut of the cycle to July from June and lowering their projections for the total reduction in US borrowing rates this year.
The surprising pace of the US upswing also had traders backtracking on their bets for ECB rate hikes. Although the latest money market data showed a lower likelihood for a reduction in June compared to earlier this week, the chance remained at around 70%, according to market data.
“Yesterday’s US inflation print will have been a good reminder to the central bank that reflation will always be a risk, Brzeski noted. “In fact, still high services inflation and the recent surge in oil prices, as well as wage developments in Germany, suggest that the risk of inflation reaccelerating is also a reality in the Eurozone.”