Uranium Week: Mid-Term Price Pullback

Weekly Reports | 11:09 AM
The uranium spot price continued to bounce last week as the mid-term price fell back and cost pressures are rising.
-U3O8 spot market anticipating SPUT purchases
-Mid-term price adjustment reflects other buyer demands
-Cost of uranium production still steadily rising
By Greg Peel
The bounce in the spot uranium price following general financial market lows continued last week, with industry consultant TradeTech’s weekly spot price indicator rising another US$2.60 to US$47.75/lb.
May ended mid-week, at which point the indicator was at US$48.50/lb, down -US$4.50 from end-April.
The two-week bounce began the week before when global equity and other markets staged a solid comeback rally off the most recent lows, and also on news the Sprott Physical Uranium Trust had successfully issued new capital, and was thus cash-positive.
Given SPUT’s sole purpose in life is to purchase uranium as a financial investment, the market is assuming the trust will soon be in buying more material. As of last week it hadn’t yet, but this has not deterred the speculators.
Term Pressure
I have highlighted in recent reports the extensive contango gap between spot prices trading in the forties per pound compared to TradeTech’s mid-term contract price indicator at US$61.00/lb. Well, that reverted at the end of May. TradeTech has cut its mid-term price to US$51.00/lb.
The move seems contradictory, given the war has only served to engender urgency among end-user utilities to secure inventories amidst the turmoil and uncertainty Russia has created. However, as might often be said in other situations, price isn’t everything. Notes TradeTech:
“Utilities recognize that prices must be higher to encourage new supply to come forward, but their focus clearly is targeted at remaining competitive in the future energy landscape. As a result, utilities are vetting any potential supplier to ensure that they will be able to meet future commitments.
“This involves an evaluation based not only on price, but on the evaluated price that includes factors that weigh past delivery performance, jurisdictional risk, ESG compliance, and their ability to deliver material on time, along with terms and conditions related to escalation and quantity flexibility.”
Four transactions were concluded in the term market in May involving more than 11mlbs U3O8 equivalent for delivery over a variety of years, TradeTech reports, from 2023 to beyond 2030. In addition, a number of utilities continue to pursue other means to hedge their portfolios against potential supply interruption of deliveries from Russia, including exercising options and upward quantity flexibility.
While nuclear-related exports are yet to be included in any sanctions placed on Russia, most of Russia’s former customers are acting as if this were already the case by turning to other sources, while still forced to make good on pre-war contracts.
TradeTech’s long-term price indicator remains at US$52.00/lb.
Cost Pressures
As of last week, all three of TradeTech’s price indicators sit below the consultant’s production cost indicator, which climbed to US$52.40/lb in May from $52.00/lb in April, marking a 12-month run of either flat or consecutive increases to the indicator without decline.
This “cost creep” means the end-May PCI represents the highest value since the indicator’s inception in April 2020, and 23% (US$9.70) higher than last year’s equivalent at US$42.70/lb in May 2021.
The monthly increase in the PCI, which captures TradeTech’s proprietary judgment of the life-of-mine full cost (C3) necessary to incentivise and support new primary uranium production, captures a combination of circumstances affecting the future supply/demand dynamic.
As for why costs are rising, it’s for the same reasons the cost of everything is rising, and transports costs are a fundamental expense.
Uranium companies listed on the ASX:
Find out why FNArena subscribers like the service so much: “Your Feedback (Thank You)” – Warning this story contains unashamedly positive feedback on the service provided.
FNArena is proud about its track record and past achievements: Ten Years On
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 = "https://connect.facebook.net/en_US/sdk.js"; 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="
'+ ' '; 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();
});