Extrapolating too much from a single bank’s earnings is always an easy trap to fall into … but the quarterly numbers from JPMorgan indicate Main Street is not doing nearly as well as Wall Street – this is not a surprise, but it begs the question of when the credit losses from bad corporate and personal debt starts to catch up with the broader market. Moreover, investors need to ask whether the exceptional trading revenues are all that sustainable.

JPM rose in pre-market trade – the shares of JPM and other investment banks (C, GS, MS, BAC) can rally from this because they are relatively cheap and have not participated in the rally since March in the same way as the broad market. However, the implications for the broader market are interesting – do impairments matter for the rest of the market, for consumer cyclicals for example? Given the way the investment bank is doing all the lifting, what are the implications for financials like the XLF ETF? Or Russell 1000 financials? The outlook there must be a lot more challenging.

JPMorgan beat on the top and bottom line. Revenues topped $33.8bn vs the $30.5bn expected, whilst earnings per share hit $1.38 vs $1.01 expected. There was a huge range of estimates so the consensus numbers were always going to be a little out.

The bank earned $4.7bn of net income in the second quarter despite building $8.9 billion of credit reserves thanks to its highest-ever quarterly revenue.

Loan loss provisions were $10.5bn, which was more than expected and the quarter included almost $9bn in reserve builds largely due to Covid-19. The company reaffirmed suspension of share buybacks at least through the end of Q3 2020.

The consumer bank reported a net loss of $176 million, compared with net income of $4.2 billion in the prior year, predominantly driven by reserve builds. Net revenue was $12.2 billion, down 9%. Credit card sales were 23% lower, with average loans down 7%, while deposits rose 20% as consumers deleveraged. The provision for credit losses in the consumer bank was $5.8 billion, up $4.7 billion from the prior year driven by reserve builds, chiefly in credit cards.

Trading revenues were phenomenal, rising 80% with fixed income revenues doubling, which indicates the investment banks on Wall Street are in good shape thanks largely to their trading arms. But the numbers elsewhere don’t suggest Main St is in good shape at all, which indicates the more diversified investment banks are going to be in better shape than many others. As we discussed in the preview to this week, the massive about of investment grade corporate bond issuance and mortgage refinancing as companies and household refinanced to take advantage of lower rates has been a big help, albeit far bigger than we had thought. Assets under management rose 15% but this probably broadly reflects the rally in the equity markets since the last earnings release.

My sense is what while the stock market does not reflect the real economy, and the JPM numbers reinforce this view, this is not a barrier to further gains. The vast amount of liquidity that has been injected into the financial system will keep stocks supported – the cash needs to find a home somewhere and bonds offer nothing. However there is clearly a risk that Main Street starts to bite at the ankles of Wall Street and results in another pullback like we saw in the second week of June. We should remember that there could some very hard yards ahead for the US economy as states pause reopening – loan loss provisions may need to rise a lot more.

Meanwhile Delta Airlines reported an ugly loss of $4.43 vs $4.07 expected, though revenues were a little ahead of forecast. Net loss of $3.9bn with Q2 revenues the lowest since the mid-80s. It has the cash to last 19 months despite burning through $27m a day in cash – down from $100m at the peak of the crisis.

Wells Fargo and Citigroup coming up next….

Latest news

Sunday, 29 December 2024

Indices

Stock market today: Most Asian stocks fell after US equities declined

Sunday, 29 December 2024

Indices

MicroStrategy joins Nasdaq-100 index: MSTR stock performance analysis 2024

Sunday, 29 December 2024

Indices

Morning Note: Key Levels & Data Driving the Last Monday of 2024

Closing 2024

Thursday, 26 December 2024

Indices

Week ahead: Closing 2024 and First Economic data from 2025

SettingsRequest history8.1.18PHP Version483msRequest Duration4MBMemory UsageGET {locale}/news/{slug}
status
200 OK
full_url
https://web-qa.staging.markets.com/vc/news/jpm-shares-rise-on-record-trading-revenues
controller_action
App\Http\Controllers\DynamicContentController@getNewsFromCollection
Theme
Open Button Position
Hide Empty Tabs
Autoshow
Reset to defaults
status
200 OK
full_url
https://web-qa.staging.markets.com/vc/news/jpm-shares-rise-on-record-trading-revenues
action_name
controller_action
App\Http\Controllers\DynamicContentController@getNewsFromCollection
uri
GET {locale}/news/{slug}
controller
App\Http\Controllers\DynamicContentController@getNewsFromCollection
prefix
/{locale}
where
file
app/Http/Controllers/DynamicContentController.php:370-421
middleware
web, SetDomain, GoMarkets, setlocale, trackingparams, redirects, Logout, pagecache, setrisk, gettranslations, getglobalsettings, urlstructure, saveReferral
duration
483ms
peak_memory
6MB
response
text/html; charset=UTF-8
request_format
html
request_query
[]
request_request
[]
request_headers
0 of 0
array:15 [ "accept-encoding" => array:1 [ 0 => "gzip, deflate, br, zstd" ] "sec-fetch-dest" => array:1 [ 0 => "document" ] "sec-fetch-user" => array:1 [ 0 => "?1" ] "sec-fetch-mode" => array:1 [ 0 => "navigate" ] "sec-fetch-site" => array:1 [ 0 => "none" ] "accept" => array:1 [ 0 => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ] "user-agent" => array:1 [ 0 => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" ] "upgrade-insecure-requests" => array:1 [ 0 => "1" ] "sec-ch-ua-platform" => array:1 [ 0 => ""Windows"" ] "sec-ch-ua-mobile" => array:1 [ 0 => "?0" ] "sec-ch-ua" => array:1 [ 0 => ""HeadlessChrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"" ] "cache-control" => array:1 [ 0 => "no-cache" ] "pragma" => array:1 [ 0 => "no-cache" ] "connection" => array:1 [ 0 => "keep-alive" ] "host" => array:1 [ 0 => "web-qa.staging.markets.com" ] ]
request_cookies
[]
response_headers
0 of 0
array:3 [ "content-type" => array:1 [ 0 => "text/html; charset=UTF-8" ] "cache-control" => array:1 [ 0 => "no-cache, private" ] "date" => array:1 [ 0 => "Fri, 04 Apr 2025 03:11:56 GMT" ] ]
session_attributes
0 of 0
array:1 [ "_token" => "mCYFb9zxv5cjBWUMYi3J3S38747uqUmH9Fax9XuT" ]
  • infolog[03:11:55] LOG.info: api_cb4faba78a8fdec919dbb688dd85d9fd [ "\/vc\/news\/jpm-shares-rise-on-reco...
  • infolog[03:11:55] LOG.info: api_12c8a4a2c22e1b1d3ef397223952b8d0 [ "\/vc\/news\/jpm-shares-rise-on-reco...
  • warninglog[03:11:55] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:55] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:55] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:55] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:55] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:55] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:55] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:55] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • infolog[03:11:56] LOG.info: api_89a7e3e423e283567d5354adb2f9e264 [ "\/vc\/news\/jpm-shares-rise-on-reco...
  • infolog[03:11:56] LOG.info: api_2b56c750943370200ef615cc80e0fc84 [ "\/vc\/news\/jpm-shares-rise-on-reco...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • warninglog[03:11:56] LOG.warning: str_replace(): Passing null to parameter #3 ($subject) of type array|string ...
  • infolog[03:11:56] LOG.info: page_68146cdced79bf913bdb8bb719b81ee7 [ "\/vc\/news\/jpm-shares-rise-on-rec...
  • Booting (12.9ms)time
  • Application (470ms)time
  • Routing (906μs)
  • 1 x Application (97.33%)
    470ms
    1 x Booting (2.67%)
    12.90ms
    1 x Routing (0.19%)
    906μs
    95 templates were rendered
    • 1x news-contentnews-content.blade.php#?blade
    • 1x components.news-landingnews-landing.blade.php#?blade
    • 1x components.news-singlenews-single.blade.php#?blade
    • 1x components.article-navigationarticle-navigation.blade.php#?blade
    • 1x components.text-editortext-editor.blade.php#?blade
    • 1x components.share-listshare-list.blade.php#?blade
    • 1x repeatable.trading-tabletrading-table.blade.php#?blade
    • 6x repeatable.trading-table-labelstrading-table-labels.blade.php#?blade
    • 24x repeatable.trading-table-rowtrading-table-row.blade.php#?blade
    • 1x components.news-columnnews-column.blade.php#?blade
    • 34x components.strapi-imgstrapi-img.blade.php#?blade
    • 3x components.spacerspacer.blade.php#?blade
    • 1x components.news-rownews-row.blade.php#?blade
    • 1x layouts.mainmain.blade.php#?blade
    • 1x csscss.blade.php#?blade
    • 1x scripts.hrefmaphrefmap.blade.php#?blade
    • 1x layouts.headerheader.blade.php#?blade
    • 1x layouts.header.mobile-login-buttonsmobile-login-buttons.blade.php#?blade
    • 1x layouts.header.mobile-searchmobile-search.blade.php#?blade
    • 2x repeatable.languageslanguages.blade.php#?blade
    • 1x layouts.header.menumenu.blade.php#?blade
    • 1x layouts.header.search-togglesearch-toggle.blade.php#?blade
    • 1x layouts.header.login-buttonslogin-buttons.blade.php#?blade
    • 1x components.search-resultssearch-results.blade.php#?blade
    • 1x components.blur-animationblur-animation.blade.php#?blade
    • 1x layouts.floating.cookiescookies.blade.php#?blade
    • 1x scripts.breadcrumbsbreadcrumbs.blade.php#?blade
    • 1x components.corner-advertcorner-advert.blade.php#?blade
    • 1x layouts.footerfooter.blade.php#?blade
    • 1x scripts.functionalfunctional.blade.php#?blade
    • 1x scripts.trackingtracking.blade.php#?blade
    uri
    GET {locale}/news/{slug}
    middleware
    web, SetDomain, GoMarkets, setlocale, trackingparams, redirects, Logout, pagecache, setrisk, gettranslations, getglobalsettings, urlstructure, saveReferral
    controller
    App\Http\Controllers\DynamicContentController@getNewsFromCollection
    prefix
    /{locale}
    where
    file
    app/Http/Controllers/DynamicContentController.php:370-421
    0 statements were executed0μs
          _token
          mCYFb9zxv5cjBWUMYi3J3S38747uqUmH9Fax9XuT
          ClearShow all
          Date ↕MethodURLData
          #12025-04-04 03:11:56GET/vc/news/jpm-shares-rise-on-record-trading-revenues/3795