Projects About Contact

EU Defense Stocks in a Changing World (March 2025)¶

Context¶

During the period of the Analysis (March 2023 to March 2025), several factors influenced the defense sector:

  1. Ongoing geopolitical tensions.
  2. Increased defense spending in Europe with countries aiming to reach/exceed the NATO target of 2% GDP on defense.
  3. Technological advancements in areas like cybersecurity, AI, and autonomous systems.
  4. Potential shifts in international defense cooperation and trade agreements with the start of Trump second term in the US.

Stocks Analyzed:¶

  • Thales (HO.PA): French multinational specializing in aerospace, defense, and security.
  • Dassault (AM.PA): French aircraft manufacturer known for military and business jets.
  • Rheinmetall (RHM.DE): German defense contractor and automotive parts supplier.
  • Chemring (CHG.L): British manufacturer of defense equipment and systems.
  • Lockheed Martin (LMT): American aerospace, defense, arms, security, and advanced technology company.

Key Takeaways¶

  1. Increased European defense spending and geopolitical tensions drove growth for European companies.
  2. Rheinmetall: top performer with exceptional returns, higher volatility and risk.
  3. Lockheed Martin underperformed due to reduced European contracts and shifting US priorities.
  4. Thales and Dassault showed steady growth and solid risk-adjusted returns.
  5. Clear divergence between European and American stocks, indicating a shift towards European self-reliance.

Import Librairies¶

In [10]:
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from datetime import datetime, timedelta

Load the Data and set up Parameters¶

In [11]:
stocks = ['HO.PA', 'AM.PA', 'RHM.DE', 'CHG.L','LMT']
names = ['Thales(FR)', 'Dassault(FR)', 'Rheinmetall(DE)', 'Chemring(EN)', 'Lockheed Martin(US)']

end_date = '2025-03-04'
start_date = '2023-03-03'

data = yf.download(stocks, start=start_date, end=end_date)['Close']

ticker_to_name = dict(zip(stocks, names))   # make sure names align with tickers
data.rename(columns=ticker_to_name, inplace=True)
[*********************100%***********************]  5 of 5 completed

Cumulative Returns Analysis¶

In [ ]:
returns = data.pct_change().dropna()

cumulative_returns = (1 + returns).cumprod() - 1

cumulative_returns.plot()
plt.title("Cumulatitive Returns of Defense Stocks")
plt.xlabel("Date")
plt.xticks(rotation=45)
plt.ylabel("Cumulative Returns")
plt.legend(loc='upper left')
plt.show()

Overall Trend: European defense stocks show significant growth, especially in the last few months, aligning with the increased defense spending and heightened geopolitical tensions.

Top Performer: Rheinmetall appears to have the highest cumulative returns, showing exceptional growth.

Steady Growth: Thales and Dassault demonstrate steady growth throughout the period, with acceleration towards the end.

Lockheed Martin: The American stock shows more modest growth compared to its European counterparts, and some decline in recent months.

The growth of European defense stocks can be partly attributed to their focus on emerging technologies. The analyzed companies have made significant investments in areas such as AI, cybersecurity, and autonomous systems, which are becoming increasingly crucial in modern defense strategies.

Normalized Returns (Last 6 Months)¶

In [13]:
cumulative_ret_6_months = cumulative_returns.loc[cumulative_returns.index >= cumulative_returns.index[-1] - pd.DateOffset(months=6)]

norm_cumul_ret_6_months = (1 + cumulative_ret_6_months) / (1 + cumulative_ret_6_months.iloc[0])

norm_cumul_ret_6_months.plot()
plt.title("Normalized Cumulatitive Returns of Defense Stocks (Last 6 Months)")
plt.xlabel("Date")
plt.xticks(rotation=45)
plt.ylabel("Cumulative Returns")
plt.legend(loc='upper left')
plt.show()
No description has been provided for this image

1. Divergence

Clear divergence between European and American defense stocks. This could be due to:

  • Increased European defense budget and shift towards self-reliance
  • Potential changes in US defense policies and spending

2. European Stock Surge

All European stocks show a sudden increase, with Rheinmetall leading the way. This can be linked to ongoing conflicts and tensions, driving demand for defense products.

3. Thales and Dassault

Both French companies show similar growth, possibly benefiting from France's strong position in European defense.

4. Lockheed Martin Decline

The decrease in Lockheed Martin's stock could be due to:

  • Shift of European contracts to local suppliers
  • Changes in US defense spending or policies
  • Specific company issues or contract losses

Clear shift towards European defense companies, possibly indicating a long-term trend of increased European investments in domestic defense capabilities. The sudden rise in recent months suggests that investors are anticipating sustained growth in the European defense sector.

Correlation Analysis¶

In [14]:
correlation = returns.corr()

plt.figure(figsize=(10,6))
sns.heatmap(correlation, annot=True)
plt.title("Correlation Matrix of Defense Stock Returns")
plt.gca().xaxis.set_ticks_position('top')
plt.xlabel('')
plt.ylabel('')

plt.show()
No description has been provided for this image

1. European Stock Clustering

Strong correlations between Dassault, Thales and Rheinmetall reflecting the broader trend of increased European defense spending.

2. Chemring's Independence

Chemring's relatively lower correlations with other Europeans stocks indicate that it may behave differently due to its specialized focus or due to not being part of the EU anymore.

3. Lockheed Martin's Isolation

Low correlation with European stocks highlighting distinct market dynamics due to different geopolitical factors, US-centric defense policies, and reliance on US government contracts.

Performance Metrics Analysis¶

In [15]:
annualized_returns = (1 + returns.mean())**252 - 1
volatility = returns.std() * np.sqrt(252)
sharpe_ratio = returns.mean() / volatility
max_drawdown = (cumulative_returns / cumulative_returns.cummax() - 1).min()

summary = pd.DataFrame({
    'Annualized Return': annualized_returns,
    'Volatility': volatility,
    'Sharpe Ratio': sharpe_ratio,
    'Max Drawdown': max_drawdown
})

summary_sorted = summary.sort_values('Sharpe Ratio', ascending=False)

# Plot the Summary in Subplots (one for each metric)
metrics = ['Annualized Return', 'Volatility', 'Sharpe Ratio', 'Max Drawdown']

fig, axes = plt.subplots(2, 2, figsize=(15,12))

for i, metric in enumerate(metrics):
    ax = axes[i // 2, i % 2]
    bars = summary_sorted[metric].plot(kind='bar', ax=ax)
    ax.set_title(metric)
    ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')
    ax.set_xlabel('')

    for bar in bars.patches:
        ax.text(
            bar.get_x() + bar.get_width() / 2, 
            bar.get_height(),  
            f"{bar.get_height():.4f}", 
            ha='center', va='bottom', fontsize=10
        )

plt.tight_layout()
plt.show()
No description has been provided for this image

Annualized Return¶

  • Rheinmetall: 127.13%, far surpassing its peers, aligning with Germany's commitment to modernizing its military and meeting NATO targets.

  • Thales and Dassault: 35.83% and 37.88% respectively, reflecting France's leadership in European defense and its push for self-reliance amidst shifting NATO dynamics. In addition, Thales has benefited from cybersecurity contracts while Dassault launched Albatros, a maritime surveillance aircraft.

  • Chemring: 22.14%, potentially influenced by its niche focus on countermeasures and post-Brexit trade dynamics. Note: as tension rise globally, chemring's electronic warfare systems may see increased demand

  • Lockheed Martin: 1.68%, reflecting challenges in maintaining European contracts due to geopolitical tensions and Trump's policies.

Volatility¶

  • Rheinmetall: 34.91% (high) reflecting sensitivity to geopolitical tensions like the Ukraine conflict.

  • Thales and Dassault: 25.84% and 27.95% respectively (moderate) driven by steady demand for aerospace and cybersecurity products.

  • Chemring: 27.25% (moderate) influenced by its niche focus.

  • Lockheed Martin: 18.80% (lowest) but at the cost of significantly lower returns.

Sharpe Ratio¶

  • Rheinmetall: Best risk-adjusted return (0.0093)

  • Thales: Solid ratio (0.0047) indicating consistent performance

  • Dassault: Same observation than Thales with solid sharpe ratio (0.0046)

  • Lockheed Martin: Lowest (0.0004) highlighting underperformance

Maximum Drawdown¶

  • Largest Drawdown: Lockheed Martin (6.27%) tied to reduced European contracts and shifting US priorities

  • Smallest Drawdown: Rheinmetall (2.23%) showing resilience amid geopolitical instability

Note that while European defense stocks are currently outperforming, the long-term sustainability of this trend depends on several factors. These include the ability of European countries to maintain increased defense spending in the face of potential economic constraints, and the impact of supply chain challenges.

Monte Carlo Simulation and Value at Risk 95¶

Note: The VaR is calculated based on the simulated future prices a year from now.

In [ ]:
# Monte Carlo Simulation
np.random.seed(82)      # to get the same results after repeating the process
# Function for Generating Simulations
def monte_carlo_simulation(stock_data, num_simulations=1000, num_days=252):
    last_price = stock_data.iloc[-1]
    daily_volatility = stock_data.pct_change().std()
   
    simulations = np.zeros((num_days, num_simulations))

    for i in range(num_simulations):
        price_series = [last_price]

        for _ in range(num_days):
            price = price_series[-1] * (1 + np.random.normal(0, daily_volatility))
            price_series.append(price)

        simulations[:,i] = price_series[1:]
    
    return simulations

# Monte Carlo Results
monte_carlo_results = {}

for stock in names:
    monte_carlo_results[stock] = monte_carlo_simulation(data[stock])

# Plot the Monte Carlo Simulations in Subplots (one for each stock)
fig, axes = plt.subplots(2, 3, figsize=(20, 15))
axes = axes.flatten()

for i, (stock, simulation) in enumerate(monte_carlo_results.items()):
    ax = axes[i]
    ax.plot(simulation, alpha=0.1, color='blue')
    ax.set_title(f"{stock} Monte Carlo Simulation")
    ax.set_xlabel("Days")
    ax.set_ylabel("Stock Price")

if len(monte_carlo_results) < 6:
    axes[-1].axis('off')

plt.tight_layout()
plt.show()

# Value at Risk (Var 95)
confidence_level = 5

var_results = {}
mean_results= {}

for stock in names:
    final_prices = monte_carlo_results[stock][-1,:]
    mean_results[stock] = np.mean(final_prices)
    var_results[stock] = np.percentile(final_prices, confidence_level)

mean_df = pd.DataFrame.from_dict(mean_results, orient='index', columns=['Average Final Price'])
var_df = pd.DataFrame.from_dict(var_results, orient='index', columns=['Volatility'])

last_prices = data.iloc[-1]
var_df['VaR %'] = ((last_prices - var_df['Volatility']) / last_prices) * 100
var_df['Average Final Price'] = mean_df['Average Final Price']
var_df = var_df[['Average Final Price', 'Volatility', 'VaR %']]

print(f"Value at Risk (95% confidence): \n{var_df}")
  • Riskiest Stock: Rheinmetall, reflecting significant exposure to geopolitical tensions and defense spending surges, which Rheinmetall is depending on.

  • Lowest Risk: Lockheed Martin, for which delivery plans in 2025 lead to steady production outlook.

  • Thales, Dassault, and Chemring fall into a similar risk category with comparable VaR around 38%, indicating moderate risk but, like Rheinmetall, influenced by geopolitical tensions.

Next Steps for Investors¶

  1. Monitor geopolitical developments and defense policy shifts in Europe and the US.
  2. Track implementation of European Defense Fund and its impact.
  3. Look out for emerging technologies in defense (AI, autonomous systems etc.).
  4. Stay informed on cross-border collaborations in Europe and potential supply chain challenges.
  5. Assess the long-term sustainability of increased European defense spending.
View the GitHub Repository

© 2025 Chloe's Portfolio. All Rights Reserved.