SECTION 1: LEARNING OBJECTIVES

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

  • Define risk culture and its importance in digital banking.

  • Identify the key elements of a strong risk culture.

  • Apply risk governance frameworks – COSO, ISO 31000.

  • Implement risk appetite and tolerance statements.

  • Measure risk culture using key metrics.

  • Understand the role of leadership in risk culture.

  • Develop a risk culture strategy for a digital bank.


SECTION 2: WHAT IS RISK CULTURE?

2.1 Definition

Risk culture is the set of values, beliefs, and behaviours that shape how an organisation approaches risk. It influences how employees think about, communicate about, and act on risks.

2.2 Why Risk Culture Matters
 
 
Reason Description
Decision-Making Shapes risk decisions.
Compliance Influences compliance behaviour.
Reputation Protects reputation.
Performance Affects financial performance.
Regulatory Regulators assess risk culture.
2.3 Elements of a Strong Risk Culture
 
 
Element Description Implementation
Tone from the Top Leadership commitment to risk. CEO and board engagement.
Accountability Clear responsibility for risk. Risk roles and ownership.
Transparency Open communication about risk. Risk reporting, escalation.
Training Continuous risk education. Risk training programmes.
Incentives Rewarding risk-aware behaviour. Performance metrics.
Consequences Enforcement for risk failures. Disciplinary actions.

SECTION 3: RISK GOVERNANCE FRAMEWORK

3.1 Governance Components
 
 
Component Description Activities
Board Oversight Ultimate responsibility. Approve risk strategy, review reports.
Risk Committee Board committee. Oversee risk management.
CRO Chief Risk Officer. Lead risk function.
Risk Function Independent risk management. Risk assessment, monitoring.
Business Units First line of defence. Own and manage risks.
Internal Audit Third line of defence. Provide independent assurance.
3.2 Three Lines of Defence (Revisited)
 
 
Line Role Description
1st Line Business Units Own and manage risks.
2nd Line Risk Management Oversee and monitor risks.
3rd Line Internal Audit Independent assurance.

SECTION 4: RISK APPETITE AND TOLERANCE

4.1 Risk Appetite Statement

Risk Appetite is the amount of risk the bank is willing to take to achieve its strategic objectives.

Risk Tolerance is the specific, measurable limits for each risk category.

 
 
Risk Category Risk Appetite Risk Tolerance Current Status
Credit Moderate PD < 3% Within
Market Low VaR < 5% Within
Operational Low Loss < $10M Within
Liquidity Low LCR > 100% Exceeded
Cybersecurity Very Low Zero breaches Within
Model Low Error < 0.5% Within
4.2 Risk Appetite Framework
text
┌─────────────────────────────────────────────────────────────────────────────┐
│                    RISK APPETITE FRAMEWORK                                │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    STRATEGIC OBJECTIVES                             │   │
│  │  (Business goals and objectives)                                   │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                    │                                        │
│                                    v                                        │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    RISK APPETITE STATEMENT                          │   │
│  │  (Overall risk appetite)                                            │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                    │                                        │
│                                    v                                        │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    RISK TOLERANCES                                  │   │
│  │  (Specific limits by risk category)                                 │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                    │                                        │
│                                    v                                        │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    LIMITS & ESCALATION                             │   │
│  │  (Breaches, escalation procedures)                                  │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

SECTION 5: MEASURING RISK CULTURE

5.1 Risk Culture Metrics
 
 
Metric Description Target
Risk Awareness Employee awareness of risk. > 90%
Risk Training Completion % of employees trained. > 95%
Risk Incident Reporting Number of incidents reported. Increasing.
Whistleblowing Rate Reports of misconduct. 2-5% of employees.
Risk Culture Score Survey-based score. > 4.0/5.
5.2 Risk Culture Survey
 
 
Dimension Question Score (1-5)
Leadership Leaders demonstrate commitment to risk. 4.2
Accountability Employees are accountable for risk. 3.8
Transparency Risk is discussed openly. 3.5
Training Risk training is effective. 4.0
Incentives Risk-aware behaviour is rewarded. 3.2

SECTION 6: IMPLEMENTATION IN PYTHON – RISK CULTURE TOOLS

python
# ===================================================================
# MODULE 8, LESSON 8: RISK CULTURE AND GOVERNANCE
# ===================================================================

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

print("="*70)
print("RISK CULTURE AND GOVERNANCE IN DIGITAL BANKING")
print("="*70)

# ----------------------------------------------------------------
# PART A: RISK CULTURE ASSESSMENT
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART A: Risk Culture Assessment")
print("-"*60)

culture_dimensions = {
    'Leadership Commitment': {'Current Score': 3, 'Target Score': 5, 'Priority': 'High'},
    'Accountability': {'Current Score': 3, 'Target Score': 5, 'Priority': 'High'},
    'Transparency': {'Current Score': 3, 'Target Score': 5, 'Priority': 'High'},
    'Training and Awareness': {'Current Score': 3, 'Target Score': 5, 'Priority': 'High'},
    'Incentives and Rewards': {'Current Score': 2, 'Target Score': 4, 'Priority': 'Medium'},
    'Consequences': {'Current Score': 3, 'Target Score': 5, 'Priority': 'High'},
    'Communication': {'Current Score': 3, 'Target Score': 5, 'Priority': 'High'},
    'Learning Culture': {'Current Score': 2, 'Target Score': 4, 'Priority': 'Medium'}
}

culture_df = pd.DataFrame(culture_dimensions).T
print("Risk Culture Assessment:")
print(culture_df)

# Visualise
fig, ax = plt.subplots(figsize=(10, 6))
dimensions = list(culture_df.index)
current = culture_df['Current Score'].tolist()
target = culture_df['Target Score'].tolist()

x = np.arange(len(dimensions))
width = 0.35

ax.barh(x - width/2, current, width, label='Current', color='blue', alpha=0.7)
ax.barh(x + width/2, target, width, label='Target', color='green', alpha=0.7)

ax.set_yticks(x)
ax.set_yticklabels(dimensions)
ax.set_xlabel('Maturity Score (1-5)')
ax.set_title('Risk Culture Assessment')
ax.legend()
ax.grid(True, alpha=0.3, axis='x')

plt.tight_layout()
plt.savefig('risk_culture.png', dpi=300, bbox_inches='tight')
plt.show()
print("Risk culture visualisation saved as 'risk_culture.png'")

# ----------------------------------------------------------------
# PART B: RISK GOVERNANCE STRUCTURE
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART B: Risk Governance Structure")
print("-"*60)

governance_structure = {
    "Board of Directors": {
        "Responsibilities": ["Approve risk strategy", "Oversee risk management", "Review reports"]
    },
    "Risk Committee": {
        "Responsibilities": ["Oversee risk activities", "Review risk appetite", "Monitor compliance"]
    },
    "Chief Risk Officer (CRO)": {
        "Responsibilities": ["Lead risk function", "Report to board", "Manage risk teams"]
    },
    "Risk Management Function": {
        "Responsibilities": ["Risk assessment", "Risk monitoring", "Risk reporting"]
    },
    "Business Units (1st Line)": {
        "Responsibilities": ["Own and manage risks", "Implement controls", "Comply with policies"]
    },
    "Internal Audit (3rd Line)": {
        "Responsibilities": ["Independent assurance", "Audit risk processes", "Report findings"]
    }
}

print("Risk Governance Structure:")
for role, details in governance_structure.items():
    print(f"\n{role}:")
    print("  Responsibilities:")
    for resp in details['Responsibilities']:
        print(f"    • {resp}")

# ----------------------------------------------------------------
# PART C: RISK APPETITE STATEMENT
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART C: Risk Appetite Statement")
print("-"*60)

risk_appetite = pd.DataFrame({
    'Risk Category': ['Credit', 'Market', 'Operational', 'Liquidity', 'Cybersecurity', 'Model', 'Third-Party'],
    'Risk Appetite': ['Moderate', 'Low', 'Low', 'Low', 'Very Low', 'Low', 'Low'],
    'Risk Tolerance': [
        'PD < 3%',
        'VaR < 5%',
        'Loss < $10M',
        'LCR > 100%',
        'Zero breaches',
        'Model error < 0.5%',
        'Vendor failures < 2'
    ],
    'Current Status': ['Within', 'Within', 'Within', 'Exceeded', 'Within', 'Within', 'Within']
})

print("Risk Appetite Statement:")
print(risk_appetite.to_string(index=False))

# ----------------------------------------------------------------
# PART D: RISK INCIDENT REPORTING
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART D: Risk Incident Reporting")
print("-"*60)

# Simulate incident data
np.random.seed(42)
n_incidents = 50

incident_data = pd.DataFrame({
    'incident_id': range(1, n_incidents + 1),
    'date': [datetime.now() - timedelta(days=np.random.randint(0, 365)) for _ in range(n_incidents)],
    'category': np.random.choice(['Credit', 'Market', 'Operational', 'Liquidity', 'Cybersecurity', 'Model', 'Third-Party'], n_incidents),
    'severity': np.random.choice(['Low', 'Medium', 'High', 'Critical'], n_incidents, p=[0.3, 0.3, 0.25, 0.15]),
    'status': np.random.choice(['Closed', 'Resolved', 'In Progress', 'Open'], n_incidents, p=[0.4, 0.3, 0.2, 0.1]),
    'time_to_resolve': np.random.gamma(2, 3, n_incidents).clip(0.1, 24)
})

print("Incident Data Sample:")
print(incident_data.head())

# Summary
incident_summary = incident_data.groupby('category').agg({
    'incident_id': 'count',
    'severity': lambda x: x.value_counts().index[0],
    'time_to_resolve': 'mean'
}).round(2)
incident_summary.columns = ['Count', 'Most Common Severity', 'Avg Time to Resolve (hours)']

print("\nIncident Summary:")
print(incident_summary)

# Visualise
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# Incidents by Category
ax = axes[0, 0]
category_counts = incident_data['category'].value_counts()
ax.bar(category_counts.index, category_counts.values, color='teal', alpha=0.7)
ax.set_xlabel('Category')
ax.set_ylabel('Count')
ax.set_title('Incidents by Category')
ax.tick_params(axis='x', rotation=45)
ax.grid(True, alpha=0.3)

# Severity Distribution
ax = axes[0, 1]
severity_counts = incident_data['severity'].value_counts()
colors = {'Low': 'green', 'Medium': 'orange', 'High': 'red', 'Critical': 'darkred'}
ax.bar(severity_counts.index, severity_counts.values, 
       color=[colors.get(s, 'gray') for s in severity_counts.index], alpha=0.7)
ax.set_xlabel('Severity')
ax.set_ylabel('Count')
ax.set_title('Incident Severity')
ax.grid(True, alpha=0.3)

# Resolution Time by Severity
ax = axes[1, 0]
incident_data.boxplot(column='time_to_resolve', by='severity', ax=ax)
ax.set_title('Resolution Time by Severity')
ax.set_xlabel('Severity')
ax.set_ylabel('Time to Resolve (hours)')
ax.grid(True, alpha=0.3)

# Status Distribution
ax = axes[1, 1]
status_counts = incident_data['status'].value_counts()
ax.pie(status_counts.values, labels=status_counts.index, autopct='%1.1f%%')
ax.set_title('Incident Status')

plt.tight_layout()
plt.savefig('incident_reporting.png', dpi=300, bbox_inches='tight')
plt.show()
print("Incident reporting visualisation saved as 'incident_reporting.png'")

# ----------------------------------------------------------------
# PART E: RISK CULTURE METRICS
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART E: Risk Culture Metrics Dashboard")
print("-"*60)

culture_metrics = pd.DataFrame({
    'Metric': [
        'Risk Awareness Score',
        'Risk Training Completion',
        'Risk Incident Reporting Rate',
        'Whistleblowing Rate',
        'Risk Culture Score',
        'Leadership Commitment Score',
        'Accountability Score',
        'Transparency Score'
    ],
    'Current Value': [
        '78%',
        '72%',
        '3.2/5',
        '1.2%',
        '3.6/5',
        '3.8/5',
        '3.5/5',
        '3.2/5'
    ],
    'Target Value': [
        '> 90%',
        '> 95%',
        '> 4.0/5',
        '> 2.0%',
        '> 4.5/5',
        '> 4.5/5',
        '> 4.5/5',
        '> 4.5/5'
    ],
    'Status': ['🟡', '🟡', '🟡', '🟡', '🟡', '🟡', '🟡', '🟡']
})

print("Risk Culture Metrics Dashboard:")
print(culture_metrics.to_string(index=False))

# ----------------------------------------------------------------
# PART F: RISK CULTURE ROADMAP
# ----------------------------------------------------------------

print("\n" + "-"*60)
print("PART F: Risk Culture Roadmap")
print("-"*60)

roadmap = {
    "Phase 1 (0-6 months) – Foundation": {
        "Focus": "Build risk culture foundation.",
        "Activities": [
            "Establish risk appetite statement.",
            "Implement risk training programme.",
            "Build risk reporting and escalation.",
            "Establish accountability framework."
        ],
        "Success Metrics": ["Risk culture score > 3.5", "Training completion > 80%"]
    },
    "Phase 2 (6-12 months) – Scale": {
        "Focus": "Scale risk culture.",
        "Activities": [
            "Embed risk in decision-making.",
            "Enhance risk communication.",
            "Implement incentives and rewards.",
            "Conduct regular risk culture surveys."
        ],
        "Success Metrics": ["Risk culture score > 4.0", "Incident reporting > 3.5/5"]
    },
    "Phase 3 (12-24 months) – Advanced": {
        "Focus": "Advanced risk culture.",
        "Activities": [
            "Implement AI-powered risk insights.",
            "Deploy predictive risk analytics.",
            "Build risk culture dashboards.",
            "Achieve regulatory excellence."
        ],
        "Success Metrics": ["Risk culture score > 4.5", "Industry-leading risk culture"]
    },
    "Phase 4 (24+ months) – Leadership": {
        "Focus": "Industry-leading risk culture.",
        "Activities": [
            "Lead industry risk culture.",
            "Build global risk culture.",
            "Achieve risk culture leadership.",
            "Continuous improvement."
        ],
        "Success Metrics": ["Industry-leading risk culture", "Continuous improvement"]
    }
}

for phase, details in roadmap.items():
    print(f"\n{phase}:")
    print(f"  Focus: {details['Focus']}")
    print("  Activities:")
    for activity in details['Activities']:
        print(f"    • {activity}")
    print("  Success Metrics:")
    for metric in details['Success Metrics']:
        print(f"    • {metric}")

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

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

print("""
Risk Culture and Governance – Key Takeaways:

1. Risk culture is the set of values and behaviours shaping risk management.
2. Key elements: tone from the top, accountability, transparency, training, incentives.
3. Governance framework: board oversight, risk committee, CRO, risk function, business units.
4. Risk appetite statement defines the amount of risk the bank is willing to take.
5. Risk tolerance sets specific limits for each risk category.
6. Key metrics: risk awareness, training completion, incident reporting, culture score.
7. Roadmap: foundation → scale → advanced → leadership.

Recommendations:
  - Establish a risk appetite statement.
  - Implement risk training and awareness programmes.
  - Build risk reporting and escalation.
  - Embed risk in decision-making.
  - Measure and monitor risk culture.
  - Foster a risk-aware culture from the top.
""")

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

SECTION 9: SUMMARY FOR THE DATA PRACTITIONER

  • Risk culture is the set of values and behaviours that shape how an organisation approaches risk.

  • Key elements include tone from the top, accountability, transparency, training, incentives, and consequences.

  • Risk governance includes board oversight, risk committee, CRO, risk function, business units (1st line), and internal audit (3rd line).

  • Risk appetite is the amount of risk the bank is willing to take; risk tolerance sets specific limits.

  • Key metrics include risk awareness score, training completion, incident reporting rate, and risk culture score.

  • Roadmap progresses from foundation to scaling, advanced, and leadership phases.


SECTION 10: RECOMMENDED NEXT STEPS

  1. Establish a risk appetite statement.

  2. Implement risk training and awareness programmes.

  3. Build risk reporting and escalation.

  4. Embed risk in decision-making.

  5. Measure and monitor risk culture.

  6. Foster a risk-aware culture from the top.