ECB Exits Negative Rates With Surprise Half-point Hike
Is bigger better? The ECB is about to find out after its surprise 50-basis point hike.

- Bank doubles planned increase

- ECB: frontloading allows for meeting-by-meeting approach

- EUR/USD sheds initial gains during presser

- Few details on anti-fragmentation tool

- Lender losing credibility?


By Eric Culp

European Editor, LiveSquawk News





21 July 2022 | 14:30 GMT



FRANKFURT – The European Central Bank announced its exit from negative interest rates on Thursday with a hike that was twice the size of market expectations and its own forward guidance and cited further Eurozone inflation concerns and the uneven transmission of its monetary policy as reasons for the move.


The ECB said that as of 27 July, all three of its key interest rates will increase by 50 basis points, which will bring its deposit rate to 0.00%, its main refinancing rate to 0.50%, and its marginal rate to 0.75%. This was its first hike in 11 years.


The bank signalled last month that it planned a 25bp hike this time around, and that’s what most analysts expected, but few were willing to rule out a half-point increase.


Whether the XL-sized move will have the desired effect remains to be seen. A week after falling to parity with the greenback, the beleaguered single currency took a bid on the decision, which was likely the bank’s hope. EUR/USD jumped over half a cent from its pre-announcement level around 1.02 only to fall back below that starting point during a press conference featuring ECB President Christine Lagarde.


Spreads between the German and Italian 10-year sovereigns also widened during the Q&A, with Lagarde more than once forced to refer to notes and talk about a new bank instrument for stopping the fragmentation of monetary policy transmission even though the ECB decided to issue a release with details on the new tool after the press conference finished.


Fish of the day? Flounder

Quite frankly, the presser and the bank’s conduct around Thursday’s moves appeared a bit shaky, not what one wants from a central bank. When asked if it the ECB looked like it was floundering, like it was sending mixed messages, confusing investors, and presenting what appears to be weak, uninformed leadership, a leading observer of the Frankfurt-based lender was blunt: “Yes, yes, yes, yes, yes, yes. It is a shame.”


The bank may have also lost some of its trustworthiness after yet again ignoring its own messaging. “R.I.P. forward guidance,” tweeted Frederik Ducrozet, head of Macroeconomic Research, Pictet Wealth Management. He noted that the decision to go big was not necessarily “a bad thing in the end, but credibility is an important asset that the ECB needs to preserve.”


The ECB made its case for the unexpected size of the hikes. “The frontloading today of the exit from negative interest rates allows the governing council to make a transition to a meeting-by-meeting approach to interest rate decisions.


“The governing council’s future policy rate path will continue to be data-dependent.”


Dark days are here

Lagarde justified the decision by saying the environment had worsened since June, when the bank signalled a quarter-point hike for this month and a larger move in September. She cited a “clear realisation of upside risks to inflation”, pointing to the jump in June Eurozone consumer price growth to a record 8.6% from the previous high of 8.1% in May. She also noted that the situation has changed in reference to monetary policy transmission since the last rate decision, the reason the bank was forced to call an ad hoc governing council meeting last month to address the issue.  


A clearer inflation picture could come as early as Friday with the release of the latest results of the bank’s survey of professional forecasters.


With Thursday’s larger-than-expected hike, last month’s talk about an even bigger move in September is now moot, Lagarde said, explaining that June’s “forward guidance is no longer applicable.”


ECB Chief Economist Philip Lane and various bank officials had made the case for multiple quarter-point increases as part of normalisation. On the other hand, it’s hard to define normal in the current financial and geopolitical environment of record inflation, brief EUR/USD parity, diverging Eurozone bond yields, soaring energy prices, and a shooting war only a car ride away from bank headquarters. Additionally, a quarter-point hike would have looked like monetary weak sauce when even the Swiss National Bank was willing to jump rates 50bps last month.


“The ECB’s 50bp interest rate hike was more than the consensus had anticipated but bears out recent speculation that a larger hike was on the cards,” wrote Andrew Kenningham, chief Europe economist at Capital Economics. “We think this will be the first of a series of hikes by which the ECB will raise the deposit rate to around 2.0% next year – and we also think the Bank will ultimately have to use its new asset purchase programme to avert another Eurozone crisis.”


Hints of how anti-fragmentation tool is to work

In what feels like patronisation, instead of giving journalists extensive information on its new Transmission Protection Instrument, or TPI, for eliminating debt market fragmentation so they could ask about it at the press conference, the ECB waited until afterwards to release details. Analysts then complained that the bank had not divulged enough about the instrument, including what could trigger its use.


The ECB did say TPI purchases would be focused on public sector securities, or “marketable debt securities issued by central and regional governments as well as agencies, as defined by the ECB” with a remaining maturity of between one and ten years. “Purchases of private sector securities could be considered, if appropriate.”


The governing council will decide what “jurisdictions” will be eligible for bank purchases, the bank added.    

/*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( { case 'Reactivate': reactivate(); break; case 'ConnectDistributor': connect_to_distributor(msg); break; case 'SessionStaticInfo': session_static_info(msg); break; case 'SessionInfo': update_session_info(; break; case 'PauseLogging': clearTimeout(logging_interval); break; case 'RestartLogging': postMessage({action: 'RequestSessionStaticInfo' }); break; case 'JoinPublisherChannel': join_publisher_channel(; break; case 'JoinPlayerChannel': join_player_channel(; break; case 'CheckChannelStatus': check_channel_status(; break; case 'PlayerLogResponse': player_log_response(; 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(; start_log(); } function connect_to_distributor(msg) { publisher_channel =; remote_ip =; socket = new WebSocket("wss://"+distributor_server); socket.onopen = function(event) { request_server_assignment(); }; socket.onmessage = function(event) { var msg_string =; 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://"+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 =; 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.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 =; 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; = 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.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; = 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; =; msg_string = JSON.stringify(data_array); if (socket.readyState == 1) { socket.send(msg_string); } } socket_emits++; if (socket_emits == 100) { socket_emits = 0; } }