Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Maximizar las inversiones a largo plazo mediante programación lineal: basada en problemas

En este ejemplo se muestra cómo utilizar el enfoque basado en problemas para resolver un problema de inversión con devoluciones deterministas durante un número fijo de años.T El problema es asignar su dinero sobre las inversiones disponibles para maximizar su riqueza final. Para el enfoque basado en el solucionador, consulte.Maximizar las inversiones a largo plazo mediante programación lineal: basada en Solver

Formulación problemática

Supongamos que usted tiene una cantidad inicial de dinero para invertir durante un período de tiempo de años en bonos de cupón cero.Capital_0TN Cada bono paga una tasa de interés fija, compone la inversión cada año, y paga el capital más intereses compuestos al final de un período de vencimiento. El objetivo es maximizar la cantidad total de dinero después de años.T

Puede incluir una restricción de que ninguna inversión individual es más que una cierta fracción de su capital total en el momento de la inversión.

En este ejemplo se muestra primero la configuración del problema en un caso pequeño y, a continuación, se formula el caso general.

Puede modelar esto como un problema de programación lineal. Por lo tanto, para optimizar su riqueza, formule el problema utilizando el enfoque de problemas de optimización.

Ejemplo introductorio

Empiece con un pequeño ejemplo:

  • El monto inicial a invertir es $1000.Capital_0

  • El período de tiempo es de 5 años.T

  • El número de bonos es 4.N

  • Para modelar el dinero sin invertir, tener una opción B0 disponible cada año que tiene un período de vencimiento de 1 año y una tasa de interés de 0%.

  • Bond 1, denotado por B1, se puede comprar en el año 1, tiene un período de vencimiento de 4 años, y una tasa de interés de 2%.

  • Bond 2, denotado por B2, se puede comprar en el año 5, tiene un período de vencimiento de 1 año, y una tasa de interés de 4%.

  • Bond 3, denotado por B3, se puede comprar en el año 2, tiene un período de vencimiento de 4 años, y una tasa de interés de 6%.

  • Bond 4, denotado por B4, se puede comprar en el año 2, tiene un período de vencimiento de 3 años, y una tasa de interés del 6%.

Al dividir la primera opción B0 en 5 enlaces con un período de vencimiento de 1 año y una tasa de interés del 0%, este problema puede modelarse de forma equivalente con un total de 9 bonos disponibles, de manera que parak=1..9

  • La entrada de vector representa el comienzo del año en que la fianza está disponible para su compra.kPurchaseYearsk

  • La entrada de vector representa el período de vencimientokMaturity

    <math display="block">
    <mrow>
    <msub>
    <mrow>
    <mi>m</mi>
    </mrow>
    <mrow>
    <mi>k</mi>
    </mrow>
    </msub>
    </mrow>
    </math>
    de fianza.k

  • La entrada de vector representa el final del año en que la fianza está disponible para la venta.kMaturityYearsk

  • La entrada de vector representa la tasa de interés porcentualkInterestRates

    <math display="block">
    <mrow>
    <msub>
    <mrow>
    <mi>ρ</mi>
    </mrow>
    <mrow>
    <mi>k</mi>
    </mrow>
    </msub>
    </mrow>
    </math>
    de fianza.k

Visualice este problema mediante barras horizontales que representan los tiempos y duraciones de compra disponibles para cada bono.

% Time period in years T = 5; % Number of bonds N = 4; % Initial amount of money Capital_0 = 1000; % Total number of buying oportunities nPtotal = N+T; % Purchase times PurchaseYears = [1;2;3;4;5;1;5;2;2]; % Bond durations Maturity = [1;1;1;1;1;4;1;4;3]; % Bond sale times MaturityYears = PurchaseYears + Maturity - 1; % Interest rates in percent InterestRates = [0;0;0;0;0;2;4;6;6]; % Return after one year of interest rt = 1 + InterestRates/100;  plotInvestments(N,PurchaseYears,Maturity,InterestRates)

Las variables de decisión

Representar sus variables de decisión por un vector, donde es el monto en dólares de la inversión en bonos, para.xx(k)kk = 1,...,9 Al vencimiento, el pago de la inversión esx(k)

<math display="block">
<mrow>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>+</mo>
<msub>
<mrow>
<mi>ρ</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msub>
<mo>/</mo>
<mn>1</mn>
<mn>0</mn>
<mn>0</mn>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<msub>
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msub>
</mrow>
</msup>
<mo>.</mo>
</mrow>
</math>

Definir

<math display="block">
<mrow>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msub>
<mo>=</mo>
<mn>1</mn>
<mo>+</mo>
<msub>
<mrow>
<mi>ρ</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msub>
<mo>/</mo>
<mn>1</mn>
<mn>0</mn>
<mn>0</mn>
</mrow>
</math>
y definir
<math display="block">
<mrow>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msub>
</mrow>
</math>
como el retorno total de la fianza:k

<math display="block">
<mrow>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msub>
<mo>=</mo>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>+</mo>
<msub>
<mrow>
<mi>ρ</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msub>
<mo>/</mo>
<mn>1</mn>
<mn>0</mn>
<mn>0</mn>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<msub>
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msub>
</mrow>
</msup>
<mo>=</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
<mrow>
<msub>
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msub>
</mrow>
</msubsup>
<mo>.</mo>
</mrow>
</math>

x = optimvar('x',nPtotal,'LowerBound',0); % Total returns r = rt.^Maturity;

Función objetivo

El objetivo es elegir inversiones para maximizar la cantidad de dinero recaudado al final del año.T Desde la trama, se ve que las inversiones se recogen en varios años intermedios y se reinvierten. Al final del año, el dinero devuelto de las inversiones 5, 7 y 8 se puede recoger y representa su riqueza final:T

<math display="block">
<mrow>
<munder>
<mrow>
<mi mathvariant="normal">max</mi>
</mrow>
<mrow>
<mi>x</mi>
</mrow>
</munder>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>5</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mn>5</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>7</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mn>7</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
</msub>
</mrow>
</math>

Cree un problema de optimización para la maximización e incluya la función objetiva.

interestprob = optimproblem('ObjectiveSense','maximize'); interestprob.Objective = x(5)*r(5) + x(7)*r(7) + x(8)*r(8);

Restricciones lineales: no invierta más de lo que tiene

Cada año, usted tiene una cierta cantidad de dinero disponible para comprar bonos. A partir del año 1, puede invertir el capital inicial en las opciones de compra

<math display="block">
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
</mrow>
</math>
Y
<math display="block">
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
</mrow>
</math>
así que:

<math display="block">
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<mo>=</mo>
<msub>
<mrow>
<mstyle mathvariant="normal">
<mrow>
<mi>C</mi>
<mi>a</mi>
<mi>p</mi>
<mi>i</mi>
<mi>t</mi>
<mi>a</mi>
<mi>l</mi>
</mrow>
</mstyle>
</mrow>
<mrow>
<mn>0</mn>
</mrow>
</msub>
</mrow>
</math>

Luego, para los años siguientes, recoja los retornos de los bonos que maduran y los reinvertirá en nuevos bonos disponibles para obtener el sistema de ecuaciones:

<math display="block">
<mrow>
<mtable columnalign="left left">
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo>=</mo>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo>=</mo>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo>=</mo>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msub>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>5</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>7</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo>=</mo>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>r</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
</msub>
</mrow>
</mtd>
</mtr>
</mtable>
</mrow>
</math>

investconstr = optimconstr(T,1); investconstr(1) = x(1) + x(6) == Capital_0; investconstr(2) = x(2) + x(8) + x(9) == r(1)*x(1); investconstr(3) = x(3) == r(2)*x(2); investconstr(4) = x(4) == r(3)*x(3); investconstr(5) = x(5) + x(7) == r(4)*x(4) + r(6)*x(6) + r(9)*x(9); interestprob.Constraints.investconstr = investconstr;

Restricciones enlazadas: sin préstamos

Dado que cada importe invertido debe ser positivo, cada entrada del vector de solución

<math display="block">
<mrow>
<mi>x</mi>
</mrow>
</math>
debe ser positivo. Incluya esta restricción estableciendo un límite inferior en el vector de la solución
<math display="block">
<mrow>
<mi>x</mi>
</mrow>
</math>
. No hay ningún límite superior explícito en el vector de solución.

x.LowerBound = 0;

Resolver el problema

Resuelva este problema sin restricciones sobre la cantidad que puede invertir en una fianza. El algoritmo de punto interior se puede utilizar para resolver este tipo de problema de programación lineal.

options = optimoptions('linprog','Algorithm','interior-point'); [sol,fval,exitflag] = solve(interestprob,'options',options)
Solution found during presolve. 
sol = struct with fields:
    x: [9x1 double]

fval = 1.2625e+03 
exitflag =      OptimalSolution  

Visualice la solución

La marca de salida indica que el solucionador encontró una solución óptima. El valor, devuelto como el segundo argumento de salida, corresponde a la riqueza final.fval Mire la suma final de las inversiones y la asignación de inversiones a lo largo del tiempo.

fprintf('After %d years, the return for the initial $%g is $%g \n',...     T,Capital_0,fval);
After 5 years, the return for the initial $1000 is $1262.48  
 plotInvestments(N,PurchaseYears,Maturity,InterestRates,sol.x)

Inversión óptima con participaciones limitadas

Para diversificar sus inversiones, puede optar por limitar el monto invertido en cualquier bono a un cierto porcentaje del capital total ese año (incluyendo las devoluciones de bonos que están actualmente en su período de vencimiento).Pmax Se obtiene el siguiente sistema de desigualdades:

<math display="block">
<mrow>
<mtable columnalign="left left">
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo></mo>
<mstyle mathvariant="normal">
<mrow>
<mi>P</mi>
<mi>m</mi>
<mi>a</mi>
<mi>x</mi>
</mrow>
</mstyle>
<mo>×</mo>
<msub>
<mrow>
<mstyle mathvariant="normal">
<mrow>
<mi>C</mi>
<mi>a</mi>
<mi>p</mi>
<mi>i</mi>
<mi>t</mi>
<mi>a</mi>
<mi>l</mi>
</mrow>
</mstyle>
</mrow>
<mrow>
<mn>0</mn>
</mrow>
</msub>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo></mo>
<mstyle mathvariant="normal">
<mrow>
<mi>P</mi>
<mi>m</mi>
<mi>a</mi>
<mi>x</mi>
</mrow>
</mstyle>
<mo>×</mo>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo></mo>
<mstyle mathvariant="normal">
<mrow>
<mi>P</mi>
<mi>m</mi>
<mi>a</mi>
<mi>x</mi>
</mrow>
</mstyle>
<mo>×</mo>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
<mo>+</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo></mo>
<mstyle mathvariant="normal">
<mrow>
<mi>P</mi>
<mi>m</mi>
<mi>a</mi>
<mi>x</mi>
</mrow>
</mstyle>
<mo>×</mo>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msub>
<mo>+</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msubsup>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<mo>+</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
</msub>
<mo>+</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>5</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo></mo>
<mstyle mathvariant="normal">
<mrow>
<mi>P</mi>
<mi>m</mi>
<mi>a</mi>
<mi>x</mi>
</mrow>
</mstyle>
<mo>×</mo>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msub>
<mo>+</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msubsup>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msub>
<mo>+</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msubsup>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
</msub>
<mo>+</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msubsup>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo></mo>
<mstyle mathvariant="normal">
<mrow>
<mi>P</mi>
<mi>m</mi>
<mi>a</mi>
<mi>x</mi>
</mrow>
</mstyle>
<mo>×</mo>
<msub>
<mrow>
<mstyle mathvariant="normal">
<mrow>
<mi>C</mi>
<mi>a</mi>
<mi>p</mi>
<mi>i</mi>
<mi>t</mi>
<mi>a</mi>
<mi>l</mi>
</mrow>
</mstyle>
</mrow>
<mrow>
<mn>0</mn>
</mrow>
</msub>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>7</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo></mo>
<mstyle mathvariant="normal">
<mrow>
<mi>P</mi>
<mi>m</mi>
<mi>a</mi>
<mi>x</mi>
</mrow>
</mstyle>
<mo>×</mo>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msub>
<mo>+</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msubsup>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>4</mn>
</mrow>
</msub>
<mo>+</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msubsup>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
</msub>
<mo>+</mo>
<msubsup>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
<mrow>
<mn>3</mn>
</mrow>
</msubsup>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>8</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo></mo>
<mstyle mathvariant="normal">
<mrow>
<mi>P</mi>
<mi>m</mi>
<mi>a</mi>
<mi>x</mi>
</mrow>
</mstyle>
<mo>×</mo>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>9</mn>
</mrow>
</msub>
</mrow>
</mtd>
<mtd>
<mrow>
<mo></mo>
<mstyle mathvariant="normal">
<mrow>
<mi>P</mi>
<mi>m</mi>
<mi>a</mi>
<mi>x</mi>
</mrow>
</mstyle>
<mo>×</mo>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mrow>
<mi>β</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mrow>
</mtd>
</mtr>
</mtable>
</mrow>
</math>

% Maximum percentage to invest in any bond Pmax = 0.6;  constrlimit = optimconstr(nPtotal,1); constrlimit(1) = x(1) <= Pmax*Capital_0; constrlimit(2) = x(2) <= Pmax*(rt(1)*x(1) + rt(6)*x(6)); constrlimit(3) = x(3) <= Pmax*(rt(2)*x(2) + rt(6)^2*x(6) + rt(8)*x(8) + rt(9)*x(9)); constrlimit(4) = x(4) <= Pmax*(rt(3)*x(3) + rt(6)^3*x(6) + rt(8)^2*x(8) + rt(9)^2*x(9)); constrlimit(5) = x(5) <= Pmax*(rt(4)*x(4) + rt(6)^4*x(6) + rt(8)^3*x(8) + rt(9)^3*x(9)); constrlimit(6) = x(6) <= Pmax*Capital_0; constrlimit(7) = x(7) <= Pmax*(rt(4)*x(4) + rt(6)^4*x(6) + rt(8)^3*x(8) + rt(9)^3*x(9)); constrlimit(8) = x(8) <= Pmax*(rt(1)*x(1) + rt(6)*x(6)); constrlimit(9) = x(9) <= Pmax*(rt(1)*x(1) + rt(6)*x(6));  interestprob.Constraints.constrlimit = constrlimit;

Resuelve el problema invirtiendo no más del 60% en un solo activo. Trace las compras resultantes. Tenga en cuenta que su riqueza final es menor que la inversión sin esta restricción.

[sol,fval] = solve(interestprob,'options',options);
Minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in feasible directions, to within the selected value of the function tolerance, and constraints are satisfied to within the selected value of the constraint tolerance. 
 fprintf('After %d years, the return for the initial $%g is $%g \n',...     T,Capital_0,fval);
After 5 years, the return for the initial $1000 is $1207.78  
 plotInvestments(N,PurchaseYears,Maturity,InterestRates,sol.x)

Modelo de tamaño arbitrario

Cree un modelo para una versión general del problema. Ilustrarlo usando = 30 años y 400 bonos generados aleatoriamente con tasas de interés de 1 a 6%.T Esta configuración da como resultado un problema de programación lineal con 430 variables de decisión.

% For reproducibility rng default  % Initial amount of money Capital_0 = 1000; % Time period in years T = 30; % Number of bonds N = 400; % Total number of buying oportunities nPtotal = N + T; % Generate random maturity durations Maturity = randi([1 T-1],nPtotal,1); % Bond 1 has a maturity period of 1 year Maturity(1:T) = 1; % Generate random yearly interest rate for each bond InterestRates = randi(6,nPtotal,1); % Bond 1 has an interest rate of 0 (not invested) InterestRates(1:T) = 0; % Return after one year of interest rt = 1 + InterestRates/100; % Compute the return at the end of the maturity period for each bond: r = rt.^Maturity;  % Generate random purchase years for each option PurchaseYears = zeros(nPtotal,1); % Bond 1 is available for purchase every year PurchaseYears(1:T)=1:T; for i=1:N     % Generate a random year for the bond to mature before the end of     % the T year period     PurchaseYears(i+T) = randi([1 T-Maturity(i+T)+1]); end  % Compute the years where each bond reaches maturity at the end of the year MaturityYears = PurchaseYears + Maturity - 1;

Calcule los tiempos en que los bonos se pueden comprar o vender. La matriz contiene los tiempos de compra potenciales, y la matriz tiene los tiempos de venta potenciales para cada bono.buyindexsellindex

buyindex = false(nPtotal,T); % allocate nPtotal-by-T matrix for ii = 1:T     buyindex(:,ii) = PurchaseYears == ii; end sellindex = false(nPtotal,T); for ii = 1:T     sellindex(:,ii) = MaturityYears == ii; end

Configure las variables de optimización correspondientes a los enlaces.

x = optimvar('x',nPtotal,1,'LowerBound',0);

Crear el problema de optimización y la función objetiva.

interestprob = optimproblem('ObjectiveSense','maximize'); interestprob.Objective = sum(x(sellindex(:,T)).*r(sellindex(:,T)));

Para mayor comodidad, cree una matriz temporal xBuy, cuyas columnas representan los enlaces que podemos comprar en cada período de tiempo.

xBuy = repmat(x,1,T).*double(buyindex);

De forma similar, cree una matriz temporal xSell, cuyas columnas representen los enlaces que podemos vender en cada período de tiempo.

xSell = repmat(x,1,T).*double(sellindex);

El retorno generado para la venta de estos límites es

xReturnFromSell = xSell.*repmat(r,1,T);

Cree la restricción de que la cantidad que invierte en cada período de tiempo es la cantidad que vendió en el período de tiempo anterior.

interestprob.Constraints.InitialInvest = sum(xBuy(:,1)) == Capital_0; interestprob.Constraints.InvestConstraint = sum(xBuy(:,2:T),1) == sum(xReturnFromSell(:,1:T-1),1);

Solución sin límite de retención

Resuelve el problema.

tic [sol,fval,exitflag] = solve(interestprob,'options',options);
Minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in feasible directions, to within the selected value of the function tolerance, and constraints are satisfied to within the selected value of the constraint tolerance. 
toc
Elapsed time is 0.194214 seconds. 

¿Qué tan bien hicieron las inversiones?

fprintf('After %d years, the return for the initial $%g is $%g \n',...     T,Capital_0,fval);
After 30 years, the return for the initial $1000 is $5167.58  

Solución con Limited Holdings

Para crear restricciones que limiten la fracción de las inversiones en cada activo, configure una matriz que mantenga un registro de los bonos activos en cada momento. Para expresar la restricción de que cada inversión debe ser inferior a veces el valor total, establecer una matriz que realiza un seguimiento del valor de cada inversión en cada momento.Pmax Para este problema más grande, fije la fracción máxima que puede ser celebrada a 0,4.

Pmax = 0.4;

Cree una matriz que corresponda a las veces en que se puede realizar una fianza y una matriz que contenga la duración acumulada de cada vínculo activo.activecactive Así que el valor de la fianza en el momento es.jtx(j)*(rt^cactive)

active = double(buyindex | sellindex); for ii = 1:T     active(:,ii) = double((ii >= PurchaseYears) & (ii <= MaturityYears)); end cactive = cumsum(active,2); cactive = cactive.*active;

Cree la matriz cuya entrada (j, p) represente el valor de Bond j en el período de tiempo p:

bondValue = repmat(x, 1, T).*active.*(rt.^(cactive));

Determine el valor total de las inversiones en cada intervalo de tiempo para que pueda imponer la restricción a las existencias limitadas. es el dinero invertido en todos los bonos al final de cada período de tiempo, un-por-matriz. moneyavailable es la suma sobre los bonos del dinero invertido al principio del período de tiempo, lo que significa el valor de la cartera en cada momento.mvaluenPtotalT

constrlimit = optimconstr(nPtotal,T); constrlimit(:,1) = xBuy(:,1) <= Pmax*Capital_0; constrlimit(:,2:T) = xBuy(:,2:T)  <= repmat(Pmax*sum(bondValue(:,1:T-1),1), nPtotal, 1).*double(buyindex(:,2:T)); interestprob.Constraints.constrlimit = constrlimit;

Resuelve el problema con participaciones limitadas.

tic [sol,fval,exitflag] = solve(interestprob,'options',options);
Minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in feasible directions, to within the selected value of the function tolerance, and constraints are satisfied to within the selected value of the constraint tolerance. 
toc
Elapsed time is 2.076364 seconds. 
fprintf('After %d years, the return for the initial $%g is $%g \n',...     T,Capital_0,fval);
After 30 years, the return for the initial $1000 is $5095.26  

Para acelerar el solucionador, pruebe el algoritmo de doble símplex.

options = optimoptions('linprog','Algorithm','dual-simplex'); tic [sol,fval,exitflag] = solve(interestprob,'options',options);
Optimal solution found. 
toc
Elapsed time is 0.720940 seconds. 
 fprintf('After %d years, the return for the initial $%g is $%g \n',...     T,Capital_0,fval);
After 30 years, the return for the initial $1000 is $5095.26  

En este caso, el algoritmo de doble símplex tardó menos tiempo en obtener la misma solución.

Análisis cualitativo de resultados

Para obtener una sensación de la solución, compárela con la cantidad que podría obtener si pudiera invertir todo su dinero inicial en un bono con una tasa de interés del 6% (la tasa de interés máxima) durante el período completo de 30 años.fmax También puede calcular la tasa de interés equivalente correspondiente a su riqueza final.

% Maximum amount fmax = Capital_0*(1+6/100)^T; % Ratio (in percent) rat = fval/fmax*100; % Equivalent interest rate (in percent) rsol = ((fval/Capital_0)^(1/T)-1)*100;  fprintf(['The amount collected is %g%% of the maximum amount $%g '...     'that you would obtain from investing in one bond.\n'...     'Your final wealth corresponds to a %g%% interest rate over the %d year '...     'period.\n'], rat, fmax, rsol, T)
The amount collected is 88.7137% of the maximum amount $5743.49 that you would obtain from investing in one bond. Your final wealth corresponds to a 5.57771% interest rate over the 30 year period. 
 plotInvestments(N,PurchaseYears,Maturity,InterestRates,sol.x,false)