2

次の問題があります。

max CEQ(w) st w in (0,1) であり、CEQ(w) = F(CEQ(w)) の形式の固定小数点方程式によって与えられることを除いて、CEQ(w) については何も知りません。aw を修正すると、fzero 関数を使用して固定小数点方程式を解き、CEQ の値を取得できます。別の w を選択すると、CEQ の別の値が得られます。したがって、w のすべての可能な値をループして、最高の CEQ を与える値を選択することができます。これは悪いプログラミングのようですが、MATLAB でこれをより効率的に行うことができるかどうか疑問に思っていました: w の関数として固定小数点方程式の解をモデル化したいのですが、それを実装する方法がわかりません。

より正確には、サンプルコードは次のとおりです。

clear all
clc

NoDraws = 1000000;
T_hat = 12;
mu = 0.0058;
variance = 0.0017;
rf = 0.0036;
sim_returns(:,T_hat/12) = T_hat*mu + sqrt(T_hat*variance)*randn(NoDraws,1);

A = 5;
kappa=1;
l=0;
theta = 1 - l*(kappa^(1-A) - 1) *(kappa>1);

CEQ_DA_0 = 1.1; 
CEQ_opt = -1000;
w_opt = 0;

W_T = @(w) (1-w)*exp(rf*T_hat) + w*exp(rf*T_hat + sim_returns(:,T_hat/12));
for w=0.01:0.01:0.99
    W=W_T(w);
    fp = @(CEQ) theta*CEQ^(1-A)/(1-A) - mean( W.^(1-A)/(1-A)) + l*mean( ((kappa*CEQ)^(1-A)/(1-A) - W.^(1-A)/(1-A)) .* (W < kappa*CEQ)); 
    CEQ_DA = fzero(fp,CEQ_DA_0);
    if CEQ_DA > CEQ_opt
        CEQ_opt = CEQ_DA;
        w_opt = w;
    end
end

つまり、ループ内で aw を固定し、固定小数点方程式を解き、CEQ の値を保存します。他の w が CEQ により大きな値を与える場合、現在の最適な w はその新しい w に置き換えられます。私が(ループ部分の代わりに)持ちたいのは次のようなものです:

fp = @(CEQ,w) theta*CEQ^(1-A)/(1-A) - mean( W_T(w).^(1-A)/(1-A)) + l*mean( ((kappa*CEQ)^(1-A)/(1-A) - W_T(w).^(1-A)/(1-A)) .* (W_T(w) < kappa*CEQ)); 
CEQ_DA = @(w) fzero(fp,CEQ_DA_0);
[w_opt, fval]=fminbnd(CEQ_DA,0,1);
4

1 に答える 1

1

あなたが提案した解決策は非常に近いです。つまり、fp2 つの引数の関数として定義していて、CEQ_DA を の関数にしたいと考えてwfpますw。唯一の問題は、fzero無名関数パラメーターと fp パラメーターを名前で一致させることができないため、解決する fp のパラメーターがわからないことです。

答えは、fzero 内のもう 1 つの無名関数であり、 に変わりfp(CEP,w)ますfp_w(CEP)。これは CEQ で解決できます。

CEQ_DA = @(w) fzero(@(CEQ) fp(CEQ, w),CEQ_DA_0);
于 2015-04-30T15:17:28.363 に答える