لو سمحت اريدك ان تقوم بالتعامل معي كانك مبرمج محترف ولكن لديك درايه في المره من وقت طويل ولديك درايه في اسواق المال والازهوم اكثر من 50 سنه سوف اقوم باعطائي عدد الاكواد واريدك ان تقوم بتصحيحها لان الكود كان صحيح من قبل رغم ان الكود بقي كما هو لم يعد يريد اشتغال سوف اشاركك الكون قم بتصحيحه وازاله الاخطاء منه   # تثبيت مكتبة yfinance إذا لم تكن مثبتة
!pip install yfinance

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.metrics import mean_squared_error
import yfinance as yf

# تحميل البيانات التاريخية
symbol = "CADJPY=X"
start_date = "2023-03-07"  # تم تعديل للتواريخ الماضية
end_date = "2023-07-22"    # تأكد من أن end_date ليست في المستقبل
data = yf.download(symbol, start=start_date, end=end_date, interval='1d')
data = data.dropna()

# حساب العوائد اليومية
data['Return'] = data['Close'].pct_change()
data = data.dropna()

# نموذج SARIMA مع المتغيرات الخارجية
sarima_model = SARIMAX(data['Close'],
                       exog=data[['Open', 'High', 'Low', 'Volume']],
                       order=(1, 0, 1),
                       seasonal_order=(1, 1, 1, 5))
sarima_fit = sarima_model.fit(disp=False)

# التنبؤ باستخدام SARIMA
forecast_steps_final = 30
# نحتاج إلى بيانات مستقبلية للمتغيرات الخارجية، هنا سنستخدم آخر القيم المتاحة
exog_forecast = data[['Open', 'High', 'Low', 'Volume']].tail(forecast_steps_final)
# إذا كانت البيانات المستقبلية غير متاحة، يمكن استخدام المتوسط أو طريقة أخرى
if len(exog_forecast) < forecast_steps_final:
    exog_forecast = pd.concat([exog_forecast] * (forecast_steps_final // len(exog_forecast) + 1)).head(forecast_steps_final)

forecast_final = sarima_fit.get_forecast(steps=forecast_steps_final, exog=exog_forecast)
forecast_index_final = pd.date_range(data.index[-1] + pd.Timedelta(days=1), periods=forecast_steps_final, freq='B')
forecast_values_final = forecast_final.predicted_mean

# دالة لمحاكاة نموذج هستون
def heston_model_simulation(initial_price, kappa, theta, sigma, rho, v0, r, T, time_steps):
    dt = T / time_steps
    prices = [initial_price]
    volatilities = [v0]

    for _ in range(time_steps):
        z1 = np.random.normal(0, 1)
        z2 = rho * z1 + np.sqrt(1 - rho**2) * np.random.normal(0, 1)

        # تحديث التقلب باستخدام نموذج هستون
        vol_t = volatilities[-1] + kappa * (theta - volatilities[-1]) * dt + sigma * np.sqrt(volatilities[-1]) * np.sqrt(dt) * z2
        vol_t = max(vol_t, 0.0001)  # ضمان أن التقلب غير سالب

        # تحديث السعر باستخدام حركة براونية هندسية مع تقلب عشوائي
        price_t = prices[-1] * np.exp((r - 0.5 * vol_t) * dt + np.sqrt(vol_t) * np.sqrt(dt) * z1)

        prices.append(price_t)
        volatilities.append(vol_t)

    return np.array(prices), np.array(volatilities)

# دالة لمحاكاة مونت كارلو مع حركة براونية هندسية
def monte_carlo_simulation(initial_price, mean_return, std_return, forecast_steps, n_simulations):
    simulated_trajectories = []

    for _ in range(n_simulations):
        simulated_returns = np.random.normal(mean_return, std_return, forecast_steps)
        simulated_prices = [initial_price]

        for return_in in simulated_returns:
            simulated_price = simulated_prices[-1] * (1 + return_in)
            simulated_prices.append(simulated_price)

        simulated_trajectories.append(simulated_prices)

    return np.array(simulated_trajectories)

# محاكاة نموذج هستون
heston_simulated_prices, _ = heston_model_simulation(
    initial_price=data['Close'].iloc[-1],
    kappa=1.5,
    theta=0.04,
    sigma=0.3,
    rho=-0.7,
    v0=0.04,
    r=0.01,
    T=1,
    time_steps=forecast_steps_final
)

# محاكاة مونت كارلو مع حركة براونية هندسية
monte_carlo_simulated_trajectories = monte_carlo_simulation(
    initial_price=data['Close'].iloc[-1],
    mean_return=data['Return'].mean(),
    std_return=data['Return'].std(),
    forecast_steps=forecast_steps_final,
    n_simulations=10000
)

# التأكد من تطابق الأطوال
common_length = min(len(heston_simulated_prices[1:]), monte_carlo_simulated_trajectories.shape[1])

# دمج نتائج هستون ومونت كارلو
combined_simulation_results = (
    heston_simulated_prices[1:common_length + 1] + 
    np.mean(monte_carlo_simulated_trajectories[:, :common_length], axis=0)
) / 2

# دمج SARIMA ونتائج المحاكاة
final_combined_forecast = (
    forecast_values_final[:common_length] + 
    combined_simulation_results[:common_length]
) / 2

# حساب مقاييس إضافية
observed_prices = data['Close'].tail(common_length).values
mse_combined_forecast = mean_squared_error(observed_prices, final_combined_forecast)
percentage_error_final_combined = np.abs((observed_prices - final_combined_forecast) / observed_prices) * 100

# عرض القيم النهائية للتنبؤ والمقاييس
final_combined_forecast_df = pd.DataFrame({
    'Datetime': forecast_index_final[:common_length],
    'SARIMA Forecast': forecast_values_final[:common_length],
    'Heston Model Simulation': heston_simulated_prices[1:common_length + 1],
    'Monte Carlo Simulation': np.mean(monte_carlo_simulated_trajectories[:, :common_length], axis=0),
    'Combined Simulation': combined_simulation_results[:common_length],
    'Final Combined Forecast': final_combined_forecast,
    'Observed Prices': observed_prices,
    'Percentage Error (Final Combined)': percentage_error_final_combined
})

print("\n** Final Combined Forecast Values and Metrics **")
print(final_combined_forecast_df)

# رسم النتائج
plt.figure(figsize=(14, 7))
plt.plot(data.index, data['Close'], label='Observed Prices', linewidth=2)
plt.plot(forecast_index_final[:common_length], forecast_values_final[:common_length], label='SARIMA Forecast', linestyle='--', linewidth=2)
plt.plot(forecast_index_final[:common_length], heston_simulated_prices[1:common_length + 1], label='Heston Model Simulation', linestyle='--', linewidth=2)
plt.plot(forecast_index_final[:common_length], np.mean(monte_carlo_simulated_trajectories[:, :common_length], axis=0), label='Monte Carlo Simulation', linestyle='--', linewidth=2)
plt.plot(forecast_index_final[:common_length], combined_simulation_results[:common_length], label='Combined Simulation', linestyle='--', linewidth=2)
plt.plot(forecast_index_final[:common_length], final_combined_forecast, label='Final Combined Forecast', linestyle='--', linewidth=2)
plt.xlabel('Datetime')
plt.ylabel('Price')
plt.title('Observed vs. Forecasted Prices (SARIMA, Heston, and Monte Carlo)')
plt.legend()
plt.grid(True)
plt.show()

# عرض المقاييس الإضافية
print("\n** Additional Metrics **")
print(f'Mean Squared Error (Combined Forecast): {mse_combined_forecast}')
print(f'Mean Percentage Error (Final Combined): {np.mean(percentage_error_final_combined)}%')
print(f'Max Percentage Error (Final Combined): {np.max(percentage_error_final_combined)}%')
print(f'Min Percentage Error (Final Combined): {np.min(percentage_error_final_combined)}%')

# رسم التنبؤ النهائي مقابل الأسعار الفعلية
plt.figure(figsize=(14, 7))
plt.plot(forecast_index_final[:common_length], observed_prices, label='Actual Prices', linewidth=2)
plt.plot(forecast_index_final[:common_length], final_combined_forecast, label='Final Combined Forecast', linestyle='--', linewidth=2)
plt.xlabel('Datetime')
plt.ylabel('Price')
plt.title('Actual vs. Final Combined Forecast Prices')
plt.legend()
plt.grid(True)
plt.show()

# حساب مقاييس النموذج النهائية
final_model_mse = mean_squared_error(observed_prices, final_combined_forecast)
percentage_error_final_model = percentage_error_final_combined

# عرض مقاييس النموذج النهائية
print("\n** Final Model Metrics **")
print(f'Mean Squared Error (Final Model): {final_model_mse}')
print(f'Mean Percentage Error (Final Model): {np.mean(percentage_error_final_model)}%')

# حساب خطأ التنبؤ
final_forecast_error = observed_prices - final_combined_forecast
prediction_error = np.abs(final_forecast_error)

# حساب الارتباط بين الأسعار الفعلية والتنبؤية
correlation_actual_forecast = np.corrcoef(observed_prices, final_combined_forecast)[0, 1]

# عرض أخطاء التنبؤ والارتباط
print("\n** Final Forecast Error, Prediction Error, and Correlation **")
print(f'Final Forecast Error (Mean): {np.mean(final_forecast_error)}')
print(f'Final Forecast Error (Standard Deviation): {np.std(final_forecast_error)}')
print(f'Mean Prediction Error: {np.mean(prediction_error)}')
print(f'Max Prediction Error: {np.max(prediction_error)}')
print(f'Min Prediction Error: {np.min(prediction_error)}')
print(f'Correlation between Actual and Forecasted Prices: {correlation_actual_forecast}')

# رسم أسعار الفعلية مقابل التنبؤ النهائي
plt.figure(figsize=(14, 7))
plt.plot(forecast_index_final[:common_length], observed_prices, label='Actual Prices', linewidth=2)
plt.plot(forecast_index_final[:common_length], final_combined_forecast, label='Final Combined Forecast', linestyle='--', linewidth=2)
plt.xlabel('Datetime')
plt.ylabel('Price')
plt.title('Actual vs. Final Combined Forecast Prices')
plt.legend()
plt.grid(True)
plt.show()

# رسم خطأ التنبؤ
plt.figure(figsize=(14, 7))
plt.plot(forecast_index_final[:common_length], prediction_error, label='Prediction Error', linestyle='--', linewidth=2, color='red')
plt.xlabel('Datetime')
plt.ylabel('Prediction Error (%)')
plt.title('Prediction Error Over Time')
plt.legend()
plt.grid(True)
plt.show()