FRANKFURT – The end appears to be nigh at European Central Bank headquarters. For rate hikes, that is.
Policymakers are widely expected to raise key interest rates by 25 basis points on Thursday, which would be the eight consecutive increase, with analysts now focused on the end of this cycle of hikes: some say the ECB will implement one more hike as others posit that two more are likely.
“There is little doubt that the ECB will raise rates by 25bps at the June meeting, and thus, focus will instead be on signalling around future hikes,” TD Securities wrote. “While the governing council will likely keep a noncommittal language around future hikes, it will probably keep hinting that a July hike is likely.”
With most observers already betting on another hike next month, the focus falls on September. Nordea said ECB watchers could be pleasantly surprised by the clarity of comments following this week's rate decision. “The ECB has been more inclined to give stronger messages at meetings involving new staff forecasts. The March meeting was an exception, as the banking sector uncertainties in focus at the time rendered the staff forecasts somewhat outdated the minute they were published.”
Whether it is one or two more hikes after Thursday, putting a stop to further rises in borrowing costs will likely be good news for most citizens in the Eurozone, who last week heard that their economy had entered a recession in the first quarter. Growth prospects remain difficult, and increasing the cost of money will do little to improve the situation.
The OCED sent mixed signals about Eurozone growth last week. Its latest economic projections raised the expected improvement in the currency area’s GDP this year to 0.9% from 0.8%. But for Germany, Europe’s largest economy, which also slipped into recession in Q1, the OECD cut growth expectations to zero from 0.3%.
Euro area economic expansion next year was forecast at 1.5%, an slight improvement from 1.4%, with the group saying the ECB should be done with rate hikes by the end of next quarter after two more increases.
It’s the data!
BofA wrote, “Without forward guidance, the ECB will likely continue to insist on data-dependence and the need to look at the three ingredients described in March: the inflation outlook (forecasts), the dynamics of underlying inflation, and the strength of monetary policy transmission. Our perception is still that core inflation has a predominant role in these three conditions. We would expect a clear signal on the need for a sustained move lower in core inflation for the ECB to pause the hiking cycle.”
Core inflation, which excludes energy, food, alcohol, and tobacco, fell to 5.3% last month, according to preliminary information from the European statistics office Eurostat. But it still remains more than double the ECB target of 2% in the medium term.
And since the bank is currently focusing on data, the latest staff forecasts due Thursday could shed light on policymaker’s plans.
“The downside surprise to the flash May estimate of inflation, which fell 0.9 percentage points to 6.1% year-on-year, means that the ECB’s forecast of 6.0% year-on-year for Q2 looks broadly on track despite the upside surprise in April,” Daiwa Capital Markets wrote. “So, given the steeper than expected drop in wholesale energy prices, signs of a softening in food inflation, stronger euro exchange rate and slightly weaker GDP outlook, the ECB’s headline inflation projection of 5.1%year-on-year over 2023 as a whole could well be nudged lower.”
But the core has been different. “Despite evidence of a further cooling in global goods prices, the governing council’s hawks will remain concerned about stickiness in core prices, particularly in services where price momentum still appears strong.”
Daiwa said the ECB will likely need to cut its growth outlook for this year and 2024 due to the first-quarter contraction of 0.1% and ongoing signs of weakness. “We expect it to revise down its full year GDP forecast for 2023 (currently 1.0%), perhaps by about 0.3ppt, and its forecast for 2024 (currently 1.6%) more marginally.”
Analysts said they expect the ECB to reiterate plans to end reinvestments from maturing bonds it bought under its APP quantitative easing programme and that reinvestment of bonds acquired under the Pandemic Emergency Purchase Programme will continue.
/*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; }
}
- Analysts divided on number of increases ahead
- New staff projections could signal next moves
- Euro area, German recessions likely to hit forecasts
- Rate decision due Thursday at 12:15 GMT / 14:15 CEST
- Press conference set for 12:45 GMT / 14:45 CEST
By Eric Culp
European Editor, LiveSquawk News
@EricCulpLS
14 June 2023 | 08:15 GMT
FRANKFURT – The end appears to be nigh at European Central Bank headquarters. For rate hikes, that is.
Policymakers are widely expected to raise key interest rates by 25 basis points on Thursday, which would be the eight consecutive increase, with analysts now focused on the end of this cycle of hikes: some say the ECB will implement one more hike as others posit that two more are likely.
“There is little doubt that the ECB will raise rates by 25bps at the June meeting, and thus, focus will instead be on signalling around future hikes,” TD Securities wrote. “While the governing council will likely keep a noncommittal language around future hikes, it will probably keep hinting that a July hike is likely.”
With most observers already betting on another hike next month, the focus falls on September. Nordea said ECB watchers could be pleasantly surprised by the clarity of comments following this week's rate decision. “The ECB has been more inclined to give stronger messages at meetings involving new staff forecasts. The March meeting was an exception, as the banking sector uncertainties in focus at the time rendered the staff forecasts somewhat outdated the minute they were published.”
Whether it is one or two more hikes after Thursday, putting a stop to further rises in borrowing costs will likely be good news for most citizens in the Eurozone, who last week heard that their economy had entered a recession in the first quarter. Growth prospects remain difficult, and increasing the cost of money will do little to improve the situation.
The OCED sent mixed signals about Eurozone growth last week. Its latest economic projections raised the expected improvement in the currency area’s GDP this year to 0.9% from 0.8%. But for Germany, Europe’s largest economy, which also slipped into recession in Q1, the OECD cut growth expectations to zero from 0.3%.
Euro area economic expansion next year was forecast at 1.5%, an slight improvement from 1.4%, with the group saying the ECB should be done with rate hikes by the end of next quarter after two more increases.
It’s the data!
BofA wrote, “Without forward guidance, the ECB will likely continue to insist on data-dependence and the need to look at the three ingredients described in March: the inflation outlook (forecasts), the dynamics of underlying inflation, and the strength of monetary policy transmission. Our perception is still that core inflation has a predominant role in these three conditions. We would expect a clear signal on the need for a sustained move lower in core inflation for the ECB to pause the hiking cycle.”
Core inflation, which excludes energy, food, alcohol, and tobacco, fell to 5.3% last month, according to preliminary information from the European statistics office Eurostat. But it still remains more than double the ECB target of 2% in the medium term.
And since the bank is currently focusing on data, the latest staff forecasts due Thursday could shed light on policymaker’s plans.
“The downside surprise to the flash May estimate of inflation, which fell 0.9 percentage points to 6.1% year-on-year, means that the ECB’s forecast of 6.0% year-on-year for Q2 looks broadly on track despite the upside surprise in April,” Daiwa Capital Markets wrote. “So, given the steeper than expected drop in wholesale energy prices, signs of a softening in food inflation, stronger euro exchange rate and slightly weaker GDP outlook, the ECB’s headline inflation projection of 5.1%year-on-year over 2023 as a whole could well be nudged lower.”
But the core has been different. “Despite evidence of a further cooling in global goods prices, the governing council’s hawks will remain concerned about stickiness in core prices, particularly in services where price momentum still appears strong.”
Daiwa said the ECB will likely need to cut its growth outlook for this year and 2024 due to the first-quarter contraction of 0.1% and ongoing signs of weakness. “We expect it to revise down its full year GDP forecast for 2023 (currently 1.0%), perhaps by about 0.3ppt, and its forecast for 2024 (currently 1.6%) more marginally.”
Analysts said they expect the ECB to reiterate plans to end reinvestments from maturing bonds it bought under its APP quantitative easing programme and that reinvestment of bonds acquired under the Pandemic Emergency Purchase Programme will continue.