LS Focus On The Week Ahead
Key Events

On Friday, S&P cut France’s sovereign credit rating to A+/A-1 from AA-/A-1+, citing heightened risks to budgetary consolidation. The outlook was revised to stable. Moody’s will deliver its own assessment this Friday. Analysts at Citi expect Moody’s to downgrade France before the end of President Macron’s term, though not necessarily this week, and suggest the agency may opt for a negative outlook rather than a full rating cut for now.

The Fourth Plenum of the Chinese Politburo, which will shape the country’s economic roadmap for 2026–2030, takes place this week. The meeting will set the tone for the next five-year plan. While an official communiqué will be issued immediately afterwards, a more detailed outline will follow one week later. Final approval is expected at the National People’s Congress in March 2026.

Analysts at TD Securities anticipate a dovish tone from the Q3 BOS/CSCE, the last major sentiment survey ahead of the October Bank of Canada decision. They expect further deterioration in BOS sales indicators and investment/employment intentions, alongside continued moderation in inflation expectations, reflecting recent softness in PMI output prices and CFIB survey data.

The EU General Affairs Council will continue preparations for the upcoming October European Council summit. Ministers are expected to debate draft conclusions, review a progress report on omnibus simplification legislative packages, and hold a policy debate on the Multiannual Financial Framework (MFF) 2028–2034. The agenda also includes the ninth hearing of Hungary under Article 7 proceedings, launched by the European Parliament’s reasoned proposal of September 2018.

In Japan, the extraordinary Diet session on 21 October is expected to select the country’s next prime minister. If no candidate secures a majority in the first round, a runoff will be held between the top two, with the Lower House result prevailing in case of a split. The Lower House requires 233 votes for a majority. Barclays analysts note that Komeito’s withdrawal of its 24 votes from the LDP makes party president Sanae Takaichi’s path to the premiership more challenging.

Fed officials have now entered their media blackout period ahead of the 28–29 October FOMC meeting. The ECB Governing Council will enter its own quiet period on 22 October.

All Times Are GMT

Monday 20 October

02:00 - Mainland China Q3 GDP
Consensus: Q/Q 0.8% (prev 1.1%)

Analysts at Commonwealth Bank of Australia estimated GDP growth slowed to 0.7%/qtr in Q3 2025 because of fading tariff frontloading, persistent weakness in the property sector and waning government support. We also expect the key activity indicators, especially fixed asset investment, to have further weakened in September.

Speakers: ECB’s Schnabel | BoJ’s Takata

Tuesday 21 October

06:00 - UK Sep Public sector net borrowing (GBP)
Consensus: 20.8bn (prev 17.7bn)

HSBC estimated that in a slight reprieve for the government, borrowing figures are set to be revised by a cumulative GBP2bn between April and August 2025. “That narrows the previously estimated overshoot relative to the OBR's forecasts. However, the OBR had already submitted its initial forecast to the Treasury ahead of the Autumn Budget; in this unusual circumstance, it is reasonable to expect the revision will be included in future forecast reiterations. For September, we pencil in an increase in borrowing relative to August and a year ago.”

12:30 - Canada Sep CPI/Core Median
Consensus: Y/Y 2.2% (prev 1.9%)/3.0% (prev 3.1%)

TD Securities looks for headline CPI to firm 0.4 percentage points to 2.3% y/y in September on a smaller drag from energy prices, as seasonal headwinds to food and travel-related components hold prices unchanged from August. Bank experts expect core inflation measures to edge lower on a 0.1pp decline for the trimmed-median, leaving the average of CPI-trim/median at 3.0% y/y, as 3m rates of CPI-trim/median decelerate further.

Speakers: ECB’s Lagarde, Schnabel, Lane, Escriva| RBA’s Jones

Wednesday 22 October

06:00 - UK Sep CPI/Core CPI
Consensus: 4.0% (prev 3.8%)/3.7% (prev 3.6%)

SocGen forecasts that the final CPI report ahead of the November MPC meeting will show headline and services inflation rising by 0.1pp to 3.9% y/y and 4.8%, respectively, in September. “If our forecast is confirmed, both figures would fall short of the BoE’s projections; however, the undershoot is unlikely to be significant enough to persuade the majority of MPC members to cut rates at the November meeting.”

Speakers: ECB’s Lagarde, de Guindos, Kocher

Thursday 23 October

11:00 - Turkey Oct Interest Rate Decision
Consensus: 100bps Cut (prev 40.50%)

“Higher-than-expected inflation data for September shows the impact of pressure in food prices and challenges in services inflation, while indicators for October imply further upside risks to the outlook,” noted ING. “The Central Bank has a hawkish forward guidance, pledging to tighten policy if the inflation outlook deviates from interim targets. Therefore, the question is whether the bank would stop or adjust the pace of cuts with the recent deterioration in the underlying trend. Given the high level of the policy rate and likely decline in inflation ahead, we expect gradual rate cuts to continue with a 150bp cut to 39% in the October MPC, though risks are tilted to the upside with a lower or no cut.”

23:30 - Japan Sep CPI/ Ex-Fresh Food 
Consensus: Y/Y 2.9% (prev 2.7%)/2.9% (prev 2.7%)

CBA said the already released Tokyo inflation suggests the headline national inflation remained steady in September.  Bank experts predict BoJ’s core inflation measure likely eased but remained well above the inflation target.

Speakers: ECB’s Lane

Friday 24 October

06:00 - UK Sep Retail Sales
Consensus: M/M -0.2% (prev 0.5%)

UK retail sales rose in August, supported by solid spending across all major sub-categories, with only fuel consumption showing a decline. However, monthly retail sales can be volatile, and HSBC expects a pullback in September. Footfall and consumer confidence weakened, while nominal debit card spending slipped back to its July level. On that basis, retail sales, including auto fuel, are likely to fall on both a three-month-on-three-month and y/y basis, marking a subdued start to the official UK GDP data for the month.

08:00 - Eurozone HCOB Oct Flash Composite PMI Index
Consensus: 48.7 (prev 48.1)

Citi is pencilling in a first decline in the Eurozone composite output PMI since May, on the back of declines both in services and manufacturing output indices. “We expect manufacturing activity to continue weakening in 4Q25 as US tariffs will progressively show their impact on domestic activity.”

08:30 - UK S&P Global Oct Flash Composite PMI Index
Consensus: 50.7 (prev 50.1)

SocGen forecasts the services PMI to decline by 0.8pts to 50.0 and the manufacturing PMI to fall by 0.7pts to 45.5. Beyond growth, employment indices are likely to show firms continuing to reduce their workforce. However, the pace of decline has stabilised, probably due to the diminishing impact of higher labour costs from the 2024 Autumn Budget. Meanwhile, the services PMI output prices will likely remain just above their long-term average, suggesting that domestic inflationary pressures have not yet been fully eliminated.

12:30 - US Sep CPI/Core CPI
Consensus: 3.1% (prev 2.9)/3.1% (prev 3.1%)

Although September's CPI will come a week later than scheduled, Barclays expect estimates to be "clean," as data collection likely wrapped up on schedule before the government shutdown on 1 October. “Our indicators point to only a modest acceleration of core CPI inflation, to 0.36% m/m (3.2% y/y) in September, slightly faster than consensus and market-implied forecasts, which call for 0.3% m/m. For the headline, we project a 0.4% m/m (3.1% y/y) increase, in line with median consensus projections.”

Speakers: ECB's Cipollone, Villeroy | RBA's Bullock

All Times GMT
/*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; } }