FRANKFURT – The European Central Bank stuck to its guns Thursday and raised all three of its main interest rates by 50 basis points, and the sixth straight hike was widely expected by economists despite rising concerns of possible systemic weakness in the financial sector.
Forget turgid growth, forget global fears of a banking meltdown – for the Eurozone rate-setters, it seems Job One this week was consumer price growth, especially because the ECB led its latest statement on monetary policy with the following sentence: “Inflation is projected to remain too high for too long.”
As TD Securities noted: “This does not sound like an ECB that wants to stop hiking rates yet.”
Capital Economics said Thursday’s move showed fortitude or questionable logic, depending on how one feels about risk. “The ECB’s decision to raise interest rates by 50bp today was the riskiest of the available options – we think investors would have understood if the bank decided to pause.
“But the bank has hinted that it could offer new lending operations to banks if needed, which might have eased some banks’ and investors’ concerns. While the ECB has ditched forward guidance, the press release makes clear that policymakers are prioritising inflation over other concerns.”
And it looks like Europe’s leading lender of last resort is back on data dependence, waiting for the latest possible crisis to shake out before it can move forward with its rate-hike-o-rama, a policy that many says has thrown economic gains to the wind. The ECB raised its GDP growth outlook for this year to 1.0% from the 0.5% forecast in December, but it cut expectations to 1.6% for both 2024 and 2025.
The March ECB inflation projections (in blue) offer little immediate succor for a central bank with a target of 2% in the medium term.
Bad, bad bank
Weak and failed banks have investors and governments on edge, with the collapse of US lender Silicon Valley Bank roiling financial markets. Bank stocks and sovereign debt are bouncing around like ping pong balls at a US college party, leaving investors frazzled and anxious.
At the traditional press conference following the ECB’s latest decision, President Christine Lagarde said: “There is a level of uncertainty that has been completely elevated.”
EUR/USD dropped below 1.60 before the decision on a Bloomberg report that the ECB Vice-President Luis de Guindos told EU finance ministers some banks in the trading bloc could be vulnerable to financing strains due to rising interest rates, a factor many analysts consider the reason for the US bank’s failure.
The currency pair since struggled to remain back above 1.06. Speaking at the ECB press conference, De Guindos said European banks “are resilient. The liquidity position is robust.”
In a surprisingly candid comment, Lagarde told journalists that the 50bp hike option was the only one tabled at the two-day meeting of the bank’s governing council, and the decision to implement the widely expected move was “probably taken in record time”.
However, such alacrity did not equate to unanimity, according to the central banking suprema: “a very large majority” backed the rate moves, but three or four council members did not support the decision as they wanted to wait and let the situation develop.
She said the bank decided to take a “robust” decision in the form of a 50bp hike “considering the ground that needs to be covered.” That ground being rough and quite distant from the bank’s annual inflation target of 2% over the medium term.
Or it’s all good if the medium term includes 2025, when inflation is expected to fall to 2.1%. The bank’s latest projections forecast headline consumer price growth this year at 5.3%, a whole point below December’s predictions. EU harmonised inflation was at 8.5% last month. More concerning, prices excluding energy and food – one measure of core inflation – rose at an annual rate of 5.6% last month.
With all the talk of banking issues, Lagarde reiterated the bank’s leading concern: “We are not waning on our commitment to fight inflation.”
Analysts seem to agree, at least if that commitment is measured in higher interest rates. Both ING and Nordea, for example, said more hikes are coming. As the latter noted, “The ECB’s cautious stance obviously raises downside risks to our baseline ECB forecast of another 50bp rate hike in May and a further 25bp step in June. However, especially amidst the current uncertain market conditions, it is natural for the ECB to refrain from signalling what the future steps will look like. Nevertheless, the likelihood of moving to 25bp rate hikes after today has clearly increased. We continue to think the ECB will deliver several further rate hikes in the upcoming meetings.”
/*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;
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;
}
};
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 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';
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;
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':
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; }
}
- 50-basis point increase widely expected
- Eurozone lender to now watch and wait
- Financial sector concerns give rate-setters pause
- Analysts say higher rates coming
By Eric Culp
European Editor, LiveSquawk News
@EricCulpLS
16 March 2023 | 15:45 GMT
FRANKFURT – The European Central Bank stuck to its guns Thursday and raised all three of its main interest rates by 50 basis points, and the sixth straight hike was widely expected by economists despite rising concerns of possible systemic weakness in the financial sector.
Forget turgid growth, forget global fears of a banking meltdown – for the Eurozone rate-setters, it seems Job One this week was consumer price growth, especially because the ECB led its latest statement on monetary policy with the following sentence: “Inflation is projected to remain too high for too long.”
As TD Securities noted: “This does not sound like an ECB that wants to stop hiking rates yet.”
Capital Economics said Thursday’s move showed fortitude or questionable logic, depending on how one feels about risk. “The ECB’s decision to raise interest rates by 50bp today was the riskiest of the available options – we think investors would have understood if the bank decided to pause.
“But the bank has hinted that it could offer new lending operations to banks if needed, which might have eased some banks’ and investors’ concerns. While the ECB has ditched forward guidance, the press release makes clear that policymakers are prioritising inflation over other concerns.”
And it looks like Europe’s leading lender of last resort is back on data dependence, waiting for the latest possible crisis to shake out before it can move forward with its rate-hike-o-rama, a policy that many says has thrown economic gains to the wind. The ECB raised its GDP growth outlook for this year to 1.0% from the 0.5% forecast in December, but it cut expectations to 1.6% for both 2024 and 2025.
Bad, bad bank
Weak and failed banks have investors and governments on edge, with the collapse of US lender Silicon Valley Bank roiling financial markets. Bank stocks and sovereign debt are bouncing around like ping pong balls at a US college party, leaving investors frazzled and anxious.
At the traditional press conference following the ECB’s latest decision, President Christine Lagarde said: “There is a level of uncertainty that has been completely elevated.”
EUR/USD dropped below 1.60 before the decision on a Bloomberg report that the ECB Vice-President Luis de Guindos told EU finance ministers some banks in the trading bloc could be vulnerable to financing strains due to rising interest rates, a factor many analysts consider the reason for the US bank’s failure.
The currency pair since struggled to remain back above 1.06. Speaking at the ECB press conference, De Guindos said European banks “are resilient. The liquidity position is robust.”
In a surprisingly candid comment, Lagarde told journalists that the 50bp hike option was the only one tabled at the two-day meeting of the bank’s governing council, and the decision to implement the widely expected move was “probably taken in record time”.
However, such alacrity did not equate to unanimity, according to the central banking suprema: “a very large majority” backed the rate moves, but three or four council members did not support the decision as they wanted to wait and let the situation develop.
She said the bank decided to take a “robust” decision in the form of a 50bp hike “considering the ground that needs to be covered.” That ground being rough and quite distant from the bank’s annual inflation target of 2% over the medium term.
Or it’s all good if the medium term includes 2025, when inflation is expected to fall to 2.1%. The bank’s latest projections forecast headline consumer price growth this year at 5.3%, a whole point below December’s predictions. EU harmonised inflation was at 8.5% last month. More concerning, prices excluding energy and food – one measure of core inflation – rose at an annual rate of 5.6% last month.
With all the talk of banking issues, Lagarde reiterated the bank’s leading concern: “We are not waning on our commitment to fight inflation.”
Analysts seem to agree, at least if that commitment is measured in higher interest rates. Both ING and Nordea, for example, said more hikes are coming. As the latter noted, “The ECB’s cautious stance obviously raises downside risks to our baseline ECB forecast of another 50bp rate hike in May and a further 25bp step in June. However, especially amidst the current uncertain market conditions, it is natural for the ECB to refrain from signalling what the future steps will look like. Nevertheless, the likelihood of moving to 25bp rate hikes after today has clearly increased. We continue to think the ECB will deliver several further rate hikes in the upcoming meetings.”