Spaces:
Sleeping
Sleeping
import gradio as gr | |
import yfinance as yf | |
from transformers import pipeline | |
# إعداد نموذج Mistral-7B-Instruct (محلي أو عبر Hugging Face Inference API) | |
generator = pipeline("text-generation", model="mistralai/Mixtral-8x7B-Instruct-v0.1", device=-1) # device=-1 لاستخدام CPU | |
# تعليمات النظام لتخصص البوت في التداول الحلال | |
SYSTEM_PROMPT = """ | |
أنت خبير تداول وتحليل مالي يعتمد على الذكاء الاصطناعي. مهمتك: | |
- تقديم تحليل دقيق للأسواق المالية (أسهم، عملات، عملات رقمية). | |
- اقتراح استراتيجيات تداول متوافقة مع الشريعة الإسلامية (بدون ربا أو غرر). | |
- استخدام استراتيجية تقاطع المتوسطات المتحركة (MA Crossover) لتحديد إشارات شراء/بيع إذا طُلب. | |
- الإجابة بنبرة احترافية، مع أمثلة عملية. | |
- إذا طُلب تحليل أصل، استخدم البيانات المقدمة (مثل السعر، الاتجاه) وأكد إذا كان السهم حلالاً. | |
- إذا لم تكن البيانات كافية، اطلب توضيحاً من المستخدم. | |
- تجنب تقديم نصائح مالية ملزمة، وأكد أن التوصيات لأغراض تعليمية. | |
""" | |
# قائمة الأسهم الحلال (مثال) | |
HALAL_STOCKS = ["AAPL", "MSFT", "GOOGL"] # استبدل بقائمة فعلية من هيئة شرعية | |
def get_market_data(symbol): | |
"""جلب بيانات السوق باستخدام yfinance""" | |
try: | |
ticker = yf.Ticker(symbol) | |
data = ticker.history(period="3mo") | |
latest_price = data["Close"].iloc[-1] | |
ma_20 = data["Close"].rolling(window=20).mean().iloc[-1] | |
ma_50 = data["Close"].rolling(window=50).mean().iloc[-1] | |
signal = "شراء" if ma_20 > ma_50 else "بيع" if ma_20 < ma_50 else "محايد" | |
is_halal = symbol.upper() in HALAL_STOCKS | |
return { | |
"symbol": symbol, | |
"price": round(latest_price, 2), | |
"ma_20": round(ma_20, 2), | |
"ma_50": round(ma_50, 2), | |
"signal": signal, | |
"trend": "صعودي" if latest_price > ma_50 else "هابط", | |
"is_halal": is_halal | |
} | |
except Exception as e: | |
return {"error": f"خطأ في جلب البيانات: {str(e)}"} | |
def chat_with_bot(user_input, symbol=None): | |
"""التفاعل مع النموذج ودمج بيانات السوق""" | |
messages = [{"role": "system", "content": SYSTEM_PROMPT}] | |
if symbol: | |
market_data = get_market_data(symbol) | |
if "error" in market_data: | |
return market_data["error"] | |
if not market_data["is_halal"]: | |
return f"عذراً، {symbol} غير مدرج في قائمة الأسهم الحلال. جرب سهماً آخر." | |
messages.append({"role": "system", "content": f"بيانات السوق لـ {symbol}: {market_data}"}) | |
messages.append({"role": "user", "content": user_input}) | |
# تحويل الرسائل إلى نص لنموذج Mistral | |
prompt = "\n".join([f"{msg['role']}: {msg['content']}" for msg in messages]) | |
# توليد الاستجابة | |
response = generator(prompt, max_length=500, num_return_sequences=1, truncation=True)[0]["generated_text"] | |
# تنظيف الاستجابة | |
response = response.split("assistant:")[-1].strip() if "assistant:" in response else response | |
return response | |
# إعداد واجهة Gradio | |
def gradio_interface(user_input, symbol): | |
return chat_with_bot(user_input, symbol if symbol else None) | |
iface = gr.Interface( | |
fn=gradio_interface, | |
inputs=[ | |
gr.Textbox(lines=2, placeholder="أدخل سؤالك عن التداول...", label="سؤالك"), | |
gr.Textbox(placeholder="رمز الأصل (مثل AAPL أو BTC-USD)", label="رمز الأصل (اختياري)") | |
], | |
outputs=gr.Textbox(label="الرد"), | |
title="خبير التداول الحلال", | |
description="شات بوت لتحليل الأسواق المالية واستراتيجيات التداول المتوافقة مع الشريعة الإسلامية." | |
) | |
if __name__ == "__main__": | |
iface.launch() |