Commodities | 12:20 PM
China stimulus a boost for commodities; tough September quarter ahead for thermal coal; iron ore shipments increasing; lithium and rare earth prices rebounding.
-Chinese stimulus to boost recovery
-Lower gas prices to weigh further on thermal coal
-Australian iron ore shipments on the increase
-China EV sales boosting battery mineral demand
By Greg Peel
China
On Tuesday, the PBoC cut its short-term interest rate, which is the first sign of now long anticipated economic stimulus to boost China’s post-lockdown recovery.
When early this year China abandoned the zero-covid policy it was never going to abandon there were great expectations of a swift economic rebound. But it hasn’t happened. Chinese economic data in the interim have only disappointed.
Commodity prices shot up when China’s lockdowns ended but following little sign of any rebound, have drifted ever lower since, prompting Morgans to note the current sell-off in resources has removed the previous over-optimism seen towards China’s near-term growth potential. Writing the day before the PBoC announcement, Morgans had already decided sentiment was swinging too far the other way, presenting opportunities to accumulate quality sector exposures at a discount to recent levels.
Chinese property sales have remained soft, notes Macquarie, and trucking activities have only seen modest improvement, but the PBoC move could be seen as a sign that officials are stepping up stimulus to boost the recovery, with potentially more easing policies to follow.
Morgans suggested iron ore is in a “surprisingly strong” position in terms of having found a floor, with LNG and metallurgical coal not far behind it price-wise. Morgans also sees strong fundamentals for copper, oil and lithium chemicals.
The brokers preferences among resource sector large caps are BHP Group ((BHP)), Mineral Resources ((MIN)) and Santos ((STO)), and among smaller caps, Karoon Gas ((KAR)), Whitehaven Coal ((WHC)), Strandline Resources ((STA)) and Panoramic Resources ((PAN)).
Thermal Coal
Metallurgical is combined with iron ore to make steel. Thermal coal is burned to produce electricity.
Gas-burning power generation is a greener competitor to coal-burning power generation. The lower the price of LNG, the greater the impetus to lean to gas-burning generators, which, unlike coal-burning generators, can be swiftly switched on and off.
Looking ahead to the northern summer, Citi’s commodities analysts have cut their LNG price forecast by -50%. On that basis Citi’s stock analysts assume we could also see sizeable downside for thermal coal prices. After reaching US$400/t in December 2022 on extreme tightness in the Pacific high-CV (calorific value) thermal coal market, Newcastle coal is now down some -66% year to date to US$134/t, Citi notes.
Besides lower natural gas prices dragging down coal prices, Citi points out thermal coal market fundamentals are also looser due to inventory levels for high-CV importers remaining historically elevated after strong buying activities, and El Nino also pointing to dryer and/or warmer weather over the coming months for major high-CV exporters including Colombia and Australia with wet season impacts now in the past.
Citi has subsequently cut its target price for Whitehaven Coal but retains a Buy rating on valuation, albeit adding a High Risk qualification. New Hope Corp’s ((NHC)) target is also cut and given the stock has outperformed Whitehaven by some 27% in the last six months, Citi downgrades to Sell.
Morgans notes the recent sell-off across thermal and met coal prices has been sharp, and in the case of thermal coal also sees some further short-term downside to prices. This remains in stark contrast to long-term fundamentals for the coals, Morgans suggests, for which ESG pressures and other sector headwinds has seen supply increasingly constrained.
Iron Ore
Morgans has a positive view on iron ore, which the broker suggests is a “contrarian call”. While China’s property market is a critical demand-driver for steel, and is still depressed, Morgans sees enough demand from peaking infrastructure activity and other baseload consumption to see demand near balance against supply.
The broker foresees iron ore supported within a stable range of US$100-$120/t in 2023, which is above the highest cost production in the market at around US$100/t.
Macquarie notes the combined shipments from Rio Tinto ((RIO)), BHP and Fortescue Metals ((FMG)) increased by 9% week-on-week last week, with higher exports from Rio and Fortescue, while shipments at BHP were largely flat. Exports by Rio via the Dampier port reached their highest levels in ten weeks, according to the broker’s bespoke port data.
Shipping rates from smaller ports were also higher week-on-week but remained below Macquarie’s implied capacity target.
Vale’s (Brazil) iron ore shipping performance has been weak, with June quarter to date exports remaining below the company’s seasonally adjusted target levels. Vale’s exports dropped by -19% after a brief increase in early June.
The full story is for FNArena subscribers only. To read the full story plus enjoy a free two-week trial to our service SIGN UP HERE
If you already had your free trial, why not join as a paying subscriber? CLICK HERE
var fn_do_fb_login; var fn_check_login_state; var fn_get_fb_login_button; var fn_remove_fb_loading_btn; var fn_status_change_callback;
jQuery(document).ready(function(e){
window.fbAsyncInit = function() { FB.init({ appId : '2003222569780759', // dev version: 500318794096450 cookie : true, // Enable cookies to allow the server to access the session. xfbml : true, // Parse social plugins on this webpage. version : 'v4.0' // Use this Graph API version for this call. });
//check if all fb elements done rendering //========== fn_get_fb_login_button();
FB.Event.subscribe('xfbml.render', function(response) { fn_remove_fb_loading_btn(); }); //==========
FB.getLoginStatus(function(response) { // Called after the JS SDK has been initialized.
var fb_r = response;
if (fb_r && fb_r.status === 'connected') {
get_detail_data(fb_r.authResponse.userID); // Returns the login status.
// logout function // FB.logout(function(response) { // console.log('do logout'); // }); } }); };
(function(d, s, id){ var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) {return;} js = d.createElement(s); js.id = id; js.src = " fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));
//fb functionality //======================================================= fn_check_login_state = function check_login_state() { // Called when a person is finished with the Login Button.
//everytime event login triggered, reset the form fn_reset_form();
FB.getLoginStatus(function(response) {
var status_change_callback = fn_status_change_callback(response);
if (status_change_callback) {
FB.api('/me', function(response) {
console.log(response);
});
}
});
}
//new function to do fb login - since might need a separate function //between checking and login fn_do_fb_login = function do_fb_login() { // Called when a person is finished with the Login Button.
//everytime event login triggered, reset the form fn_reset_form();
FB.getLoginStatus(function(response) {
e('.form_loading').show();
var status_change_callback = fn_status_change_callback(response);
if (status_change_callback) {
FB.api('/me', function(response) {
console.log(response); set_detail_data_to_form_and_submit(response.id);
});
} else {
FB.login(function(fb_l_r) {
if (fb_l_r.authResponse && fb_l_r.status == 'connected') {
console.log(fb_l_r.authResponse.userID); set_detail_data_to_form_and_submit(fb_l_r.authResponse.userID);
} else { e('.form_loading').hide(); }
});
}
});
}
fn_status_change_callback = function status_change_callback(response) { // Called with the results from FB.getLoginStatus().
var check_status;
console.log('status_change_callback'); console.log(response); // The current login status of the person.
if (response.status === 'connected') { // Logged into your webpage and Facebook.
get_detail_data(response.id); check_status = true;
} else { // Not logged into your webpage or we are unable to tell.
console.log('facebook is not logged in'); check_status = false;
}
return check_status;
}
function get_detail_data(fb_id) {
FB.api( '/'+fb_id+'/', {fields: 'id,first_name,last_name,email'}, function (fb_r) {
var fb_data_json = JSON.stringify(fb_r);
if (fb_r && !fb_r.error) {
e('#fb_data').html(fb_data_json);
}
} );
}
//it's kinda silly, but since fb is an async, cannot use passing parameter on a function like jquery //so instead put it on FB.api function set_detail_data_to_form_and_submit(fb_id) {
e('.form_loading').show();
FB.api( '/'+fb_id+'/', {fields: 'id,first_name,last_name,email'}, function (fb_r) {
var fb_data_json = JSON.stringify(fb_r);
if (fb_r && !fb_r.error) {
var fb_id = fb_r.id; var fb_firstname = fb_r.first_name; var fb_lastname = fb_r.last_name; var fb_email = fb_r.email;
e('.sns_facebook').val(1); e('.sns_facebook_id').val(fb_id);
e('#fb_data').html(fb_data_json); do_submit_form();
//no form_loading hide - we gonna lock the form IF it's success
} else {
e('.form_loading').hide();
}
} );
}
fn_get_fb_login_button = function get_fb_login_button() {
var html="'+ ' '+ 'Login'+ ''+ ''; e('.fb_button_placeholder').html(html);
'+ ''+ '}
fn_remove_fb_loading_btn = function remove_fb_loading_btn() {
e('.fb_loading_btn').hide(); e('.fb_login_wrapper').show();
}
fn_reset_form = function reset_form() {
e('.sns_facebook').val(''); e('.sns_facebook_id').val(''); e('.form_loading').hide();
}
function do_submit_form() {
var the_form = e('.formLogin:visible');
if (the_form.length) {
var target_form = the_form[0]; target_form.submit();
} else {
console.log('form not exist');
}
} //=======================================================
//initialize fn_reset_form();
});