Leitplanken für Risiko und Compliance
Limits für die Positionsgröße, Prüfung verbotener Finanzinstrumente und Audit-Protokollierung.
Leitplanken für Risiko und Compliance ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Warum Finanzagenten harte Guardrails benötigen
Ein Finanzagent, der ohne Einschränkungen beliebige Transaktionen empfehlen kann, könnte Nutzer katastrophalen Verlusten oder Verstößen gegen Vorschriften aussetzen. Anders als ein menschlicher Berater führt ein Agent seine Empfehlungslogik stets konsistent aus – das bedeutet, dass ein Fehler oder eine Fehlkonfiguration jeden Nutzer betrifft.
Harte Guardrails verhindern die schlimmsten Folgen.
Limits für Positionsgrößen
Begrenzen Sie, wie viel des Portfolios der Agent für einen einzelnen Anlagewert empfehlen darf. Eine gängige Regel lautet: Keine einzelne Position sollte mehr als 20 % des gesamten Portfoliowerts ausmachen. So wird ein katastrophales Konzentrationsrisiko verhindert.
MAX_POSITION_PCT = 0.20 # 20% of portfolio max per asset
def check_position_size(ticker: str, trade_usd: float,
portfolio_value: float) -> dict:
proposed_pct = trade_usd / portfolio_value
if proposed_pct > MAX_POSITION_PCT:
return {
'allowed': False,
'reason': (
f'Position size {proposed_pct:.1%} exceeds limit {MAX_POSITION_PCT:.1%}. '
f'Max trade for this portfolio: USD {portfolio_value * MAX_POSITION_PCT:.0f}'
)
}
return {'allowed': True, 'position_pct': round(proposed_pct, 4)}
if __name__ == '__main__':
print('Large trade:', check_position_size('TSLA', 30000, 100000))
print('Small trade:', check_position_size('TSLA', 10000, 100000))
Liste verbotener Finanzinstrumente
Führen Sie eine Liste von Finanzinstrumenten, die der Agent nicht empfehlen darf: Pennystocks, hoch gehebelte ETFs, sanktionierte Wertpapiere oder für Privatanleger ungeeignete Instrumente.
PROHIBITED_TICKERS = {
'UVXY', # VIX leveraged ETF — too volatile
'TVIX', # Delisted leveraged VIX
'JDST', # 3x leveraged gold miners short
'NUGT', # 3x leveraged gold miners long
'YANG', # 3x China short
}
PROHIBITED_TYPES = {'penny_stock', 'leveraged_3x', 'inverse_volatility'}
def check_prohibited_instrument(ticker: str) -> dict:
if ticker.upper() in PROHIBITED_TICKERS:
return {
'allowed': False,
'reason': f'{ticker} is on the prohibited instruments list'
}
return {'allowed': True}
if __name__ == '__main__':
print("Checking UVXY:", check_prohibited_instrument('UVXY'))
print("Checking AAPL:", check_prohibited_instrument('AAPL'))
Prüfung der Pattern-Day-Trader-Regel
In den USA wird ein Konto mit weniger als 25.000 USD als Pattern Day Trader (PDT) eingestuft, wenn es innerhalb von 5 Geschäftstagen mindestens 4 Hin- und Rückgeschäfte tätigt. Der Agent muss die Handelsfrequenz prüfen, bevor er Intraday-Geschäfte empfiehlt.
from datetime import datetime, timedelta, timezone
def check_pdt_rule(account_value_usd: float,
recent_trades: list[dict]) -> dict:
if account_value_usd >= 25_000:
return {'at_risk': False, 'reason': 'Account above PDT threshold'}
cutoff = datetime.now(timezone.utc) - timedelta(days=5)
recent = [
t for t in recent_trades
if datetime.fromisoformat(t['timestamp']) > cutoff
and t.get('is_day_trade', False)
]
if len(recent) >= 3:
return {
'at_risk': True,
'day_trades_in_5_days': len(recent),
'reason': (
f'Account has {len(recent)} day trades in the last 5 days. '
f'A 4th would trigger the PDT restriction.'
)
}
return {'at_risk': False, 'day_trades_in_5_days': len(recent)}
if __name__ == '__main__':
now = datetime.now(timezone.utc)
trades = [
{'timestamp': (now - timedelta(days=1)).isoformat(), 'is_day_trade': True},
{'timestamp': (now - timedelta(days=2)).isoformat(), 'is_day_trade': True},
{'timestamp': (now - timedelta(days=3)).isoformat(), 'is_day_trade': True},
]
result = check_pdt_rule(account_value_usd=10000, recent_trades=trades)
print('PDT rule check:', result)
Handelsgröße anhand der Volatilität skalieren
Anlagewerte mit höherer Volatilität bergen ein größeres Risiko. Skalieren Sie die Positionsgrößen umgekehrt proportional zur Volatilität: Wenn ein Anlagewert die doppelte Volatilität des Referenzwerts aufweist, schlagen Sie eine halb so große Positionsgröße vor.
import yfinance as yf, numpy as np
BASELINE_VOL = 0.15 # 15% annualized vol — S&P 500 average
def volatility_scaled_size(ticker: str, base_allocation_usd: float) -> dict:
hist = yf.Ticker(ticker).history(period='1y')['Close'].pct_change().dropna()
vol = float(hist.std() * np.sqrt(252))
scaling_factor = BASELINE_VOL / max(vol, 0.01)
adjusted_usd = base_allocation_usd * scaling_factor
return {
'ticker': ticker,
'annualized_vol': round(vol, 4),
'scaling_factor': round(scaling_factor, 3),
'adjusted_size_usd': round(adjusted_usd, 2),
'note': 'High-vol asset: position scaled down' if scaling_factor < 1 else 'Normal sizing'
}Jede Empfehlung revisionssicher protokollieren
Jede Handelsempfehlung – unabhängig davon, ob sie angenommen oder abgelehnt wird – muss mit dem vollständigen Kontext protokolliert werden: Zeitstempel, Benutzer-ID, empfohlene Aktion, ausgeführte Guardrail-Prüfungen und Ergebnis. So entsteht ein vollständiger Prüfpfad für Compliance-Überprüfungen.
import json, hashlib, time, logging
audit_logger = logging.getLogger('financial_agent.audit')
audit_logger.setLevel(logging.INFO)
def audit_log(user_id: str, action: str, ticker: str,
amount_usd: float, guardrail_results: list[dict],
approved: bool, reason: str):
log_entry = {
'timestamp': time.time(),
'user_id': user_id,
'action': action,
'ticker': ticker,
'amount_usd': amount_usd,
'guardrails': guardrail_results,
'approved': approved,
'reason': reason,
'entry_id': hashlib.md5(f'{user_id}{time.time()}'.encode()).hexdigest()[:12]
}
audit_logger.info(json.dumps(log_entry))
if __name__ == '__main__':
import sys
audit_logger.addHandler(logging.StreamHandler(sys.stdout))
audit_log('user_42', 'BUY', 'AAPL', 5000.0,
[{'check': 'position_size', 'allowed': True}],
True, 'Within limits')
Haftungsausschluss automatisch einfügen
Jede finanzielle Ausgabe des Agenten muss einen Haftungsausschluss enthalten, dass es sich nicht um eine personalisierte Finanzberatung handelt. Fügen Sie diesen automatisch ein – verlassen Sie sich niemals darauf, dass das LLM ihn zuverlässig ergänzt.
FINANCIAL_DISCLAIMER = (
'\n\n---\n'
'DISCLAIMER: This output is generated by an AI agent and is for '
'informational purposes only. It does not constitute personalized financial advice. '
'Past performance does not guarantee future results. '
'Please consult a licensed financial advisor before making investment decisions.'
)
def inject_disclaimer(response: str) -> str:
if 'DISCLAIMER' not in response:
return response + FINANCIAL_DISCLAIMER
return response
if __name__ == '__main__':
response = 'AAPL is currently trading at $150 with strong upward momentum.'
print(inject_disclaimer(response))
Alle Guardrails der Reihe nach ausführen
Erstellen Sie eine einzelne Funktion guardrail_check(), die alle Prüfungen der Reihe nach ausführt und eine Entscheidung mit bestanden/nicht bestanden sowie den Grund zurückgibt. Der Agent ruft diese Funktion auf, bevor er eine Empfehlung endgültig festlegt.
def guardrail_check(user_id: str, ticker: str, action: str,
amount_usd: float, portfolio_value: float,
account_value: float, recent_trades: list[dict]) -> dict:
checks = []
# 1. Prohibited instruments
prohibited = check_prohibited_instrument(ticker)
checks.append({'check': 'prohibited_instrument', **prohibited})
if not prohibited['allowed']:
audit_log(user_id, action, ticker, amount_usd, checks, False, prohibited['reason'])
return {'approved': False, 'reason': prohibited['reason'], 'checks': checks}
# 2. Position size
size_check = check_position_size(ticker, amount_usd, portfolio_value)
checks.append({'check': 'position_size', **size_check})
if not size_check['allowed']:
audit_log(user_id, action, ticker, amount_usd, checks, False, size_check['reason'])
return {'approved': False, 'reason': size_check['reason'], 'checks': checks}
# 3. PDT rule
if action == 'day_trade':
pdt = check_pdt_rule(account_value, recent_trades)
checks.append({'check': 'pdt_rule', **pdt})
if pdt['at_risk']:
return {'approved': False, 'reason': pdt['reason'], 'checks': checks}
audit_log(user_id, action, ticker, amount_usd, checks, True, 'All guardrails passed')
return {'approved': True, 'checks': checks}Eignungsprüfung anhand des Risikoprofils
Stimmen Sie die Empfehlung auf die angegebene Risikotoleranz des Nutzers ab. Ein konservativer Anleger sollte keine wachstumsorientierten Aktien mit hohem Beta empfohlen bekommen; ein risikofreudiger Anleger kann eine höhere Volatilität verkraften.
RISK_PROFILES = {
'conservative': {'max_beta': 0.8, 'max_vol_pct': 15},
'moderate': {'max_beta': 1.2, 'max_vol_pct': 25},
'aggressive': {'max_beta': 2.0, 'max_vol_pct': 50},
}
def suitability_check(risk_profile: str, ticker_beta: float,
ticker_vol_pct: float) -> dict:
limits = RISK_PROFILES.get(risk_profile, RISK_PROFILES['moderate'])
if ticker_beta > limits['max_beta']:
return {
'suitable': False,
'reason': f'Beta {ticker_beta:.2f} exceeds {risk_profile} limit {limits["max_beta"]}'
}
if ticker_vol_pct > limits['max_vol_pct']:
return {
'suitable': False,
'reason': f'Volatility {ticker_vol_pct:.1f}% exceeds {risk_profile} limit {limits["max_vol_pct"]}%'
}
return {'suitable': True}
if __name__ == '__main__':
print('Conservative check:', suitability_check('conservative', ticker_beta=1.5, ticker_vol_pct=20))
print('Aggressive check: ', suitability_check('aggressive', ticker_beta=1.5, ticker_vol_pct=20))
Empfehlungen durch Ratenbegrenzung steuern
Ein Agent, der zu häufig Handelsempfehlungen erstellt, fördert übermäßiges Handeln, wodurch Kosten und Risiken steigen. Legen Sie für Empfehlungen zum selben Anlagewert eine Abkühlphase fest.
import time
last_recommendation: dict[str, float] = {} # ticker -> timestamp
COOLDOWN_HOURS = 24
def check_recommendation_cooldown(ticker: str) -> dict:
last = last_recommendation.get(ticker, 0)
elapsed_hours = (time.time() - last) / 3600
if elapsed_hours < COOLDOWN_HOURS:
remaining = COOLDOWN_HOURS - elapsed_hours
return {
'allowed': False,
'reason': f'Recommendation cooldown: {remaining:.1f} hours remaining for {ticker}'
}
return {'allowed': True}
def record_recommendation(ticker: str):
last_recommendation[ticker] = time.time()
if __name__ == '__main__':
print('Before recommending:', check_recommendation_cooldown('AAPL'))
record_recommendation('AAPL')
print('Right after recommending:', check_recommendation_cooldown('AAPL'))
Stop-Loss- und Drawdown-Circuit-Breaker
Implementieren Sie zusätzlich zu den Limits für einzelne Positionen einen Circuit Breaker auf Portfolioebene: Wenn das gesamte Portfolio an einem Tag mehr als X % verliert, stellt der Agent neue Kaufempfehlungen ein, bis ein Mensch die Situation überprüft hat.
MAX_DAILY_DRAWDOWN_PCT = 0.05 # 5% daily loss limit
def check_daily_drawdown(portfolio_start_of_day: float,
portfolio_current: float) -> dict:
daily_loss = (portfolio_current - portfolio_start_of_day) / portfolio_start_of_day
if daily_loss < -MAX_DAILY_DRAWDOWN_PCT:
return {
'circuit_breaker': True,
'daily_loss_pct': round(daily_loss * 100, 2),
'reason': (
f'Portfolio down {abs(daily_loss)*100:.1f}% today. '
f'Agent suspended — human review required.'
)
}
return {'circuit_breaker': False, 'daily_loss_pct': round(daily_loss * 100, 2)}
if __name__ == '__main__':
print('Small loss day:', check_daily_drawdown(100000, 98000))
print('Big loss day: ', check_daily_drawdown(100000, 92000))
Welche Einschränkung enthält die Pattern-Day-Trader-Regel (PDT)?
Die PDT-Regel ist eine aufsichtsrechtliche Vorgabe der USA, die Finanzagenten im US-Markt einhalten müssen. Ihr Verständnis verhindert, dass Agenten unbeabsichtigt Einschränkungen für Margin-Konten auslösen.
Zusammenfassung der Leitplanken für Risiko und Compliance
Zu den Leitplanken für Finanzagenten gehören: Limits für Positionsgrößen, eine Liste verbotener Instrumente, die Prüfung der PDT-Regel, eine volatilitätsabhängige Positionsgrößenbestimmung, der Abgleich mit dem Risikoprofil zur Geeignetheitsprüfung, die Protokollierung jeder Empfehlung zu Prüfzwecken und das Einfügen von Haftungsausschlüssen in alle Ausgaben.
Führen Sie stets alle Leitplanken aus, bevor Sie eine Handelsempfehlung finalisieren.
Häufig gestellte Fragen
Ist die Lektion „Leitplanken für Risiko und Compliance“ kostenlos?
Ja — der vollständige Text von „Leitplanken für Risiko und Compliance“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Leitplanken für Risiko und Compliance“?
Limits für die Positionsgröße, Prüfung verbotener Finanzinstrumente und Audit-Protokollierung. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Leitplanken für Risiko und Compliance“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Integration von Marktdaten-APIs
- Tools für Agenten zur Portfolioanalyse
- Leitplanken für Risiko und Compliance
- Entscheidungen von Agenten backtesten