FRANKFURT – The European Central Bank reduced borrowing costs in the Eurozone Thursday with a widely expected interest rate cut amid ongoing economic weakness in the currency area.
Despite the growth concerns, bank officials remained cagy on the next steps for euro area monetary policy. At a press conference following the announcement of the rate cuts, ECB President Christine Lagarde said, “We are not pre-committing to a particular rate path.”
The lack of information about the upcoming plans of the Frankfurt-based bank was generally expected by analysts. Lagarde repeated the bank will decide monetary policy with a “data-dependent, meeting-by-meeting approach.”
The Eurozone’s lender of last resort announced a 25-basis point reduction for its benchmark deposit to 3.5%. To adhere to plans for narrowing its interest rate corridor presented in March, the ECB lowered the main refinancing rate 60bp to 3.65%, or 15bp above the deposit rate instead of 50bp. Officials decreased the marginal rate 60bp to 3.90% to the new range of 25bp above the refinancing rate.
Following the announcement, traders cut their expectations for further rate cuts this year to 36bp from more than 60bp prior to the news. However, the chance of an October reduction rose to just above 50%, with 25bps of easing priced in for December.
EUR/USD took a bid on the rate moves and continued higher during the press conference.
“The ECB cut the deposit rate by 25bp, thus confirming the quarterly pace of cuts,” Nordea wrote. “We think this pace will be maintained, and still see the deposit rate at 2.25% at the end of next year. Financial markets are pricing in faster and steeper cuts.”
Following Thursday’s announcement, traders were still predicting the ECB would arrive at 2.0% in July 2025. Goldman Sachs recently knocked 25bps from its forecast for the bank’s terminal rate, lowering it to 2.0%.
Central banks in many major economies have been cutting interest rates. The US Federal Reserve is expected to finally join the crowd next week.
The ECB reduced its growth forecasts from June (white). Source: European Central Bank
Inflation on the run?
In a statement, the ECB said based on its “updated assessment of the inflation outlook, the dynamics of underlying inflation and the strength of monetary policy transmission, it is now appropriate to take another step in moderating the degree of monetary policy restriction.”
September forecasts unveiled Thursday for annual headline consumer price growth in the euro area were repeats of the bank’s June projections. The ECB said it expects inflation of 2.5% this year, 2.2% next year, and 1.9% in 2026.
Price growth fell to 2.2% last month, according to the EU statistics office Eurostat, a rate near the bank’s target of 2.0% over the medium term. Lagarde warned that inflation could tick up later this year before resuming its decline.
The bank did raise its expectations for the core rate, which excludes energy and food, by one-tenth of a percentage point for 2024 and 2025 to 2.9% and 2.3% respectively. It held the 2026 forecast at 2.0%. Eurostat reported a decline in core inflation to 2.8% last month from 2.9% in July.
While wages have climbed, adding to inflation, Lagarde said, “The overall growth in labour costs is moderating.”
It’s the economy, you know who
While inflation generally seems to be moving in direction that officials desire, the bank lowered its projections for GDP growth by a tenth of a percentage point for this year and the next two. The 2024 estimate was thus reduced to 0.8%, with ‘25 and ’26 set for 1.3% and 1.5% respectively.
“The risks to economic growth remain tilted to the downside,” Lagarde warned.
While not mentioned specifically, Germany has become a problem. Europe’s largest economy, responsible for nearly 30% of euro area GDP, contracted in the second quarter, and the country’s Ifo economic institute last week slashed its expectations for German growth this year to zero from 0.4%.
And with weak manufacturing and construction in Germany and the Eurozone as whole, the hope is reduced borrowing rates will boost both sectors.
But Lagarde did admit there was “lag” between changes in monetary policy and results on the ground. In other words, when and if the ECB can coax economic improvement remains to be seen.
Illimar Mattus co-founder of Tickmill and founder of The Trading Pit, noted that the war in Ukraine is “draining a lot of capital from Europe.” Speaking from Spain during LiveSquawk’s ECB interest rate preview, the Estonian said: “A lot of governments in Europe are spending a lot of money on war efforts, and to a large extent, these efforts are not going to result in much more productivity for the whole economy.”
Sign up for LiveSquawk and receive a discount with the code LSQEC$
/*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; }
}
- Deposit rate lowered 25bps
- Refinancing, marginal rates reduced 60bp
- Traders bet on further decreases
- Headline inflation forecasts unchanged
- Growth concerns spur policy speculation
By Eric Culp
European Editor, LiveSquawk News
@EricCulpLS
12 September 2024 | 15:15 GMT
FRANKFURT – The European Central Bank reduced borrowing costs in the Eurozone Thursday with a widely expected interest rate cut amid ongoing economic weakness in the currency area.
Despite the growth concerns, bank officials remained cagy on the next steps for euro area monetary policy. At a press conference following the announcement of the rate cuts, ECB President Christine Lagarde said, “We are not pre-committing to a particular rate path.”
The lack of information about the upcoming plans of the Frankfurt-based bank was generally expected by analysts. Lagarde repeated the bank will decide monetary policy with a “data-dependent, meeting-by-meeting approach.”
The Eurozone’s lender of last resort announced a 25-basis point reduction for its benchmark deposit to 3.5%. To adhere to plans for narrowing its interest rate corridor presented in March, the ECB lowered the main refinancing rate 60bp to 3.65%, or 15bp above the deposit rate instead of 50bp. Officials decreased the marginal rate 60bp to 3.90% to the new range of 25bp above the refinancing rate.
Following the announcement, traders cut their expectations for further rate cuts this year to 36bp from more than 60bp prior to the news. However, the chance of an October reduction rose to just above 50%, with 25bps of easing priced in for December.
EUR/USD took a bid on the rate moves and continued higher during the press conference.
“The ECB cut the deposit rate by 25bp, thus confirming the quarterly pace of cuts,” Nordea wrote. “We think this pace will be maintained, and still see the deposit rate at 2.25% at the end of next year. Financial markets are pricing in faster and steeper cuts.”
Following Thursday’s announcement, traders were still predicting the ECB would arrive at 2.0% in July 2025. Goldman Sachs recently knocked 25bps from its forecast for the bank’s terminal rate, lowering it to 2.0%.
Central banks in many major economies have been cutting interest rates. The US Federal Reserve is expected to finally join the crowd next week.
Inflation on the run?
In a statement, the ECB said based on its “updated assessment of the inflation outlook, the dynamics of underlying inflation and the strength of monetary policy transmission, it is now appropriate to take another step in moderating the degree of monetary policy restriction.”
September forecasts unveiled Thursday for annual headline consumer price growth in the euro area were repeats of the bank’s June projections. The ECB said it expects inflation of 2.5% this year, 2.2% next year, and 1.9% in 2026.
Price growth fell to 2.2% last month, according to the EU statistics office Eurostat, a rate near the bank’s target of 2.0% over the medium term. Lagarde warned that inflation could tick up later this year before resuming its decline.
The bank did raise its expectations for the core rate, which excludes energy and food, by one-tenth of a percentage point for 2024 and 2025 to 2.9% and 2.3% respectively. It held the 2026 forecast at 2.0%. Eurostat reported a decline in core inflation to 2.8% last month from 2.9% in July.
While wages have climbed, adding to inflation, Lagarde said, “The overall growth in labour costs is moderating.”
It’s the economy, you know who
While inflation generally seems to be moving in direction that officials desire, the bank lowered its projections for GDP growth by a tenth of a percentage point for this year and the next two. The 2024 estimate was thus reduced to 0.8%, with ‘25 and ’26 set for 1.3% and 1.5% respectively.
“The risks to economic growth remain tilted to the downside,” Lagarde warned.
While not mentioned specifically, Germany has become a problem. Europe’s largest economy, responsible for nearly 30% of euro area GDP, contracted in the second quarter, and the country’s Ifo economic institute last week slashed its expectations for German growth this year to zero from 0.4%.
And with weak manufacturing and construction in Germany and the Eurozone as whole, the hope is reduced borrowing rates will boost both sectors.
But Lagarde did admit there was “lag” between changes in monetary policy and results on the ground. In other words, when and if the ECB can coax economic improvement remains to be seen.
Illimar Mattus co-founder of Tickmill and founder of The Trading Pit, noted that the war in Ukraine is “draining a lot of capital from Europe.” Speaking from Spain during LiveSquawk’s ECB interest rate preview, the Estonian said: “A lot of governments in Europe are spending a lot of money on war efforts, and to a large extent, these efforts are not going to result in much more productivity for the whole economy.”
Sign up for LiveSquawk and receive a discount with the code LSQEC$