ضوابط المخاطر والامتثال
حدود تحديد حجم المراكز، والتحقق من الأدوات المحظورة، وتسجيل عمليات التدقيق.
ضوابط المخاطر والامتثال درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
لماذا تحتاج الوكلاء الماليون إلى ضوابط صارمة
قد يعرّض الوكيل المالي الذي يستطيع التوصية بأي صفقة من دون قيود المستخدمين لخسائر كارثية أو مخالفات تنظيمية. وعلى خلاف المستشار البشري، ينفّذ الوكيل منطق توصياته باستمرار، ما يعني أن خطأً أو إعدادًا غير صحيح سيؤثر في كل مستخدم.
تمنع الضوابط الصارمة أسوأ النتائج.
حدود حجم المركز
حدّد مقدار ما يمكن للوكيل أن يوصي بتخصيصه لأي أصل منفرد من المحفظة. ومن القواعد الشائعة ألا يتجاوز أي مركز منفرد 20% من إجمالي قيمة المحفظة. ويمنع ذلك مخاطر التركّز الكارثية.
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))
قائمة الأدوات المحظورة
احتفظ بقائمة بالأدوات التي لا يُسمح للوكيل بالتوصية بها، مثل الأسهم شديدة الانخفاض في السعر، وصناديق ETF ذات الرافعة المالية العالية، والأوراق المالية الخاضعة للعقوبات، أو الأدوات غير المناسبة للمستثمرين الأفراد.
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'))
التحقق من قاعدة المتداول اليومي النمطي
في الولايات المتحدة، يُصنّف الحساب الذي يقل رصيده عن USD 25,000 على أنه متداول يومي نمطي (PDT) إذا أجرى 4 صفقات ذهاب وإياب كاملة أو أكثر خلال 5 أيام عمل. يجب على الوكيل التحقق من تكرار الصفقات قبل التوصية بصفقات تُفتح وتُغلق في اليوم نفسه.
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)
تغيير حجم الصفقة بناءً على التقلب
تحمل الأصول الأكثر تقلبًا مخاطر أكبر. غيّر أحجام المراكز عكسيًا مع التقلب: فإذا كان تقلب أصل ما يساوي ضعف تقلب الأصل المرجعي، فاقترح نصف حجم المركز.
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'
}تسجيل كل توصية لأغراض التدقيق
يجب تسجيل كل توصية بصفقة — سواء قُبلت أو رُفضت — مع السياق الكامل: الطابع الزمني، ومعرّف المستخدم، والإجراء الموصى به، وفحوصات الضوابط التي أُجريت، والنتيجة. ينشئ ذلك سجل تدقيق كاملًا لمراجعة الامتثال.
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')
إدراج إخلاء المسؤولية
يجب أن يتضمن أي مخرَج مالي من الوكيل إخلاء مسؤولية يوضح أنه ليس نصيحة مالية مخصصة. أدرج هذا الإخلاء تلقائيًا، ولا تعتمد أبدًا على LLM لإضافته باستمرار.
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))
تشغيل جميع الضوابط بالتسلسل
أنشئ دالة واحدة باسم guardrail_check() تشغّل جميع الفحوصات بالترتيب، وتُرجع قرار اجتياز أو فشل مع السبب. يستدعي الوكيل هذه الدالة قبل إنهاء أي توصية.
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}التحقق من الملاءمة وفق ملف المخاطر
طابق التوصية مع مستوى تحمّل المخاطر الذي حدده المستخدم. فلا ينبغي التوصية لمستثمر محافظ بأسهم نمو ذات بيتا مرتفعة، بينما يستطيع المستثمر الجريء تحمّل تقلب أعلى.
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))
تحديد معدل التوصيات
يشجع الوكيل الذي ينشئ توصيات بالصفقات بوتيرة مفرطة على الإفراط في التداول، ما يزيد التكاليف والمخاطر. طبّق فترة تهدئة بين التوصيات المتعلقة بالأصل نفسه.
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'))
قواطع حماية لوقف الخسارة والتراجع
إلى جانب حدود المراكز الفردية، طبّق قاطع حماية على مستوى المحفظة: فإذا خسرت المحفظة بأكملها أكثر من X% في يوم واحد، يتوقف الوكيل عن إصدار توصيات شراء جديدة إلى أن يراجع إنسان الوضع.
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))
ما الذي تقيده قاعدة المتداول اليومي النمطي (PDT)؟
قاعدة PDT هي متطلب تنظيمي أمريكي يجب على الوكلاء الماليين العاملين في السوق الأمريكية الالتزام به. ويساعد فهمها على منع الوكلاء من التسبب دون قصد في فرض قيود على حسابات الهامش.
مراجعة ضوابط مخاطر الامتثال
تشمل ضوابط حماية الوكيل المالي: حدود حجم المركز، وقائمة الأدوات المحظورة، والتحقق من قاعدة PDT، وتحديد الأحجام وفقًا للتقلب، ومطابقة الملاءمة مع الملف الشخصي للمخاطر، وتسجيل كل توصية في سجل التدقيق، وإدراج إخلاء المسؤولية في جميع المخرجات.
شغّل دائمًا جميع ضوابط الحماية قبل اعتماد أي توصية تداول نهائية.
الأسئلة الشائعة
هل درس «ضوابط المخاطر والامتثال» مجاني؟
نعم — نص درس «ضوابط المخاطر والامتثال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «ضوابط المخاطر والامتثال»؟
حدود تحديد حجم المراكز، والتحقق من الأدوات المحظورة، وتسجيل عمليات التدقيق. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «ضوابط المخاطر والامتثال»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تكامل واجهات برمجة تطبيقات بيانات السوق
- أدوات الوكيل لتحليل المحافظ الاستثمارية
- ضوابط المخاطر والامتثال
- اختبار قرارات الوكيل بأثر رجعي