SECTION 1: LEARNING OBJECTIVES

By the end of this lesson, you will be able to:

  • Understand the evolution of wealth management from traditional to digital.

  • Define robo-advisory and its role in modern wealth management.

  • Identify the key players in the robo-advisory market.

  • Understand the technology stack behind robo-advisory platforms.

  • Apply Modern Portfolio Theory (MPT) to digital wealth management.

  • Implement portfolio optimisation using Python.

  • Understand the regulatory framework for digital wealth management.

  • Develop a robo-advisory strategy for a bank.


SECTION 2: THE EVOLUTION OF WEALTH MANAGEMENT

2.1 Historical Evolution
 
 
Era Characteristics Key Developments
Traditional Wealth Management Human advisors, high-net-worth focus. Personal relationships, high fees.
Digital Wealth Management Online platforms, self-directed investing. Online trading, low-cost ETFs.
Robo-Advisory Algorithm-driven, automated investing. Automated rebalancing, tax-loss harvesting.
Hybrid Advisory Human + digital advice. Combination of human advisors and algorithms.
AI-Powered Wealth Management AI-driven personalisation. Generative AI, predictive analytics.
2.2 Wealth Management Segments
 
 
Segment Description Key Characteristics
Mass Market Everyday investors. Low assets, self-directed, low fees.
Mass Affluent Middle-income investors. Moderate assets, robo-advisory, hybrid advice.
High-Net-Worth Wealthy individuals. High assets, personalised advice, human advisors.
Ultra-High-Net-Worth Extreme wealth. Family offices, bespoke strategies.

SECTION 3: ROBO-ADVISORY

3.1 What is Robo-Advisory?

Definition: Robo-advisory is a digital platform that provides automated, algorithm-driven financial planning and investment services with little to no human supervision.

Key Features:

 
 
Feature Description Benefit
Automated Investing Algorithmic portfolio management. Low cost, accessible.
Goal-Based Planning Tailored to customer goals. Personalised, outcome-focused.
Auto-Rebalancing Maintain target asset allocation. Stay on track, reduce risk.
Tax-Loss Harvesting Offset gains with losses. Tax efficiency.
Low Fees Fraction of traditional advisor fees. Cost savings.
Low Minimums Low account minimums. Accessible to mass market.
User-Friendly Interface Intuitive app/website. Easy to use.
3.2 Robo-Advisory Market Landscape
 
 
Player Type Key Features
Betterment Pure-play robo-advisor. Goal-based investing, tax-loss harvesting.
Wealthfront Pure-play robo-advisor. Automated investing, financial planning.
Nutmeg UK-based robo-advisor. Managed portfolios, ISAs, pensions.
SoFi Invest Hybrid (bank + robo). Automated investing, active trading.
Vanguard Personal Advisor Hybrid (human + digital). Human advisors + robo capabilities.
Schwab Intelligent Portfolios Hybrid. No advisory fee, ETF portfolios.
Acorns Micro-investing. Round-up savings, automated investing.
Robinhood Commission-free trading. Self-directed, fractional shares.
3.3 Robo-Advisory Technology Stack
text
┌─────────────────────────────────────────────────────────────────────────────┐
│                    ROBO-ADVISORY TECHNOLOGY STACK                         │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    CUSTOMER INTERFACE                               │   │
│  │  (Mobile App, Web Portal, Chatbot)                                  │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                    │                                        │
│                                    v                                        │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    INVESTMENT ALGORITHM                             │   │
│  │  (Asset allocation, rebalancing, tax-loss harvesting)              │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                    │                                        │
│                                    v                                        │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    PORTFOLIO MANAGEMENT                             │   │
│  │  (Portfolio construction, optimisation, monitoring)                │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                    │                                        │
│                                    v                                        │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    TRADING AND EXECUTION                            │   │
│  │  (Order placement, trade execution, settlement)                    │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                    │                                        │
│                                    v                                        │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    DATA AND ANALYTICS                               │   │
│  │  (Market data, customer data, analytics, risk management)          │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

SECTION 4: MODERN PORTFOLIO THEORY (MPT)

4.1 Key Concepts
 
 
Concept Description Formula
Expected Return Weighted average of asset returns. E(Rp)=∑wiE(Ri)
Portfolio Variance Risk of the portfolio. σp2=∑i∑jwiwjσij
Efficient Frontier Optimal portfolios with max return for given risk. Optimisation problem.
Capital Allocation Line Risk-free asset + risky portfolio. Linear combination.
Sharpe Ratio Return per unit of risk. E(Rp)−Rfσp
4.2 Portfolio Optimisation
text
┌─────────────────────────────────────────────────────────────────────────────┐
│                    PORTFOLIO OPTIMISATION                                 │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    1. DEFINE OBJECTIVES                             │   │
│  │  (Return target, risk tolerance, investment horizon)                │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                    │                                        │
│                                    v                                        │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    2. ASSET CLASS SELECTION                         │   │
│  │  (Equities, bonds, real estate, commodities, alternatives)          │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                    │                                        │
│                                    v                                        │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    3. OPTIMISATION                                  │   │
│  │  (Mean-variance optimisation, risk parity, black-litterman)        │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                    │                                        │
│                                    v                                        │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    4. IMPLEMENTATION                                │   │
│  │  (Portfolio construction, rebalancing, monitoring)                  │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

SECTION 5: REGULATORY FRAMEWORK

5.1 Key Regulations
 
 
Regulation Region Impact on Robo-Advisory
Fiduciary Duty US Advisors must act in client’s best interest.
MiFID II EU Suitability, appropriateness, and transparency.
ESG Regulations Global Sustainability disclosure requirements.
Data Protection Global GDPR, CCPA compliance.
Financial Promotions UK Marketing and communication rules.
5.2 Compliance Requirements
 
 
Requirement Description Implementation
Client Suitability Know your client (risk profile, goals). Client profiling, risk assessment.
Disclosure Clear communication of terms and risks. Plain language disclosure.
Best Execution Execute trades in client’s best interest. Trade monitoring, reporting.
Data Protection Protect client data. Encryption, access controls.
Conflict of Interest Disclose and manage conflicts. Clear policies, transparency.

SECTION 6: IMPLEMENTATION IN PYTHON – ROBO-ADVISORY TOOLS

python
# ===================================================================
# MODULE 1, LESSON 7: WEALTH MANAGEMENT AND ROBO-ADVISORY
# ===================================================================

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.optimize import minimize
from datetime import datetime
import warnings
warnings.filterwarnings('ignore')

print("="*70)
print("WEALTH MANAGEMENT AND ROBO-ADVISORY")
print("="*70)

# ----------------------------------------------------------------
# PART A: ASSET CLASS RETURNS AND RISKS
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART A: Asset Class Returns and Risks")
print("-"*60)

# Define asset classes and their characteristics
asset_classes = ['US Equities', 'International Equities', 'US Bonds', 
                 'International Bonds', 'Real Estate', 'Commodities', 'Cash']

# Expected returns (annual %)
returns = [0.09, 0.08, 0.04, 0.03, 0.06, 0.05, 0.02]

# Risk (volatility %)
volatilities = [0.18, 0.20, 0.06, 0.08, 0.12, 0.15, 0.02]

# Correlation matrix (simplified)
correlations = np.array([
    [1.00, 0.70, 0.10, 0.05, 0.40, 0.20, 0.00],
    [0.70, 1.00, 0.15, 0.08, 0.35, 0.25, 0.00],
    [0.10, 0.15, 1.00, 0.60, 0.20, 0.05, 0.05],
    [0.05, 0.08, 0.60, 1.00, 0.15, 0.05, 0.05],
    [0.40, 0.35, 0.20, 0.15, 1.00, 0.30, 0.05],
    [0.20, 0.25, 0.05, 0.05, 0.30, 1.00, 0.00],
    [0.00, 0.00, 0.05, 0.05, 0.05, 0.00, 1.00]
])

# Calculate covariance matrix
cov_matrix = np.diag(volatilities) @ correlations @ np.diag(volatilities)

# Create DataFrames
returns_df = pd.DataFrame({
    'Asset Class': asset_classes,
    'Expected Return (%)': returns,
    'Volatility (%)': volatilities
})

print("Asset Class Characteristics:")
print(returns_df.to_string(index=False))

# Visualise correlations
fig, ax = plt.subplots(figsize=(10, 8))
sns.heatmap(correlations, annot=True, fmt='.2f', cmap='coolwarm', 
            xticklabels=asset_classes, yticklabels=asset_classes, ax=ax)
ax.set_title('Asset Class Correlation Matrix')
plt.tight_layout()
plt.savefig('asset_correlations.png', dpi=300, bbox_inches='tight')
plt.show()
print("Asset correlation visualisation saved as 'asset_correlations.png'")

# ----------------------------------------------------------------
# PART B: PORTFOLIO OPTIMISATION
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART B: Portfolio Optimisation")
print("-"*60)

def portfolio_performance(weights, returns, cov_matrix):
    """Calculate portfolio return, volatility, and Sharpe ratio."""
    port_return = np.sum(returns * weights)
    port_volatility = np.sqrt(weights.T @ cov_matrix @ weights)
    return port_return, port_volatility

def negative_sharpe(weights, returns, cov_matrix, risk_free_rate=0.02):
    """Calculate negative Sharpe ratio for optimisation."""
    port_return, port_volatility = portfolio_performance(weights, returns, cov_matrix)
    return -(port_return - risk_free_rate) / port_volatility

# Optimise for maximum Sharpe ratio
n_assets = len(asset_classes)
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0, 1) for _ in range(n_assets))

# Initial guess (equal weight)
initial_weights = np.ones(n_assets) / n_assets

# Optimise
result = minimize(negative_sharpe, initial_weights, 
                  args=(returns, cov_matrix, 0.02),
                  method='SLSQP', bounds=bounds, constraints=constraints)

optimal_weights = result.x

# Calculate optimal portfolio performance
opt_return, opt_volatility = portfolio_performance(optimal_weights, returns, cov_matrix)
opt_sharpe = (opt_return - 0.02) / opt_volatility

# Create DataFrame with optimal weights
weights_df = pd.DataFrame({
    'Asset Class': asset_classes,
    'Weight (%)': optimal_weights * 100
}).sort_values('Weight (%)', ascending=False)

print("Optimal Portfolio (Max Sharpe Ratio):")
print(weights_df.to_string(index=False))
print(f"\nExpected Return: {opt_return*100:.2f}%")
print(f"Volatility: {opt_volatility*100:.2f}%")
print(f"Sharpe Ratio: {opt_sharpe:.3f}")

# ----------------------------------------------------------------
# PART C: EFFICIENT FRONTIER
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART C: Efficient Frontier")
print("-"*60)

# Generate efficient frontier
target_returns = np.linspace(0.02, 0.12, 100)
efficient_volatilities = []

for target in target_returns:
    constraints = (
        {'type': 'eq', 'fun': lambda x: np.sum(x) - 1},
        {'type': 'eq', 'fun': lambda x: x @ returns - target}
    )
    result = minimize(lambda x: x @ cov_matrix @ x, initial_weights,
                      method='SLSQP', bounds=bounds, constraints=constraints)
    if result.success:
        efficient_volatilities.append(np.sqrt(result.fun))
    else:
        efficient_volatilities.append(np.nan)

efficient_volatilities = np.array(efficient_volatilities)
valid_idx = ~np.isnan(efficient_volatilities)

# Visualise efficient frontier
fig, ax = plt.subplots(figsize=(12, 8))

# Plot efficient frontier
ax.plot(efficient_volatilities[valid_idx] * 100, target_returns[valid_idx] * 100, 
        'b-', linewidth=2, label='Efficient Frontier')

# Plot optimal portfolio
ax.scatter(opt_volatility * 100, opt_return * 100, 
           color='red', s=100, zorder=5, label='Optimal Portfolio (Max Sharpe)')

# Plot individual assets
for i, asset in enumerate(asset_classes):
    ax.scatter(volatilities[i] * 100, returns[i] * 100, 
               label=asset, s=50)

ax.set_xlabel('Volatility (%)')
ax.set_ylabel('Expected Return (%)')
ax.set_title('Efficient Frontier')
ax.legend(loc='best')
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('efficient_frontier.png', dpi=300, bbox_inches='tight')
plt.show()
print("Efficient frontier visualisation saved as 'efficient_frontier.png'")

# ----------------------------------------------------------------
# PART D: CLIENT RISK PROFILING
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART D: Client Risk Profiling")
print("-"*60)

def risk_profile(age, income, investment_horizon, risk_tolerance, financial_goals):
    """Determine client risk profile."""
    # Simple scoring model
    score = 0
    
    # Age factor
    if age < 30:
        score += 3
    elif age < 45:
        score += 2
    elif age < 60:
        score += 1
    else:
        score += 0
    
    # Income factor
    if income > 150000:
        score += 2
    elif income > 75000:
        score += 1
    
    # Investment horizon factor
    if investment_horizon > 10:
        score += 3
    elif investment_horizon > 5:
        score += 2
    elif investment_horizon > 2:
        score += 1
    
    # Risk tolerance factor
    score += risk_tolerance  # 1-5 scale
    
    # Financial goals factor
    if financial_goals.lower() in ['growth', 'aggressive']:
        score += 3
    elif financial_goals.lower() in ['balanced', 'moderate']:
        score += 2
    else:
        score += 1
    
    # Determine profile
    if score >= 10:
        profile = 'Aggressive'
        equity_allocation = 0.80
        bond_allocation = 0.10
        alternative_allocation = 0.10
    elif score >= 7:
        profile = 'Moderate'
        equity_allocation = 0.60
        bond_allocation = 0.30
        alternative_allocation = 0.10
    else:
        profile = 'Conservative'
        equity_allocation = 0.30
        bond_allocation = 0.60
        alternative_allocation = 0.10
    
    return {
        'Profile': profile,
        'Equity Allocation': equity_allocation,
        'Bond Allocation': bond_allocation,
        'Alternative Allocation': alternative_allocation,
        'Score': score
    }

# Example clients
clients = [
    {'name': 'Young Professional', 'age': 28, 'income': 85000, 'horizon': 20, 'tolerance': 4, 'goals': 'Growth'},
    {'name': 'Family Person', 'age': 40, 'income': 120000, 'horizon': 15, 'tolerance': 3, 'goals': 'Balanced'},
    {'name': 'Near Retiree', 'age': 58, 'income': 95000, 'horizon': 7, 'tolerance': 2, 'goals': 'Preservation'}
]

print("Client Risk Profiles:")
for client in clients:
    profile = risk_profile(client['age'], client['income'], client['horizon'], 
                          client['tolerance'], client['goals'])
    print(f"\n{client['name']}:")
    print(f"  Profile: {profile['Profile']}")
    print(f"  Equity Allocation: {profile['Equity Allocation']*100:.0f}%")
    print(f"  Bond Allocation: {profile['Bond Allocation']*100:.0f}%")
    print(f"  Alternative Allocation: {profile['Alternative Allocation']*100:.0f}%")

# ----------------------------------------------------------------
# PART E: ROBOT PORTFOLIO GENERATION
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART E: Robo-Portfolio Generation")
print("-"*60)

def generate_robot_portfolio(risk_profile, asset_classes, returns, cov_matrix):
    """Generate a portfolio based on risk profile."""
    # Define asset allocation based on risk profile
    if risk_profile == 'Aggressive':
        allocations = [0.35, 0.25, 0.10, 0.05, 0.15, 0.08, 0.02]  # US Equities, Intl Equities, US Bonds, Intl Bonds, Real Estate, Commodities, Cash
    elif risk_profile == 'Moderate':
        allocations = [0.25, 0.20, 0.20, 0.10, 0.10, 0.10, 0.05]
    else:  # Conservative
        allocations = [0.10, 0.10, 0.35, 0.20, 0.05, 0.05, 0.15]
    
    # Normalise
    allocations = np.array(allocations) / np.sum(allocations)
    
    # Calculate portfolio performance
    port_return, port_volatility = portfolio_performance(allocations, returns, cov_matrix)
    sharpe = (port_return - 0.02) / port_volatility
    
    # Create DataFrame
    portfolio_df = pd.DataFrame({
        'Asset Class': asset_classes,
        'Allocation (%)': allocations * 100
    })
    
    return {
        'Allocations': portfolio_df,
        'Expected Return': port_return,
        'Volatility': port_volatility,
        'Sharpe Ratio': sharpe
    }

# Generate portfolios for different risk profiles
for profile in ['Aggressive', 'Moderate', 'Conservative']:
    print(f"\n{profile} Portfolio:")
    portfolio = generate_robot_portfolio(profile, asset_classes, returns, cov_matrix)
    print(portfolio['Allocations'].to_string(index=False))
    print(f"Expected Return: {portfolio['Expected Return']*100:.2f}%")
    print(f"Volatility: {portfolio['Volatility']*100:.2f}%")
    print(f"Sharpe Ratio: {portfolio['Sharpe Ratio']:.3f}")

# ----------------------------------------------------------------
# PART F: ROBO-ADVISORY BUSINESS MODEL
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART F: Robo-Advisory Business Model")
print("-"*60)

# Simulate a robo-advisory business model
client_segments = ['Mass Market', 'Mass Affluent', 'High-Net-Worth']
client_counts = [10000, 2000, 200]
avg_assets = [10000, 100000, 1000000]
fee_rates = [0.0025, 0.0035, 0.0050]
acquisition_cost = [50, 200, 500]
operating_cost = [10, 30, 100]

business_model = []
for i, segment in enumerate(client_segments):
    total_assets = client_counts[i] * avg_assets[i]
    revenue = total_assets * fee_rates[i]
    acq_cost = client_counts[i] * acquisition_cost[i]
    op_cost = client_counts[i] * operating_cost[i]
    profit = revenue - acq_cost - op_cost
    
    business_model.append({
        'Segment': segment,
        'Clients': client_counts[i],
        'Average Assets': f'${avg_assets[i]:,}',
        'Total Assets': f'${total_assets:,.0f}',
        'Fee Rate': f'{fee_rates[i]*100:.2f}%',
        'Revenue': f'${revenue:,.0f}',
        'Profit': f'${profit:,.0f}'
    })

bm_df = pd.DataFrame(business_model)
print("Robo-Advisory Business Model:")
print(bm_df.to_string(index=False))

# ----------------------------------------------------------------
# PART G: SUMMARY AND RECOMMENDATIONS
# ----------------------------------------------------------------

print("\n" + "="*70)
print("PART G: Summary and Recommendations")
print("="*70)

print("""
Wealth Management and Robo-Advisory – Key Takeaways:

1. Wealth management has evolved from traditional to digital and AI-powered.
2. Robo-advisory provides automated, low-cost, and accessible investment management.
3. Modern Portfolio Theory underpins portfolio optimisation.
4. Client risk profiling determines the appropriate asset allocation.
5. Regulatory compliance is essential (fiduciary duty, suitability, disclosure).
6. Business models vary from pure-play robo to hybrid human-digital.

Recommendations:
  - Build a robo-advisory platform with Modern Portfolio Theory.
  - Implement client risk profiling algorithms.
  - Offer hybrid advisory (human + digital) for mass affluent and HNW clients.
  - Ensure regulatory compliance (fiduciary duty, disclosure).
  - Invest in AI for personalisation and predictive analytics.
  - Develop an ESG investment offering.
""")

print("="*70)
print("END OF LESSON 7 – MODULE 1")
print("="*70)

SECTION 7: SUMMARY FOR THE DATA PRACTITIONER

  • Robo-advisory provides automated, low-cost investment management.

  • Modern Portfolio Theory underpins portfolio optimisation.

  • Client risk profiling determines the appropriate asset allocation.

  • Regulatory compliance (fiduciary duty, suitability, disclosure) is essential.

  • Business models vary from pure-play robo to hybrid human-digital.

  • AI and personalisation are the future of digital wealth management.


SECTION 8: RECOMMENDED NEXT STEPS

  1. Build a portfolio optimisation tool using Modern Portfolio Theory.

  2. Implement client risk profiling algorithms.

  3. Develop a robo-advisory platform prototype.

  4. Ensure regulatory compliance (fiduciary duty, disclosure).

  5. Invest in AI for personalisation.

  6. Prepare for Lesson 8: Digital Identity and Security in Banking.


[END OF LESSON 7 – MODULE 1]