Batas Pengaman Risiko dan Kepatuhan
Batas ukuran posisi, pemeriksaan instrumen terlarang, dan pencatatan audit.
Batas Pengaman Risiko dan Kepatuhan adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Mengapa Agen Keuangan Memerlukan Pagar Pengaman Ketat
Agen keuangan yang dapat merekomendasikan transaksi apa pun tanpa batasan dapat membuat pengguna mengalami kerugian besar atau pelanggaran peraturan. Berbeda dari penasihat manusia, agen akan menjalankan logika rekomendasinya secara konsisten — artinya, bug atau kesalahan konfigurasi akan berdampak pada setiap pengguna.
Pagar pengaman ketat mencegah hasil yang paling buruk.
Batas Ukuran Posisi
Batasi jumlah portofolio yang dapat direkomendasikan agen untuk ditempatkan pada satu aset. Aturan yang umum digunakan: tidak ada satu posisi pun yang boleh melebihi 20% dari total nilai portofolio. Hal ini mencegah risiko konsentrasi yang besar.
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))
Daftar Instrumen yang Dilarang
Pelihara daftar instrumen yang tidak boleh direkomendasikan oleh agen: saham berharga sangat rendah, ETF dengan leverage tinggi, sekuritas yang dikenai sanksi, atau instrumen yang tidak sesuai untuk investor ritel.
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'))
Pemeriksaan Aturan Pattern-Day-Trader
Di US, akun dengan kurang dari USD 25.000 akan ditandai sebagai pedagang harian berpola (PDT) jika melakukan 4 atau lebih transaksi pulang-pergi dalam 5 hari kerja. Agen harus memeriksa frekuensi transaksi sebelum merekomendasikan transaksi pada hari yang sama.
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)
Penskalaan Ukuran Transaksi Berdasarkan Volatilitas
Aset yang lebih volatil memiliki risiko lebih tinggi. Skala ukuran posisi secara terbalik terhadap volatilitas: jika volatilitas suatu aset dua kali lipat dari nilai dasar, sarankan ukuran posisi setengahnya.
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'
}Mencatat Setiap Rekomendasi dalam Audit
Setiap rekomendasi transaksi — baik diterima maupun ditolak — harus dicatat dengan konteks lengkap: stempel waktu, ID pengguna, tindakan yang direkomendasikan, pemeriksaan pagar pengaman yang dijalankan, dan hasilnya. Dengan demikian, tersedia jejak audit lengkap untuk peninjauan kepatuhan.
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')
Penyisipan Penafian
Setiap keluaran keuangan dari agen harus menyertakan penafian bahwa keluaran tersebut bukan nasihat keuangan yang dipersonalisasi. Sisipkan penafian ini secara otomatis — jangan pernah mengandalkan LLM untuk menambahkannya secara konsisten.
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))
Menjalankan Semua Pagar Pengaman secara Berurutan
Buat satu fungsi guardrail_check() yang menjalankan semua pemeriksaan secara berurutan dan mengembalikan keputusan lulus/gagal beserta alasannya. Agen memanggil fungsi ini sebelum menyelesaikan rekomendasi apa pun.
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}Pemeriksaan Kesesuaian Berdasarkan Profil Risiko
Sesuaikan rekomendasi dengan toleransi risiko yang dinyatakan pengguna. Investor konservatif tidak boleh direkomendasikan saham pertumbuhan dengan beta tinggi; investor agresif dapat menghadapi volatilitas yang lebih tinggi.
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))
Membatasi Laju Rekomendasi
Agen yang terlalu sering menghasilkan rekomendasi transaksi mendorong perdagangan berlebihan, yang meningkatkan biaya dan risiko. Terapkan masa jeda antar rekomendasi untuk aset yang sama.
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'))
Pemutus Otomatis Stop-Loss dan Penurunan
Selain batas posisi individual, terapkan pemutus otomatis tingkat portofolio: jika total portofolio kehilangan lebih dari X% dalam satu hari, agen berhenti membuat rekomendasi pembelian baru sampai manusia meninjau situasinya.
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))
Apa yang dibatasi oleh aturan Pattern Day Trader (PDT)?
Aturan PDT merupakan persyaratan peraturan US yang harus dipatuhi agen keuangan yang beroperasi di pasar US. Memahaminya membantu mencegah agen secara tidak sengaja memicu pembatasan pada akun margin.
Ringkasan Batasan Pengaman Risiko dan Kepatuhan
Batasan pengaman agen keuangan meliputi: batas ukuran posisi, daftar instrumen yang dilarang, pemeriksaan aturan PDT, penentuan ukuran berdasarkan volatilitas, pencocokan kesesuaian dengan profil risiko, pencatatan audit untuk setiap rekomendasi, dan penyisipan penafian dalam semua keluaran.
Selalu jalankan semua batasan pengaman sebelum menyelesaikan rekomendasi perdagangan apa pun.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Batas Pengaman Risiko dan Kepatuhan” gratis?
Ya — teks lengkap “Batas Pengaman Risiko dan Kepatuhan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Batas Pengaman Risiko dan Kepatuhan”?
Batas ukuran posisi, pemeriksaan instrumen terlarang, dan pencatatan audit. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Batas Pengaman Risiko dan Kepatuhan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Integrasi API Data Pasar
- Alat Agen untuk Analisis Portofolio
- Batas Pengaman Risiko dan Kepatuhan
- Pengujian Balik Keputusan Agen