Table of Contents
A programação integral é uma técnica de otimização matemática poderosa usada extensivamente na engenharia financeira, especialmente para otimização de portfólio. Envolve variáveis de decisão que são restritas a ser inteiros, tornando-a ideal para problemas que exigem escolhas discretas, como seleção de ativos ou níveis de investimento. Ao incorporar decisões discretas, a programação inteira alinha a construção de portfólio com as realidades dos mercados financeiros – onde as transações envolvem unidades inteiras, investimentos mínimos e decisões de inclusão binária. Este artigo fornece uma exploração abrangente de métodos de programação inteira para otimização de portfólio, abrangendo conceitos fundamentais, formulação de modelos, técnicas de solução e considerações práticas.
Compreendendo a Otimização de Portfólio
A otimização de portfólio visa alocar ativos de uma forma que maximize os retornos ao minimizar o risco. O framework de média variância introduzido por Harry Markowitz em 1952 continua sendo a base da teoria moderna de portfólio. Nesta abordagem, um investidor procura encontrar o conjunto de pesos de ativos que minimizem a variância de portfólio para um determinado retorno esperado, ou equivalentemente, maximize o retorno esperado para um determinado nível de risco. No entanto, o modelo padrão de Markowitz assume que os pesos de investimento são variáveis contínuas, significando que qualquer fração de um ativo pode ser mantida.
A gestão prática de carteiras deve enfrentar restrições discretas, tais como:
- Montantes mínimos de investimento que exigem um determinado valor em dólares por activo.
- Restrições de dimensão muito grande onde os activos negociam múltiplos específicos (por exemplo, lotes redondos de 100 acções).
- Restrições de fiabilidade que limitam o número total de activos detidos.
- Limitações de compra em que um activo deve ser detido com um peso mínimo, se for incluído.
- Estruturas de custos de transação que são lineares ou de custo fixo por partes com base em decisões de negociação discretas.
Esses aspectos discretos tornam os modelos de otimização contínua inadequados.A programação integral fornece uma estrutura matemática rigorosa para incorporar tais restrições diretamente no problema de otimização.
O papel da programação integral em engenharia financeira
Engenharia financeira aplica métodos matemáticos e computacionais para resolver problemas financeiros. A programação integral se encaixa naturalmente porque muitas decisões financeiras são inerentemente discretas: se incluir um ativo, quantos contratos para negociar, ou quais instrumentos de cobertura usar. Ao contrário da programação linear ou quadrática, que assumem continuidade variável, a programação inteira usa ]binary (0/1) ou inteiro geral[] variáveis para representar essas escolhas. Isto permite que o modelo capture recursos do mundo real que de outra forma seriam aproximados ou ignorados.
Variáveis binárias e seleção de ativos
Variáveis binárias são o cavalo de trabalho dos problemas de seleção de ativos. Para cada ativo candidato, uma variável binária indica inclusão (1) ou exclusão (0). A função objetiva e restrições podem então ser expressas em termos dessas decisões binárias. Por exemplo, um fundo pode querer selecionar um subconjunto de 20 ações de um universo elegível de 500. A restrição de que exatamente 20 ativos são escolhidos é uma soma linear de variáveis binárias igual a 20. Sem programação inteira, alguém teria que confiar em métodos heurísticos de triagem ou baseados em classificação que não possuam garantias formais de optimização.
Variáveis binárias também permitem a modelagem da exclusividade mútua (escolha o ativo A ou o ativo B, mas não ambos), condições lógicas (se o ativo X estiver incluído, então o ativo Y também deve ser incluído), e estratégias de investimento em camadas. Essas características são comuns em portfólios estruturados, como aquelas usadas no rastreamento de índices ou estratégias de Smart-beta.
Variáveis inteiras para as quantidades de investimento
Variáveis inteiras especificam o número de unidades a comprar para cada ativo. Isto é crucial quando se trata de tamanhos mínimos de lote ou restrições inteiras que refletem as regras de negociação e considerações de liquidez. Por exemplo, se uma ação negocia em múltiplos de 100 ações, o número de ações detidas deve ser um múltiplo inteiro de 100. Tais restrições impedem a atribuição de ações fracionárias, que muitas vezes não são permitidas em contas de corretagem padrão. Variáveis inteiras também aparecem quando se aloca obrigações de denominação fixa ou futuros contratantes onde o multiplicador de contratos impõe quantidades inteiras.
Além disso, as variáveis inteiras podem representar o número de contratos nas estratégias derivadas. Um programa de escrita de chamadas coberto, por exemplo, pode exigir o número de opções de chamadas vendidas para ser um inteiro e não exceder o número de ações detidas. Estas ligações discretas são naturalmente expressas com variáveis inteiras.
Manusear as restrições do mundo real
Além de simples seleção de ativos e decisões de quantidade, programação inteira pode codificar uma grande variedade de regras práticas de investimento:
- Restrições de rotatividade: Limitar a fração de carteira comprada ou vendida pode ser modelada com variáveis binárias indicando se ocorre uma negociação, juntamente com variáveis inteiras para o valor negociado.
- Limites de exposição do sector : As variáveis binárias podem impor que, no máximo, um activo por sector seja escolhido, ou que os pesos do sector permaneçam dentro de um intervalo.
- Limites de limiar: Um ativo não pode ser detido a menos que seu peso exceda um limite mínimo. Isto é implementado ligando uma variável de peso contínuo com um indicador binário.
- Considerações fiscais: A seleção do lote para a colheita de perdas fiscais envolve escolhas inteiras para determinar quais lotes fiscais específicos para vender.
A flexibilidade para incorporar essas restrições do mundo real faz da programação inteira uma pedra angular dos sistemas de negociação algorítmica e construção de portfólio.
Formulação do modelo de programação integral
Um modelo de programação inteiro para otimização de portfólio consiste em uma função objetiva e um conjunto de restrições lineares, com algumas ou todas as variáveis de decisão restritas aos valores inteiros. A formulação geral pode ser expressa como:
Maximizar (ou Minimizar) f(x) sujeito a A x ≤ b, l ≤ x ≤ u, x i □ Z para i □ I
onde x é o vetor das variáveis de decisão, A[ é a matriz de restrição, b é o vetor lateral direito, e I é o conjunto de índices para variáveis inteiras.O objetivo f(x) é frequentemente linear ou quadrático, representando retorno esperado, variância ou uma combinação.
Funções do Objetivo
Na prática, o objectivo pode ser escolhido para corresponder aos objectivos do investidor:
- Maximizar o retorno esperado sujeito a um orçamento de risco. Este é um objetivo linear se os retornos esperados são fixos.
- Minimizar a variância do portfólio (ou desvio padrão) sujeito a um retorno alvo. Isto produz um objetivo quadrático, levando a um programa quadrático misto-intéger (MIQP).
- Maximizar o retorno ajustado ao risco como a relação Sharpe, que é uma proporção de duas funções lineares e requer reformulações especializadas.
- Minimizar erro de rastreamento em relação a um parâmetro de referência, muitas vezes com uma restrição de cardinalidade no número de títulos detidos.
A escolha do objetivo afeta significativamente a dificuldade computacional. Os objetivos lineares são geralmente mais fáceis, enquanto os objetivos quadráticos requerem solucionadores mais avançados.
Restrições
As restrições típicas em um modelo de portfólio de programação inteira incluem:
- Contenção orçamental: A soma dos investimentos equivale ao capital total. Para tamanhos inteiros de lotes, a restrição orçamental pode envolver uma variável inteira multiplicada pelo preço do lote.
- Constrangimento de Cardinalidade: Soma das variáveis binárias de seleção de ativos ≤ K (número máximo de ativos).
- Baixo limite no peso do ativo: se o ativo i estiver incluído, seu peso ≥ L i. Isto usa uma variável binária para ligar ou desativar a restrição.
- Alta limite sobre o peso do ativo: lógica semelhante com variáveis binárias para impor limites máximos de detenção.
- Restrições de exposição de fatores ou de setores: combinações lineares de variáveis de decisão delimitadas acima e abaixo.
- Restrições de custos de transação: um custo fixo por transação pode ser modelado usando variáveis binárias que incorrem em um custo se ocorrer uma transação.
Muitas dessas restrições são lineares, preservando a estrutura de programação linear mista-intérprete (MILP) quando o objetivo é linear, ou MIQP quando quadrático.
Modelo de Amostra
Considere um problema de seleção de portfólio simplificado com os ativos N. Deixe x i ser o peso contínuo do ativo i (fração de riqueza), e y i uma variável binária indicando se o ativo i está detido. O modelo pode parecer:
Minimizar Ł i Ł j σ ij x i x j (variância)
]
Sujeito a:
Ł i r i x i ≥ R target (alvo de retorno esperado)
Ł i x i = 1 (investido plenamente)[
l i y i ≤ x i ≤ u i y i para todos os i (peso entre l i e u i apenas se for mantido)
? i y i ≤ K (na maioria dos ativos K)
x i ≥ 0, y i ? {0,1}
Este é um programa quadrático misto. As restrições que ligam x i e y i garantem que se y i = 0, o peso x i deve ser zero; se y i = 1, o peso é limitado entre l i e u i. A restrição de cardinalidade limita o número de ativos.
Resolvendo modelos de programação integrais
Os modelos de programação inteiros são NP-hard em geral, o que significa que, à medida que o número de variáveis inteiras cresce, o tempo de solução pior pode aumentar exponencialmente. No entanto, os solucionadores modernos usam técnicas sofisticadas para resolver muitos problemas praticamente de tamanho eficiente. Os métodos principais são branch e encadernação, corte de planos e heurísticas.
Ramo e Limite
O ramo e o limite são a espinha dorsal dos resolvedores de programação de integração mista. O algoritmo funciona resolvendo uma sequência de relaxamentos lineares ou contínuos (onde as restrições inteiras são largadas) e ramificando- se em variáveis inteiras que tomam valores fracionários na relaxação. Para cada ramo, um limite é calculado; ramificações com limites piores do que a melhor solução inteira atual são podadas. O processo continua até que todos os ramos sejam explorados ou podados. O ramo e o limite podem ser melhorados com regras de ramificação inteligentes (por exemplo, ramificação forte, ramificação pseudo- custo) e estratégias de seleção de nós (melhor primeiro, primeiro, profundidade- primeiro).
Métodos de corte do avião
Os planos de corte adicionam novas restrições lineares (cortes) ao relaxamento contínuo que aperta a região viável sem remover pontos viáveis inteiros. Esses cortes reduzem a lacuna de integralidade – a diferença entre o objetivo ideal do relaxamento e o ideal de inteiros. Os cortes comuns usados na otimização de portfólio incluem cortes Gomory, cortes de arredondamento de inteiros mistos e cortes de cobertura. Muitos solucionadores aplicam planos de corte automaticamente durante o processo de ramo e corte.
Heurísticas e Meta-heurísticas
Para portfólios muito grandes ou restrições de tempo apertado, os métodos exatos podem ser muito lentos. As heurísticas fornecem soluções quase ótimas rapidamente. As abordagens comuns incluem:
- Heurísticas arredondadas: resolver as variáveis inteiras fracionárias contínuas de relaxamento e arredondadas para 0 ou 1 com base em limiares.
- Procura local : comece a partir de uma solução inteira viável e explore pequenas alterações (por exemplo, trocando um ativo dentro e fora) para melhorar o objetivo.
- Algoritmos genéticos e recozimento simulado: métodos de caminhadas aleatórias ou populacionais que podem lidar com não-convexidades.
- Relaxamento lactângico: relaxar dificultando restrições e usar otimização subgradiente para gerar boas soluções duplas, que podem ser convertidas em soluções primárias.
Essas heurísticas muitas vezes produzem soluções de alta qualidade em segundos, tornando-as adequadas para reequilibrar carteiras em um ambiente de negociação ao vivo.
Implementação Prática
Resolver modelos de programação inteiros em engenharia financeira requer software de otimização robusto. Solucionadores comerciais como Gurobi, CPLEX e MOSEK oferecem implementações de última geração de algoritmos de ramificação e corte e incluem recursos específicos de portfólio. Alternativas de código aberto como SCIP, GLPK e CBC da COIN-OR também estão disponíveis, mas podem ser mais lentas para grandes instâncias. Interfaces de programação são fornecidas em Python (PuLP, Pyomo, CVXOPT), MATLAB, R e C++. Para aplicações de portfólio, é comum pré-computar matrizes de covariância e retornos esperados, então alimentam o problema para um solucionador através de uma API. Processamento paralelo e computação em nuvem podem acelerar ainda mais os tempos de solução.
Uma dica prática: problemas de otimização de portfólio muitas vezes têm estrutura especial – como uma matriz de covariância de baixo nível ou restrições esparsas – que os solucionadores podem explorar. Reformular o problema para usar menos variáveis inteiras ou linearizar termos quadráticos pode melhorar drasticamente o desempenho. Por exemplo, usar um modelo de fator para retornos reduz o número de variáveis necessárias para modelar o risco.
Vantagens e Limitações
A programação integral traz várias vantagens para a otimização de portfólio:
- Realismo: Captura restrições discretas que os modelos contínuos ignoram, como tamanhos mínimos de compra, tamanhos de lote e limites de cardinalidade.
- Optimidade: Ao contrário dos métodos heurísticos, a programação inteira pode garantir a optimização global (ou um limite de prova na suboptimidade) para problemas de tamanho moderado.
- Flexibilidade: Uma grande variedade de funções e restrições objetivas pode ser expressa em forma linear ou quadrática, tornando o quadro adaptável a diferentes mandatos de investimento.
- Transparência: Os pressupostos e restrições do modelo são explícitos e reprodutíveis.
No entanto, existem limitações notáveis:
- Complexidade computacional: Problemas de programação inteiros são NP-hard. Mesmo instâncias de tamanho moderado com centenas de variáveis binárias podem ser desafiadoras. O tempo de execução do Solver pode ser imprevisível, o que é uma preocupação para aplicações em tempo real.
- Sensitividade de dados: A otimização de portfólio depende de estimativas de retornos esperados, volatilidades e correlações. Pequenos erros de estimação podem levar a soluções drasticamente diferentes, um fenômeno conhecido como maximização de erros.A programação integral não resolve inerentemente este problema; formulações robustas de otimização são algumas vezes combinadas com IP para lidar com incerteza.
- Grandes tamanhos de portfólio: Para universos de milhares de ativos, a programação exata de inteiros pode tornar-se impraticável. Métodos heurísticos ou de decomposição são frequentemente necessários.
- Complexidade de modelagem: A tradução de regras do mundo real em restrições lineares inteiras pode ser complicada e pode exigir variáveis binárias para cada regra, explodindo o tamanho do problema.
Apesar dessas limitações, avanços em algoritmos (por exemplo, solucionadores baseados em nuvem, ramificações paralelas e reduções pré-soluções) continuam a expandir a fronteira do que é solucionável. Muitos gestores de ativos institucionais usam rotineiramente programação integrada mista para construção de portfólio e reequilíbrio.
Aplicações do Mundo Real
Os métodos de programação integrais foram aplicados em numerosos contextos financeiros para além da selecção básica de carteiras:
- Monitoramento de índice[: construir um portfólio de ações de K que minimiza o erro de rastreamento em relação a um amplo índice como o S&P 500. Este é um programa quadrático restrito a cardinalidade, muitas vezes resolvido via MIQP.
- Replicação de fundos de cobertura: utilizando restrições inteiras para imitar o perfil risco-retorno de uma estratégia de fundos de cobertura com um conjunto limitado de instrumentos líquidos.
- Gestão de passivos: para fundos de pensões e companhias de seguros, a programação inteira ajuda a corresponder aos fluxos de caixa de ativos para pagamentos de responsabilidade, onde os vencimentos de obrigações são discretos.
- Execução de negociação algrítmica: otimizando a sequência e dimensionamento de pedidos para minimizar o impacto do mercado e os custos de transação, muitas vezes lançados como um programa dinâmico integrador misto.
- Orçamento de risco: afectação de capital de risco a diferentes estratégias ou classes de activos, em que cada dotação é uma percentagem fixa ou zero (decisão binária).
- Construção de carteira verde: incluindo critérios ambientais, sociais e de governação (ESG) como restrições binárias (ex.: excluir todas as empresas com exposição ao carvão).
A literatura acadêmica é rica em estudos de caso. Por exemplo, um artigo de 2018 em Operações Research demonstrou que um solucionador de ramo e corte poderia resolver problemas de rastreamento de índice com até 1000 estoques e cardinalidade de 50 em minutos (ver Bertsimas e Stellato, 2018). Os praticantes frequentemente combinam programação inteira com previsões de aprendizado de máquina para incorporar sinais alfa na otimização.
Conclusão
Os métodos de programação integrais são ferramentas valiosas na engenharia financeira para otimização de portfólio, oferecendo a capacidade de modelar decisões de investimento discretas de forma realista. À medida que as técnicas computacionais evoluem, espera-se que sua aplicação se expanda, levando a estratégias de investimento mais eficazes e práticas. A chave para a adoção bem sucedida está na escolha do tamanho do problema certo, alavancando os solucionadores de ponta e reconhecendo quando aproximações ou heurísticas são justificadas.Para gerentes de portfólio e analistas quantitativos, dominar a programação inteira abre a porta para construir portfólios que respeitem as restrições do mundo real, enquanto objetivam perfis de retorno de risco ótimos. Com melhorias contínuas na tecnologia de resolução e a crescente disponibilidade de computação em nuvem, a programação inteira continuará a ser uma pedra angular do financiamento quantitativo.
Para leituras posteriores, os leitores interessados podem explorar a entrada Wikipédia sobre programação inteira, a documentação para Gurobi Optimizer, ou o livro didático Programação Integral por Conforti, Cornuéjols e Zambelli. Um guia prático para otimização de portfólio com variáveis inteiras pode ser encontrado na documentação CVXPY[].