import numpy as np from scipy.optimize import minimize # Example data np.random.seed(0) X = np.random.normal(0, 1, 100) Y = 3*X + np.random.normal(0, 1, 100) # Moment conditions function def moments(params, X, Y): alpha, beta = params residuals = Y - (alpha + beta * X) moment1 = np.mean(residuals) # E[residual] = 0 moment2 = np.mean(residuals * X) # E[residual * X] = 0 return np.array([moment1, moment2]) # Objective function def objective(params, X, Y): m = moments(params, X, Y) return np.dot(m, m) # Sum of squared moments # Initial parameter guess initial_params = np.array([0.0, 0.0]) # Perform GMM optimization result = minimize(objective, initial_params, args=(X, Y), method='BFGS') # Extract optimized parameters alpha_opt, beta_opt = result.x print("Optimized Parameters:") print("Alpha:", alpha_opt) print("Beta:", beta_opt)