FRANKFURT – Thursday normally would have been just the latest in a line of what have become ho-hum half-point rate hikes at European Central Bank HQ. At least until something happened half a world away.
The failure of California-based Silicon Valley Bank (SVB) has hit markets like those occasional and often brutal West Coast earthquakes, further squeezing the ECB’s already besieged governing council with what must now feel like pressure of tectonic proportions.
Bonds soared as investors piled into safe havens after US regulators seized control of SVB. The yield of the benchmark German 10-year Bund plunged to below 2.2% Monday from more than 2.6% last week. It pushed to above 2.4% in European trading Tuesday, signalling renewed interest in risker assets as investors bought back big into the banking sector. Citigroup was up nearly 6% and Wells Fargo traded 4% higher at the time of this writing.
With markets still worried about aftershocks in the banking sector, many observers have been questioning economists’ polls that still predict a half-point hike from the ECB on Thursday. On Monday, Eurozone money markets were pricing in a larger likelihood of a quarter-point move, according to ICAP and Refinitiv Data.
What's all the fuss?
The disintegration of a mid-sized American bank has given the financial world a reason for pause, one possibly destined to be only a brief moment of reflection completed by or before Thursday.
In a note, Greg Fuzesi at JP Morgan on Monday wrote: “Markets have massively repriced expectations for the ECB: the terminal rate has declined by around 70bp from last week and, earlier today, markets were leaning towards a 25bp hike on Thursday, having priced this last week as a near-certain 50bp move. For now, we are not minded to make any changes to our ECB call. Hence, we still expect a 50bp hike on Thursday and a terminal rate of 3.75%. Markets have moved around 30bp below the latter.”
This could be the prudent call as market watchers ask, How much will SVB affect the global financial system, and more importantly for policymakers in Frankfurt, the European banking system?
ING hedged its bets: “Our economics team does not see a very material risk of a 25bp hike this week and only expects recent market developments to affect the debate about the path beyond March, but should the ECB surprise with such a smaller move, it would entirely be due to financial risks as opposed to a more constructive view on inflation.”
While Germany’s central bank – the Bundesbank – called for crisis talks on the fall of SVB, the ECB banking supervisory reportedly has no plans for an emergency meeting following the demise of the lender, with Bank of Greece Governor and ECB policymaker Yannis Stournaras saying Tuesday that he expects no impact from the tribulations of the Californian bank.
After hiking rates 50bp last month for a fifth straight increase, the ECB all but promised more of the same on Thursday. But like the rest of us, the bank can also fall victim to the vagaries of life and the news cycle, and it always warns that any plans it announces could change with conditions. In other words, policy is fickle like the weather and reactive versus proactive. Sure, SVB could not have been predicted, and while it looks like the effect on the financial system in Europe and beyond will be minimal and eminently manageable, the ECB may decide to step back from its rate hike-driven crusade against inflation until the situation cools. Or, it could buck up and pump up rates, something it will likely do anyway down the road.
Or are we back in 2008, with a Lehman-style implosion lurking about somewhere – did someone say “Credit Suisse”? Will this week’s ECB Governing Council Meeting be full of fearful talk of “contagion”, the bugaboo of the Global Financial Crisis? And more importantly, could that be how some in the market perceive any pullback from plans for a half-point hike this week?
The ECB cheat sheet from ING Bank shows a clear expectation of a 50-basis point hike. .
Another calamity? Get in line
Of course, SVB is merely the crisis de jour, one heaped on top of the Eurozone’s macroeconomic mess, a situation succinctly outlined last week by Oxford Economics: “Core inflation data for February, which came in above expectations, appears to have swayed ECB council members to stick to a hawkish path.”
Wait, there’s more, and it is also not good. “The Eurozone economy is clearly in poor shape. The GDP breakdown for Q4 showed that recession was avoided only due to falling imports, which mirror shrinking domestic demand. What’s more, available hard data for January show Eurozone retail sales and German industrial production growth were far from enough to offset dismal falls in December.”
In short, sticky inflation and no growth. Even shorter: Stagflation. But the bank has always been adamantinely single-minded – at least in its communications – about its pursuit of bringing inflation to its target of 2% in the medium term. Will it let a recession or falling dominos in the global banking system get in its way?
We’ll find out Thursday.
/*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; }
}
- Economists expect 50-basis point increase
- Traders say higher chance of 25bp hike
- Failure of SVB bank could undercut hawkish resolve
- Rate decision set for Thursday at 13:15 GMT/14:15 CET
- Press conference scheduled to start at 13:45 GMT/14:45 CET
By Eric Culp
European Editor, LiveSquawk News
@EricCulpLS
14 March 2023 | 18:00 GMT
FRANKFURT – Thursday normally would have been just the latest in a line of what have become ho-hum half-point rate hikes at European Central Bank HQ. At least until something happened half a world away.
The failure of California-based Silicon Valley Bank (SVB) has hit markets like those occasional and often brutal West Coast earthquakes, further squeezing the ECB’s already besieged governing council with what must now feel like pressure of tectonic proportions.
Bonds soared as investors piled into safe havens after US regulators seized control of SVB. The yield of the benchmark German 10-year Bund plunged to below 2.2% Monday from more than 2.6% last week. It pushed to above 2.4% in European trading Tuesday, signalling renewed interest in risker assets as investors bought back big into the banking sector. Citigroup was up nearly 6% and Wells Fargo traded 4% higher at the time of this writing.
With markets still worried about aftershocks in the banking sector, many observers have been questioning economists’ polls that still predict a half-point hike from the ECB on Thursday. On Monday, Eurozone money markets were pricing in a larger likelihood of a quarter-point move, according to ICAP and Refinitiv Data.
What's all the fuss?
The disintegration of a mid-sized American bank has given the financial world a reason for pause, one possibly destined to be only a brief moment of reflection completed by or before Thursday.
In a note, Greg Fuzesi at JP Morgan on Monday wrote: “Markets have massively repriced expectations for the ECB: the terminal rate has declined by around 70bp from last week and, earlier today, markets were leaning towards a 25bp hike on Thursday, having priced this last week as a near-certain 50bp move. For now, we are not minded to make any changes to our ECB call. Hence, we still expect a 50bp hike on Thursday and a terminal rate of 3.75%. Markets have moved around 30bp below the latter.”
This could be the prudent call as market watchers ask, How much will SVB affect the global financial system, and more importantly for policymakers in Frankfurt, the European banking system?
ING hedged its bets: “Our economics team does not see a very material risk of a 25bp hike this week and only expects recent market developments to affect the debate about the path beyond March, but should the ECB surprise with such a smaller move, it would entirely be due to financial risks as opposed to a more constructive view on inflation.”
While Germany’s central bank – the Bundesbank – called for crisis talks on the fall of SVB, the ECB banking supervisory reportedly has no plans for an emergency meeting following the demise of the lender, with Bank of Greece Governor and ECB policymaker Yannis Stournaras saying Tuesday that he expects no impact from the tribulations of the Californian bank.
After hiking rates 50bp last month for a fifth straight increase, the ECB all but promised more of the same on Thursday. But like the rest of us, the bank can also fall victim to the vagaries of life and the news cycle, and it always warns that any plans it announces could change with conditions. In other words, policy is fickle like the weather and reactive versus proactive. Sure, SVB could not have been predicted, and while it looks like the effect on the financial system in Europe and beyond will be minimal and eminently manageable, the ECB may decide to step back from its rate hike-driven crusade against inflation until the situation cools. Or, it could buck up and pump up rates, something it will likely do anyway down the road.
Or are we back in 2008, with a Lehman-style implosion lurking about somewhere – did someone say “Credit Suisse”? Will this week’s ECB Governing Council Meeting be full of fearful talk of “contagion”, the bugaboo of the Global Financial Crisis? And more importantly, could that be how some in the market perceive any pullback from plans for a half-point hike this week?
Another calamity? Get in line
Of course, SVB is merely the crisis de jour, one heaped on top of the Eurozone’s macroeconomic mess, a situation succinctly outlined last week by Oxford Economics: “Core inflation data for February, which came in above expectations, appears to have swayed ECB council members to stick to a hawkish path.”
Wait, there’s more, and it is also not good. “The Eurozone economy is clearly in poor shape. The GDP breakdown for Q4 showed that recession was avoided only due to falling imports, which mirror shrinking domestic demand. What’s more, available hard data for January show Eurozone retail sales and German industrial production growth were far from enough to offset dismal falls in December.”
In short, sticky inflation and no growth. Even shorter: Stagflation. But the bank has always been adamantinely single-minded – at least in its communications – about its pursuit of bringing inflation to its target of 2% in the medium term. Will it let a recession or falling dominos in the global banking system get in its way?
We’ll find out Thursday.