July 30, 2025

Macrofinancial Outlook for the Day
Published

July 30, 2025

Releases

GDP

Inflation-Adjusted Final Sales To Domestic Purchases

WSJ Editorial Board’s Notes

WSJ Editorial Board: The Collapse In Imports, Which Can Be Crucial To Domestic Economic Activity, Boosted The Headline Growth Number. According to the Wall Street Journal Editorial Board, “If you think President Trump’s tariff ructions don’t affect the economy, take a gander at Wednesday’s report for second quarter gross domestic product. The economy grew 3% on an annual basis, but largely because imports collapsed. This may be the weirdest GDP report ever. The top line growth number looks good, and the White House naturally touted it. This reverses the 0.5% decline in GDP in the first quarter, which was largely explained by a surge of imports as businesses tried to front-run the anticipated tariff barrage. Growth in the first half was a mediocre 1.2%. Most striking are the second quarter report’s wild internal details. Net exports (exports minus imports) added a remarkable 4.99% to GDP as imports fell 30.3%. Imports subtract from growth in the national accounts because GDP measures domestic production. Imports are produced overseas. But imports are still crucial to U.S. economic well-being because consumers buy them and businesses use them as inputs for what they produce—and often export.” [Wall Street Journal Editorial Board, 2025-07-30]

WSJ Editorial Board: Trump’s Volatile Trade Policies Seem To Have Caused A 15.6 Percent Decline In Domestic Private Investment. According to the Wall Street Journal Editorial Board, “The crazy swing in imports shows how much Mr. Trump’s up-and-down trade policies have disrupted business decisions and left companies scrambling to adapt. This seems to have had a negative effect on private domestic investment, which fell 15.6% in the second quarter after a surge in the first.” [Wall Street Journal Editorial Board, 2025-07-30]

  • Pioneering Economist Studying Uncertainty: Trump’s Trade War Has Created Conditions Consistent With Uncertainty-Driven Slowdown In Capital Investments. According to Bloomberg, “Behind all these numbers lies a bedrock reality, documented by economists like Stanford’s Nicholas Bloom. In uncertain times companies tend to hold off making big capital bets. And Trump’s trade war has delivered uncertainty in spades.” [Bloomberg, 2025-07-27]

WSJ Editorial Board: Finals Sales To Domestic Purchases Rose By The Least Since Q4 2022. According to the Wall Street Journal Editorial Board, “The doughty U.S. consumer was less affected, contributing 0.98% to GDP—decent if hardly bullish. But it’s notable that final sales to private domestic purchasers, a key measure of demand, rose only 1.2%. That’s the lowest since the fourth quarter of 2022.” [Wall Street Journal Editorial Board, 2025-07-30]

Trade War

While The White House Has Published A Fact Sheet, No Joint Document Has Been Signed By The Japanese Government And Trump Administration. According to Bloomberg, “The Japan side has cited JBIC and NEXI as the government-backed organizations that will be leading financing for the projects. For JBIC, in the year ended March, around 77% of its assets were in loans, and 6.6% in loan guarantees. Further details of the implementation of the US-Japan deal remain unclear, including when the new tariff rates will take effect and when the new investment vehicle will kick off. There’s been no joint document signed by both sides for the deal, although the White House has published a fact sheet. ‘If you say something like, “Let’s create a joint document,” they will say, “We’ll lower tariffs after the document is created,”’ Akazawa said. In order to not lose time, ‘we will demand that they issue an executive order to lower tariffs as soon as possible, regardless of a document.’” [Bloomberg, 2025-07-28]

Bloomberg Economics: Trump’s Trade War Expected To Cost $2 Trillion In Global Income Through 2027. According to Bloomberg, “From Japanese auto firms to US tomato growers and Vietnamese sportswear plants, tariffs under Trump’s ‘America First’ doctrine are proving a blunt weapon, with some early winners but even more inadvertent casualties. The hit to the world economy will reach $2 trillion by the end of 2027 relative to its pre-trade war path, Bloomberg Economics projects. Looking further ahead, some of those losses would be recouped as production and supply chains realign.” [Bloomberg, 2025-07-27]

Reduced Investment

Largest Producer Of Greenhouse Tomatoes In North America, Arizona Expansion Plans Were Paused Following Trump’s Tariffs. According to Bloomberg, “At NatureSweet Tomatoes — which claims to be the largest producer of greenhouse tomatoes in North America, and supplies major US supermarket chains — expansion plans are on hold. The company operates the equivalent of 30 football fields of greenhouses in Arizona, and wanted to more than double that capacity. Then it got hit on multiple fronts. Trump’s decision to tariff tomatoes from Mexico has hit NatureSweet’s production there. Inputs it needs for cultivating the plants in Arizona — from Sri Lankan coconut husks to Chilean fertilizer — are all subject to new taxes, too. And going ahead with the expansion will require importing greenhouse and irrigation systems from places like the Netherlands and Israel. ‘My main competitors in Canada are getting no tariffs,’ says Rodolfo Spielman, NatureSweet’s president and CEO. ‘So the current situation is the worst possible situation for us.’” [Bloomberg, 2025-07-27]

Global Effect

[Bloomberg 2025-07-27]

Trump’s Lies

The Centerpiece Of Trump’s Framework For A Deal With Japan, The $550 Billion Fund, Would, According To The Japanese Government, Only Have Between One And Two Percent Of That Amount In Direct Investments. According to Bloomberg, “Japan expects only 1% to 2% of its recently agreed upon $550 billion US fund to be deployed as investment, with loans making up the bulk of the rest, according to the nation’s top chief negotiator Ryosei Akazawa. Meanwhile, Tokyo stands to save roughly ¥10 trillion ($68 billion) through lower tariff rates in its deal with the US, Akazawa told public broadcaster NHK on Saturday. The details revealed by Akazawa suggest the Japanese may end up giving up much less than at first glance. The $550 billion investment framework combines investments, loans and loan guarantees provided by financial institutions backed by the Japanese government, Akazawa said. Of the total, investment will comprise 1% or 2% and the US and Japan will split the profits of that investment at a ratio of 90-10, he said. Japan had originally proposed a 50-50 ratio, he added. The fund is a centerpiece of the deal announced by the two sides that will impose 15% tariffs on Japanese cars and other goods. Officials from Japan and other countries that struck deals with the US are now sifting through the terms to explain them to the public. ‘It’s not that $550 billion in cash will be sent to the US,’ Akazawa said. ‘By letting the US have 90% of the profits rather than 50%, I think Japan’s loss will be at most a couple of tens of billions of yen. People are saying various things, such as “You sold out Japan,” but they”re wrong.’” [Bloomberg, 2025-07-28]

The European Union Admitted That The $600 Billion Centerpiece Investment Trump Had Touted Was Not Something That Could Be Guaranteed. According to Politico, “The European Union has admitted it doesn’t have the power to deliver on a promise to invest $600 billion in the United States economy, only hours after making the pledge at landmark trade talks in Scotland. That’s because the cash would come entirely from private sector investment over which Brussels has no authority, two EU officials said. On Sunday, European Commission President Ursula von der Leyen struck a deal with U.S. President Donald Trump to avoid an all-out EU-U.S. trade war. The deal included a pledge to invest an extra $600 billion of EU money into the U.S. over the coming years. But speaking Monday, two senior European Commission officials clarified that money would come exclusively from private European companies, with public investment contributing nothing. ‘It is not something that the EU as a public authority can guarantee. It is something which is based on the intentions of the private companies,’ said one of the senior Commission officials. The Commission has not said it will introduce any incentives to ensure the private sector meets that $600 billion target, nor given a precise timeframe for the investment. However, the first official said that the $600 billion figure was ‘based on detailed discussions with different business associations and companies in order to see what their investment intentions are.’” [Politico, 2025-07-28]

Economic Degradation

Less Efficient Patent System

WSJ: Trump’s Commerce Secretary Has Pushed To Raise Fees On Patents Dramatically. According to the Wall Street Journal, “The Trump administration is considering a plan to raise tens of billions of dollars with a new fee that would transform the patent system, a radical move that would likely fuel pushback from businesses. Commerce Department officials are discussing charging patent holders 1% to 5% of their overall patent value, a shift that could dramatically increase fees, according to people familiar with the matter. The idea is being considered by Commerce Secretary Howard Lutnick as part of his plans to raise revenue and narrow the government’s budget deficit. The new structure would be a major change in the 235-year old practice of applying for a patent, a bedrock process in the U.S. economy. Companies and researchers use patents to protect inventions and make money from them. Because they are public, patents let others in the same field build on previous work. Patent holders typically pay the government a few thousand dollars, up to roughly $10,000, in flat-fee payments made periodically over many years. The new fee would be a much more exorbitant cost for some patent holders that would function like a property tax. ‘It’s a total paradigm shift in how you think about protecting intellectual property rights,’ said Brad Watts, senior vice president at the U.S. Chamber of Commerce’s Global Innovation Policy Center, which advocates for strong IP standards. Many businesses would likely have major concerns with what they perceive as a tax on innovation, he said.” [Wall Street Journal, 2025-07-28]

Financial Instability

After Trump’s Instability Caused Unexpected Volatility, UBS Ordered Their Bankers To “Scale Back” Sales Of Complex Derivatives After Clients Suffered Notable Losses. According to the Financial Times, “UBS has ordered bankers to scale back sales of complex currency derivatives after clients suffered heavy losses linked to Donald Trump’s “liberation day” tariff announcements. The Swiss bank told advisers to stop pitching the structured FX products — known as Range Target Profit Forwards (RTPFs) — to many clients, according to three people familiar with the discussions, amid growing concerns about sales practices and whether the products were suitable.” [Financial Times, 2025-07-29]

  • As The Dollar Collapsed In The Wake Of Trump’s Policies, Clients Were Exposed To “Potentially Unlimited Losses.” According to the Financial Times, “RTPFs are not new but are designed for professional investors with a high risk tolerance, and are restricted or tightly regulated in many jurisdictions, including the UK, Spain and several Asian markets. The products offer limited upside, but expose clients to potentially unlimited losses. The ones at issue in UBS’s case involved regularly exchanging US dollars for Swiss francs at a fixed rate, provided the exchange rate stayed within a defined range. But when the dollar dropped sharply after Trump’s tariffs, many clients were forced to continue trading on increasingly unfavourable terms, leading to steep and unexpected financial damage.” [Financial Times, 2025-07-29]

Exploding Debt

April - July 2025: The Treasury’s Projection Of Borrowing Through September Of This Year Rose From $554 Billion To $1.01 Trillion. According to Bloomberg, “In the immediate future, borrowing is on the rise. In its latest quarterly estimate, the Treasury said Monday it now expects to borrow $1.01 trillion in the three months through September — that’s up sharply from an April projection of $554 billion, mainly due to distortions from the debt limit. Since Congress raised the ceiling earlier this month, debt managers have been ramping up bill sales to rebuild a cash balance run down during the first half of the year.” [Bloomberg, 2025-07-28]

Increased Volatility In Americans’ Balance Sheets

July 2025: Trump’s Secretary Bessent Talked About Elements Of His BBB As “Backdoor Privatizing Social Security.” According to FactPost, “We want you to understand it. It’s almost like if you get a pet, you understand everything about your pet. So if you have these accounts, why are you investing it this way? How are you doing it? How can you understand the power of compound interest? And also, at the end of the day, I’m not sure when the distribution level date should be. Should it be 30 and you can buy a house? Should it be 60? But in a way, it is a backdoor for privatizing Social Security. Social Security is a defined benefit plan paid out to the extent that if all of a sudden these accounts grow and you have in the hundreds of thousands of dollars for your retirement, then that’s a game changer too.” [FactPost, 2025-07-30]

Undermined Insurance Ratings

2017 - 2024: Ohio-Based Demotech Issued Exceptional Or Better Ratings To 98 Percent Of Insurers In Climate Disaster-Prone Areas, Who Became Insolvent At 30 Times The Rate Of Their Peers Rated By Other Firms. According to the Wall Street Journal, “With climate disasters driving many big nationwide insurers out of risky markets in Louisiana, Florida and elsewhere, smaller companies such as Lighthouse have stepped in to fill the gap. And many are getting a critical stamp of approval from Demotech, a tiny Ohio rating company with a unique take on grading financial stability. It rates 98% of the insurers A, for ‘exceptional,’ or the even better A Prime or A Double Prime. But Demotech’s rosy outlook doesn’t always pan out. Insurers it rated were 30 times as likely to become insolvent as those graded by its main rivals, according to a Wall Street Journal analysis of failures since 2017.” [Wall Street Journal, 2025-07-27]

  • As States Like Florida Have Pushed Against Insuring Their Riskiest Homeowners, Demotech-Rated Insurers Have Come To Take Up Millions Of Homeowners’ Policies. According to the Wall Street Journal, “State regulators say Demotech’s willingness to rate such small insurers provides consumers with more choices in troubled markets and takes pressure off so-called insurers of last resort. Florida’s Citizens Property Insurance, created by the Florida legislature in 2002 for homeowners who can’t get coverage elsewhere, has been able to move more than 200,000 policies this year from its books to 10 small insurers with A ratings from Demotech. Demotech founder Joseph Petrelli said his company’s ratings allow millions of homeowners in areas abandoned by large insurers to get insurance. ‘We created this space,’ he said. ‘No one else was interested in doing that at the time.’ Insurers rated by Demotech collect about half of all home-insurance premiums paid in Florida, one-third in Louisiana and close to one-quarter in Rhode Island, South Carolina and Texas, the firm’s data show. Nationwide, millions of homeowners use insurers rated by Demotech.” [Wall Street Journal, 2025-07-27]

  • Because GSEs Won’t Back Loans For Properties Insured By Less Than A-Rated Companies, Demotech’s High Ratings Have Provided A Lifeline To Insurers Looking To Enter THe Market. According to the Wall Street Journal, “A good rating from Demotech or one of its three main rivals—AM Best, S&P Global and Kroll Bond Rating Agency—can be crucial to an insurer’s ability to operate. Mortgage-finance giants Fannie Mae and Freddie Mac won’t back loans for properties that are insured by lower-rated companies, and lenders typically charge higher rates and require larger down payments for loans that Fannie and Freddie won’t touch. Home insurers that fail to meet that threshold can struggle to build market share. Consumer advocates say Demotech’s support for such startups allows the companies to essentially bet on the weather. Executives can pitch policies and collect salaries before their companies have built up enough reserves to withstand a disaster. ‘Demotech is helping regulators have players in their markets,’ said Amy Bach, executive director of advocacy group United Policyholders. ‘But consumers don’t want to trust their homes to highflying gamblers. They need companies that can protect their assets when a hurricane strikes.’” [Wall Street Journal, 2025-07-27]

  • Of The 17 Home Insurers Rated By Demotech That Have Failed Since 2017, All Had Been Rated “A” Within A Year Of Collapsing. According to the Wall Street Journal, “Demotech has been slower than its rivals to downgrade insurers heading toward insolvency, the Journal’s analysis found. Since 2017—the first year for which Demotech publishes historic ratings online—17 home insurers it rated have gone under, leaving behind at least $1.7 billion in unpaid claims, the analysis showed. Each had received a grade of A within a year of its collapse.” [Wall Street Journal, 2025-07-27]

The Petrelli’s Have Given Republicans A Lot Of Money

Code
using HTTP, JSON3, DataFrames, Dates
"""
    fetch_fec_contributions(contributor_name::String, contributor_employer::String; api_key::String=ENV["FEC_API_KEY"], per_page::Int64=100, max_pages::Int64=10)
Fetch individual contributions from the FEC API for a specific contributor
"""
function fetch_fec_contributions(contributor_name::String, contributor_employer::String; 
                                api_key::String=ENV["FEC_API_KEY"],
                                per_page::Int64=100,
                                max_pages::Int64=10)
    
    # FEC API base URL
    base_url = "https://api.open.fec.gov/v1"
    endpoint = "/schedules/schedule_a/"
    
    # Initialize empty array to store all results
    all_results = []
    
    # Parameters for the API request
    params = Dict(
        "api_key" => api_key,
        "contributor_name" => contributor_name,
        "contributor_employer" => contributor_employer,
        "per_page" => per_page,
        "sort" => "-contribution_receipt_date",
        "sort_nulls_last" => "true"
    )
    
    # Track pagination
    page = 1
    total_pages = 1
    
    println("Fetching contributions for $contributor_name from $contributor_employer...")
    
    while page <= min(total_pages, max_pages)
        params["page"] = page
        
        # Build query string
        query_string = join(["$k=$(HTTP.escapeuri(string(v)))" for (k, v) in params], "&")
        url = "$base_url$endpoint?$query_string"
        
        try
            # Make API request
            response = HTTP.get(url)
            data = JSON3.read(String(response.body))
            
            # Extract results
            results = get(data, :results, [])
            append!(all_results, results)
            
            # Update pagination info
            pagination = get(data, :pagination, Dict())
            total_pages = get(pagination, :pages, 1)
            total_count = get(pagination, :count, 0)
            
            println("Page $page of $total_pages fetched ($(length(results)) records)")
            
            # If we've fetched all results, break
            if page >= total_pages
                break
            end
            
            page += 1
            
            # Be respectful of API rate limits
            sleep(0.1)
            
        catch e
            println("Error fetching data: $e")
            break
        end
    end
    
    println("Total records fetched: $(length(all_results))")
    
    # Convert to DataFrame
    if isempty(all_results)
        return DataFrame()
    end
    
    # Extract relevant fields from the results
    df_data = []
    
    for result in all_results
        # Handle nested committee object
        committee_name = if haskey(result, :committee) && haskey(result.committee, :name)
            result.committee.name
        else
            missing
        end
        
        push!(df_data, Dict(
            "committee_id" => get(result, :committee_id, missing),
            "committee_name" => committee_name,
            "contributor_name" => get(result, :contributor_name, missing),
            "contributor_employer" => get(result, :contributor_employer, missing),
            "contributor_occupation" => get(result, :contributor_occupation, missing),
            "contributor_city" => get(result, :contributor_city, missing),
            "contributor_state" => get(result, :contributor_state, missing),
            "contributor_zip" => get(result, :contributor_zip, missing),
            "contribution_receipt_date" => get(result, :contribution_receipt_date, missing),
            "contribution_receipt_amount" => get(result, :contribution_receipt_amount, missing),
            "receipt_type" => get(result, :receipt_type, missing),
            "receipt_type_full" => get(result, :receipt_type_full, missing),
            "entity_type" => get(result, :entity_type, missing),
            "entity_type_desc" => get(result, :entity_type_desc, missing),
            "two_year_transaction_period" => get(result, :two_year_transaction_period, missing),
            "image_number" => get(result, :image_number, missing),
            "pdf_url" => get(result, :pdf_url, missing)
        ))
    end
    
    df = DataFrame(df_data)
    
    # Sort by date (most recent first)
    if !isempty(df) && "contribution_receipt_date" in names(df)
        sort!(df, :contribution_receipt_date, rev=true)
    end
    
    return df
end

"""
    display_large_contributions(df::DataFrame, threshold::Float64=2000.0)
Display contributions over a specified amount threshold
"""
function display_large_contributions(df::DataFrame, threshold::Float64=2000.0)
    # Filter for contributions over threshold
    large_contributions = filter(row -> row.contribution_receipt_amount > threshold, df)
    
    if isempty(large_contributions)
        println("No contributions over \$$threshold found.")
        return nothing
    end
    
    # Sort by date (most recent first)
    sort!(large_contributions, :contribution_receipt_date, rev=true)
    
    println("\n## Contributions Over \$$threshold")
    println("\nFound $(nrow(large_contributions)) contributions over \$$threshold")
    println("Total amount of large contributions: \$$(sum(large_contributions.contribution_receipt_amount))")
    
    # Create a display-friendly DataFrame
    display_df = select(large_contributions,
        :contribution_receipt_date => "Date",
        :contribution_receipt_amount => "Amount",
        :committee_name => "Committee",
        :contributor_city => "City",
        :contributor_state => "State",
        :two_year_transaction_period => "Cycle"
    )
    
    # Format the amount column
    display_df[!, "Amount"] = ["\$$(round(amt, digits=2))" for amt in display_df.Amount]
    
    return display_df
end
lc=display_large_contributions(fetch_fec_contributions("Petrelli", "Demotech"))

Fetching contributions for Petrelli from Demotech… Page 1 of 2 fetched (100 records) Page 2 of 2 fetched (100 records) Total records fetched: 200

Contributions Over $2000.0

Found 24 contributions over $2000.0 Total amount of large contributions: $109640.0

24×6 DataFrame
Row Date Amount Committee City State Cycle
String String String String String Int64
1 2025-04-11 $3500.0 HUSTED FOR SENATE COLUMBUS OH 2026
2 2025-04-11 $3500.0 HUSTED FOR SENATE COLUMBUS OH 2026
3 2025-04-11 $5000.0 JOBS OPPORTUNITY NOW POLITICAL ACTION COMMITTEE COLUMBUS OH 2026
4 2025-04-11 $15000.0 TEAM HUSTED COLUMBUS OH 2026
5 2025-04-11 $3500.0 HUSTED FOR SENATE COLUMBUS OH 2026
6 2025-04-11 $3500.0 HUSTED FOR SENATE COLUMBUS OH 2026
7 2025-04-11 $5000.0 JOBS OPPORTUNITY NOW POLITICAL ACTION COMMITTEE COLUMBUS OH 2026
8 2025-04-11 $15000.0 TEAM HUSTED COLUMBUS OH 2026
9 2024-09-30 $3300.0 DAVIDSON FOR CONGRESS COLUMBUS OH 2024
10 2024-09-30 $3300.0 DAVIDSON FOR CONGRESS COLUMBUS OH 2024
11 2020-06-18 $2020.0 TRUMP MAKE AMERICA GREAT AGAIN COMMITTEE COLUMBUS OH 2020
12 2020-06-18 $2020.0 TRUMP MAKE AMERICA GREAT AGAIN COMMITTEE COLUMBUS OH 2020
13 2016-06-12 $2700.0 DONALD J. TRUMP FOR PRESIDENT, INC. DUBLIN OH 2016
14 2016-06-12 $2700.0 DONALD J. TRUMP FOR PRESIDENT, INC. DUBLIN OH 2016
15 2013-09-27 $2600.0 NATIONAL ASSOCIATION OF MUTUAL INSURANCE COMPANIES PAC DUBLIN OH 2014
16 2013-09-27 $2600.0 NATIONAL ASSOCIATION OF MUTUAL INSURANCE COMPANIES PAC DUBLIN OH 2014
17 2013-06-07 $2600.0 STIVERS FOR CONGRESS DUBLIN OH 2014
18 2013-06-07 $2600.0 STIVERS FOR CONGRESS DUBLIN OH 2014
19 2013-05-03 $2600.0 TED CRUZ FOR SENATE COLUMBUS OH 2014
20 2013-05-03 $2600.0 TED CRUZ FOR SENATE COLUMBUS OH 2014
21 2013-03-06 $6000.0 TED CRUZ FOR SENATE COLUMBUS OH 2014
22 2013-03-06 $6000.0 TED CRUZ FOR SENATE COLUMBUS OH 2014
23 2013-03-06 $6000.0 TED CRUZ FOR SENATE COLUMBUS OH 2014
24 2013-03-06 $6000.0 TED CRUZ FOR SENATE COLUMBUS OH 2014

How This Could Come Back

Trump is currently trying to privatize Fannie and Freddie, who insure mortgages. Either, this will mean that the new private GSEs would face a choice: continue to treat Demotech-rated insurers as well rated, or refuse to accept them. Because Trump has been explicit about how he sees the government continuing to provide a guarantee, that would be profitable to the new owners, who would be secured from their losses. On the other hand, their fiduciary duty to their new shareholders could require that they stop accepting Demotech’s ratings, meaning that homeowners in those high-risk areas would be in a world of trouble.