MeanVarMip : 다양화 제약이 있는 평균-분산 모델.

설명

MeanVarMip.gms: 다양화 제약이 있는 평균-분산 모델.
콘실리오, 닐슨, 제니오스.
실제 재무 최적화: 크레이지 슬롯 모델 라이브러리, 섹션 3.4
최종 수정 날짜: 2008년 4월.

카테고리 : 크레이지 슬롯 FIN 라이브러리


메인파일 : MeanVarMip.gms 포함: 추정.gdx

$title 다양화 제약이 있는 평균-분산 모델

* MeanVarMip.gms: 다양화 제약이 있는 평균-분산 모델.
* Consiglio, Nielsen 및 Zenios.
* 실제 재무 최적화: GAMS 모델 라이브러리, 섹션 3.4
* 최종 수정일: 2008년 4월.

SET 자산;

ALIAS(자산,i,j);

매개변수
         무위험비율
         기대수익률(i) 기대수익률
         VarCov(i,j) 분산-공분산 행렬 ;

* Estimate.gdx에서 평균-분산 모델을 실행하는 데 필요한 데이터를 읽습니다.

$gdxIn 추정치
$load Assets=하위 집합 RiskFreeRate=MeanRiskFreeReturn VarCov 예상 수익
$gdxIn

* 위험 태도: 0은 위험 중립, 1은 매우 위험 회피입니다.

스칼라
     StockMax 최대 주식수 /3/
     람다 위험 태도;

변수
    x(i) 자산 보유;

매개변수
    xlow(i) 활성 변수의 하한 ;

* 공매도가 허용되는 경우 이러한 한도를 올바르게 설정해야 합니다.
xlow(i) = 0.0;
x.UP(i) = 1.0;

바이너리 변수
    Y(i) 포트폴리오에 포함된 자산에 대한 지표변수;

변수
   PortVariance 포트폴리오 분산
   PortReturn 포트폴리오 반환
   z 목적 함수 값;

방정식
    포트폴리오 수익을 정의하는 ReturnDef 방정식
    포트폴리오 차이를 정의하는 VarDef 방정식
    정규화 제약 조건을 정의하는 NormalCon 방정식
    허용되는 최대 자산 수를 정의하는 LimitCon 제약 조건
    UpBounds(i) 각 변수의 상한
    LoBounds(i) 각 변수의 하한
    ObjDef 목적 함수 정의;

ReturnDef .. PortReturn =E= SUM(i, ExpectedReturns(i)*x(i));

VarDef .. PortVariance =E= SUM((i,j), x(i)*VarCov(i,j)*x(j));

LimitCon .. SUM(i, Y(i)) =L= StockMax;

UpBounds(i).. x(i) =L= x.UP(i)* Y(i);

LoBounds(i).. x(i) =G= xlow(i)* Y(i);

NormalCon .. SUM(i, x(i)) =E= 1;

ObjDef .. z =E= (1-람다) * PortReturn - 람다 * PortVariance;

모델 MeanVarMip /ReturnDef, VarDef, LimitCon, UpBounds, LoBounds, NormalCon, ObjDef/;

OPTION MINLP = SBB, optcr = 0;

파일 FrontierHandle /"MeanVarianceMIP.csv"/;

FrontierHandle.pc = 5;
FrontierHandle.pw = 1048;

PUT 프론티어핸들;

PUT "람다","z","분산","ExpReturn";

LOOP(i, PUT i.tl);

놓다 /;

FOR(람다 = 0 TO 1 BY 0.1,

   MINLP를 사용하여 z를 최대화하는 MeanVarMip을 해결합니다.

   PUT 람다:6:5, z.l:6:5, PortVariance.l:6:5, PortReturn.l:6:5;

   LOOP(i, PUT x.l(i):6:5 );

   넣어 /;
)

닫아라;

***** 거래 비용 *****
* 이 섹션에서는 트랜잭션을 부과하여 크레이지 슬롯gms 모델을 수정합니다.
* 비용. 고정비와 비례비로 보다 현실적인 설정을 고려합니다.

스칼라
  FlatCost 고정 거래 비용 / 0.001 /
  PropCost 비례 거래 비용 / 0.005 /;

긍정적인 변수
    x_0(i) 정액 비용 체제에 대한 보유
    x_1(i) 선형 비용 체제에 대한 보유;

* 정액요금으로 거래가 가능한 금액입니다.

x_0.UP(i) = 0.1;

방정식
    HoldingCon(i) 보유 자산을 정의하는 제약
    비용으로 포트폴리오 수익을 정의하는 ReturnDefWithCost 방정식
    FlatCostBounds(i) 정액 거래 수수료의 상한
    LinCostBounds(i) 선형 거래 수수료에 대한 상위 채권;

HoldingCon(i).. x(i) =e= x_0(i) + x_1(i);

ReturnDefWithCost.. PortReturn =e= SUM(i, ( ExpectedReturns(i)*x_0(i) - FlatCost*Y(i) ) ) +
                          SUM(i, (ExpectedReturns(i) - PropCost)*x_1(i));

FlatCostBounds(i).. x_0(i) =l= x_0.UP(i) * Y(i);

LinCostBounds(i).. x_1(i) =l= Y(i);

모델 MeanVarWithCost /ReturnDefWithCost, VarDef,HoldingCon, NormalCon, FlatCostBounds, LinCostBounds, ObjDef/;

OPTION MINLP = SBB, optcr = 0;

파일 FrontierHandleTwo /"MeanVarianceWithCost.csv"/;

FrontierHandleTwo.pc = 5;
FrontierHandleTwo.pw = 1048;

PUT FrontierHandleTwo;

PUT "람다","z","분산","ExpReturn";

LOOP(i, PUT i.tl);
LOOP(i, PUT i.tl);

놓다 /;

FOR(람다 = 0 TO 1 BY 0.1,

   MINLP를 사용하여 z를 최대화하는 MeanVarWithCost를 해결합니다.

   PUT 람다:6:5, z.l:6:5, PortVariance.l:6:5, PortReturn.l:6:5;

   LOOP(i, PUT x_0.l(i):6:5 );
   LOOP(i, PUT x_1.l(i):6:5 );

   넣어 /;
)

닫아라;

***** 포트폴리오 개정 *****
* 이 섹션에서는 크레이지 슬롯gms 모델이 0 또는 범위를 적용하여 수정되었습니다.
* 포트폴리오 개정에 대응하기 위한 변수입니다.

SET 바운드/하한, 상한/;

매개변수
   BuyLimits(바운드,i)
   SellLimits(바운드,i)
   InitHold(i) 현재 보유량;

* 현재 보유를 최적의 제약 없는 평균-분산 포트폴리오로 설정했습니다.
* 람다 = 0.5

InitHold('Cash_EU') = 0.3686;
InitHold('YRS_1_3') = 0.3597;
InitHold('EMU') = 0.0;
InitHold('EU_EX')= 0.0;
InitHold('태평양')= 0.0;
InitHold('EMERGT') = 0.0591;
InitHold('NOR_AM') = 0.2126;
InitHold('ITMHIST') = 0.0;

BuyLimits('Lower',i) = InitHold(i) * 0.9;
BuyLimits('Upper',i) = InitHold(i) * 1.10;

SellLimits('Lower',i) = InitHold(i) * 0.75;
SellLimits('Upper',i) = InitHold(i) * 1.25;

긍정적인 변수
    buy(i) 구매할 금액
    판매(i) 판매할 금액;

바이너리 변수
    Yb(i) 구매할 자산에 대한 지시변수
    Ys(i) 매각할 자산에 대한 표시변수;

방정식
    구매회전율
    LoBuyLimits(i)
    UpBuyLimits(i)
    UpSellLimits(i)
    LoSellLimits(i)
    BinBuyLimits(i)
    BinSellLimits(i)
    InventoryCon(i) 재고 제약;

InventoryCon(i).. x(i) - 구매(i) + 판매(i) =e= InitHold(i);

UpBuyLimits(i).. InitHold(i) + buy(i) =l= BuyLimits('Upper',i);

LoBuyLimits(i).. InitHold(i) + buy(i) =g= BuyLimits('Lower',i);

UpSellLimits(i).. InitHold(i) - Sell(i) =l= SellLimits('Upper',i);

LoSellLimits(i).. InitHold(i) - Sell(i) =g= SellLimits('Lower',i);

BinBuyLimits(i).. buy(i) =l= Yb(i);

BinSellLimits(i).. Sell(i) =l= Ys(i);

BuyTurnover.. SUM(i, buy(i) ) =l= 0.05;

모델 MeanVarRevision /NormalCon, HoldingCon, InventoryCon, ReturnDef,
                       UpBuyLimits, LoBuyLimits, UpSellLimits, LoSellLimits,
                       BinBuyLimits, BinSellLimits, BuyTurnover,
                       VarDef, ObjDef/;

OPTION MINLP = SBB, optcr = 0;

파일 FrontierHandleThree /"MeanVarianceRevision.csv"/;

FrontierHandleThree.pc = 5;
FrontierHandleThree.pw = 1048;

PUT FrontierHandleThree;

PUT "모델 상태","람다","z","분산","ExpReturn";

LOOP(i, PUT i.tl);
LOOP(i, PUT i.tl);
LOOP(i, PUT i.tl);

놓다 /;

FOR(람다 = 0 TO 1 BY 0.1,

   MINLP를 사용하여 z를 최대화하는 MeanVarRevision을 해결합니다.

   PUT MeanVarRevision.modelstat:0:0,lambda:6:5, z.l:6:5, PortVariance.l:6:5, PortReturn.l:6:5;

   LOOP(i, PUT x.l(i):6:5 );
   LOOP(i, PUT buy.l(i):6:5 );
   LOOP(i, PUT Sell.l(i):6:5 );

   넣어 /;
)

PUTCLOSE;