Análise de Hedge em commodities Agropecuárias

Relação Spot-Futuro, Risco de Base e Efetividade da Proteção

Autor

Jefferson Guilherme Silva

Data de Publicação

7 de abril de 2026

Universidade Federal da Paraíba (UFPB)
Centro de Ciências Sociais Aplicadas (CCSA)
Departamento de Economia
GPSAE0103 - Mercado De Derivativos
Prof. Dr. Sinézio Fernandes Maia


0.1 1. Introdução

O mercado de *commodities* agropecuárias é caracterizado por elevada volatilidade de preços, decorrente de choques de oferta, fatores climáticos e dinâmicas cambiais. Nesse cenário, o mercado de derivativos atua como um mecanismo fundamental para a transferência de risco de produtores e processadores para outros agentes do mercado. Este relatório técnico tem como objetivo analisar a relação entre o mercado físico (Spot) e o mercado futuro negociado na B3 para as principais commodities do agronegócio brasileiro. O foco do estudo é avaliar a viabilidade e a efetividade de operações de proteção (hedge), contrastando fundamentos macroeconômicos com dados empíricos. O documento busca responder a questões centrais de gerenciamento de risco: qual a razão ótima de proteção, quantos contratos são necessários, e se a operação é financeiramente justificável dados os custos de margem e a volatilidade do mercado.

0.1.1 1.1 Objetivos

Analisar a tendência e a sazonalidade dos preços físicos utilizando dados de frequência mensal, conectando os resultados a relatórios de fundamentos (CONAB).Estimar a Razão Ótima de Hedge (\(h^*\)) e a sua Efetividade (\(R^2\)) por meio de regressão linear (OLS) entre as variações dos preços Spot e Futuro. Mensurar o risco de curto prazo através da volatilidade diária dos retornos logarítmicos. Demonstrar a dinâmica financeira do hedge na prática, avaliando a chamada de margem, o ajuste diário e o efeito de alavancagem.

0.2 2. Metodologia

A análise quantitativa foi desenvolvida no software R, estruturada em duas abordagens de frequência de dados para atender aos diferentes escopos do gerenciamento de risco:1. Análise Estrutural e Econométrica (Dados Mensais/Semanais): Utilizada para capturar a tendência de longo prazo, sazonalidade e a relação estatística entre os mercados físico e futuro. Aplicou-se a metodologia de regressão de Mínimos Quadrados Ordinários (OLS) sobre as primeiras diferenças dos logaritmos dos preços para estimar o parâmetro de proteção ideal (\(h^*\)) e a redução da variância (\(R^2\)).2. Análise de Volatilidade e Fluxo de Caixa (Dados Diários): Reservada para mensurar o risco de curtíssimo prazo através do cálculo da volatilidade histórica anualizada e para simular a marcação a mercado e as exigências de margem de garantia.

Cumpre salientar uma evolução metodológica adotada nesta modelagem: enquanto abordagens clássicas frequentemente recorrem a retornos semanais para suavizar ruídos de mercado, este estudo optou deliberadamente pelo uso de retornos logarítmicos diários. Essa granularidade aumenta a robustez estatística (graus de liberdade) da regressão de Ederington e reflete com maior fidelidade a microestrutura da B3. Uma vez que o mecanismo de Ajuste Diário e as chamadas de margem operam na frequência diária, o dimensionamento do risco e da Razão Ótima (h∗) exige a captura exata dessa volatilidade de curtíssimo prazo.

Código
library(tidyverse)
library(lubridate)
library(forecast)
library(knitr)
library(scales)

# Criando a função e salvando na memória do R
tratar_dados <- function(caminho_arquivo) {
  tryCatch({
    dados <- read_csv(caminho_arquivo, skip = 6, show_col_types = FALSE)
    dados <- dados[, 1:2] 
    colnames(dados) <- c("data", "preco")
    
    dados %>%
      mutate(
        data = dmy(data),
        preco = as.numeric(gsub(",", ".", as.character(preco)))
      ) %>%
      filter(!is.na(data) & !is.na(preco)) %>%
      arrange(data) 
      
  }, error = function(e) {
    message("Erro na leitura: ", caminho_arquivo)
    return(NULL)
  })
}
Código
# 1. Leitura do arquivo pulando as 3 primeiras linhas de texto do CEPEA
commodity_macro <- read_csv2("ativos_todo_o_periodo/milho_real.csv", skip = 3, show_col_types = FALSE)

# Pegamos as duas primeiras colunas (Data e Preço R$)
commodity_macro <- commodity_macro[, 1:2]
colnames(commodity_macro) <- c("data", "preco")

# Tratamento e Limpeza
commodity_macro <- commodity_macro %>%
  mutate(
    # Como a data está "07/2004", colamos "01/" na frente para o R ler como dia 01/07/2004
    data = dmy(paste0("01/", data)),
    preco = as.numeric(gsub(",", ".", as.character(preco)))
  ) %>%
  filter(!is.na(data) & !is.na(preco)) %>%
  arrange(data)

# 2. Gerando o gráfico de Tendência Linear
ggplot(commodity_macro, aes(x = data, y = preco)) +
  geom_line(color = "#2c3e50", alpha = 0.7) +
  geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed", linewidth = 1.2) +
  labs(title = "Série Histórica e Linha de Tendência Linear (Milho)",
       subtitle = "Análise de longo prazo do ativo no mercado físico (Dados Mensais)",
       x = "Ano", y = "Preço (R$)") +
  theme_minimal()

Código
# 3. Gerando o gráfico de Decomposição
# ATENÇÃO ATUARIAL: Como os dados são mensais, a frequência da série temporal agora é 12
ts_commodity <- ts(commodity_macro$preco, frequency = 12) 
decom_commodity <- decompose(ts_commodity, type = "multiplicative")

plot(decom_commodity)

Código
# 3. Gerando o gráfico de Decomposição
ts_commodity <- ts(commodity_macro$preco, frequency = 12) 
decom_commodity <- decompose(ts_commodity, type = "multiplicative")

plot(decom_commodity)

1 2. Análise Micro: Risco de Base e Convergência

Nesta etapa, aprofundamos a análise para o nível microestrutural do mercado de derivativos. Sob a ótica da Análise Fundamentalista, o mercado de commodities agropecuárias é regido por choques de oferta e demanda, sazonalidade climática e custos logísticos. Contudo, a conexão entre o mercado físico e o mercado financeiro dá-se através da teoria de precificação de derivativos estruturada por John C. Hull.

O preço futuro de um ativo (\(F\)) deve refletir o preço à vista (\(S\)) acrescido do custo de carrego (Cost of Carry), que engloba custos de armazenagem, seguros e a taxa de juros livre de risco, descontando-se o prêmio de conveniência (Convenience Yield). Quando o mercado falha em precificar perfeitamente essa relação ao longo do tempo, surge o Risco de Base:

\[Base = Preço_{Spot} - Preço_{Futuro}\]

A análise do Risco de Base é a ferramenta atuarial definitiva para diagnosticar a eficiência da proteção. O monitoramento dessa convergência (ou da falta dela) dita as regras do jogo para os dois principais agentes da cadeia produtiva:

  • O Produtor (Short Hedge): Busca proteção contra quedas de preço. Beneficia-se amplamente de mercados em Contango (\(F > S\)), onde pode travar a venda futura de sua safra embutindo um prêmio sobre o mercado à vista atual.
  • O Processador (Long Hedge): Busca proteção contra altas nos custos de matéria-prima. Encontra sua janela ideal em mercados em Backwardation (\(S > F\)), onde o travamento da compra futura ocorre com deságio em relação ao estresse do mercado físico de curto prazo.

Abaixo, testamos a hipótese de convergência e o comportamento da Base para cada ativo selecionado.

Código
#| message: false

#| warning: false

# 1. Leitura do Mercado Spot (CEPEA) - Dólar (Coluna 3)
spot_historico <- read_csv2("ativos_todo_o_periodo/soja.csv", skip = 4, show_col_types = FALSE)[, c(1, 3)]
colnames(spot_historico) <- c("data", "preco_spot")

spot_historico <- spot_historico %>%
  mutate(
    data = dmy(paste0("01/", data)),
    preco_spot = as.numeric(gsub(",", ".", as.character(preco_spot)))
  ) %>%
  filter(!is.na(data) & !is.na(preco_spot)) %>%
  arrange(data)

# 2. Leitura do Mercado Futuro (B3) - CONSERTANDO A LEITURA DOS NÚMEROS
# Usamos read_csv porque o separador é vírgula (,), mas
# especificamos que a vírgula é usada como marca decimal!
futuro_historico <- read_csv("futuros/soja_futuros.csv",
                             locale = locale(decimal_mark = ","),
                             show_col_types = FALSE)[, 1:2]
colnames(futuro_historico) <- c("data", "preco_futuro")

futuro_historico <- futuro_historico %>%
  mutate(
    data = dmy(data),
    # Como já arrumamos na leitura, não precisamos mais de gsub/as.numeric aqui
    preco_futuro = as.numeric(preco_futuro)
  ) %>%
  filter(!is.na(data) & !is.na(preco_futuro)) %>%
  arrange(data)

# 3. Cruzamento dos Dados (A partir de 2024)
df_arbitragem <- inner_join(spot_historico, futuro_historico, by = "data") %>%
  filter(data >= as.Date("2024-01-01")) %>%
  mutate(
    Base = preco_spot - preco_futuro,
    Lucro_Arbitragem_Bruto = preco_futuro - preco_spot
  ) %>%
  arrange(data)

# Tabela (agora com números corretos perto de $25-30)
kable(head(df_arbitragem, 5), digits = 2,
      caption = "Risco de Base Histórico (Soja em US$: Jan/2024 a Mar/2026)")
Risco de Base Histórico (Soja em US$: Jan/2024 a Mar/2026)
data preco_spot preco_futuro Base Lucro_Arbitragem_Bruto
2024-02-01 23.71 25.15 -1.44 1.44
2024-03-01 24.49 26.27 -1.78 1.78
2024-04-01 24.74 25.64 -0.90 0.90
2024-07-01 24.90 22.37 2.53 -2.53
2024-08-01 23.99 22.05 1.94 -1.94
Código
# 4. Gráfico de Convergência Padronizado e Profissional
ggplot(df_arbitragem, aes(x = data)) +
  geom_line(aes(y = preco_spot, color = "Mercado Spot (CEPEA)"), linewidth = 1.2) +
  geom_line(aes(y = preco_futuro, color = "Mercado Futuro (B3)"), linewidth = 1.2, linetype = "dashed") +
  # Linha extra para forçar o Y a mostrar números normais (US$ 25, US$ 30)
  scale_y_continuous(labels = scales::label_number(prefix = "US$ ", accuracy = 0.01)) +
  labs(title = "Evolução do Preço Spot vs Futuro (Soja)",
       subtitle = "Análise histórica do Risco de Base e aderência dos mercados (Dados Mensais)",
       x = "Ano", y = "Cotação Mensal (US$)") +
  scale_color_manual(values = c("Mercado Spot (CEPEA)" = "#27ae60", "Mercado Futuro (B3)" = "#c0392b")) +
  theme_minimal() +
  theme(legend.title = element_blank(), legend.position = "bottom")

Código
soja_macro <- read_csv2("ativos_todo_o_periodo/soja.csv", skip = 4, show_col_types = FALSE)[, c(1, 3)]
colnames(soja_macro) <- c("data", "preco")

soja_macro <- soja_macro %>%
  mutate(
    data = dmy(paste0("01/", data)),
    preco = as.numeric(gsub(",", ".", as.character(preco)))
  ) %>%
  filter(!is.na(data) & !is.na(preco)) %>%
  arrange(data)

# Gráfico de Tendência
ggplot(soja_macro, aes(x = data, y = preco)) +
  geom_line(color = "#27ae60", alpha = 0.7) +
  geom_smooth(method = "lm", color = "#c0392b", linetype = "dashed", linewidth = 1.2) +
  labs(title = "Série Histórica e Tendência Linear (Soja)",
       subtitle = "Análise de longo prazo do ativo no mercado físico",
       x = "Ano", y = "Preço (US$)") +
  theme_minimal()

Código
# Decomposição Sazonal
ts_soja <- ts(soja_macro$preco, frequency = 12)
plot(decompose(ts_soja, type = "multiplicative"))

1.1 Estudo de Caso: Milho (Risco de Base em Reais)

Diferentemente da Soja, cujos contratos derivativos são atrelados à moeda americana, o Milho apresenta sua formação de preços futuros na B3 cotada em Reais (R$) por saca de 60 kg. Dessa forma, a análise de convergência e o cálculo da Base prescindem de ajustes cambiais, refletindo diretamente o custo de carrego e a expectativa de safra no mercado interno.

Abaixo, extraímos a série histórica do mercado físico (CEPEA) e a cruzamos com os dados de fechamento da B3 para observar o comportamento do risco de base.

Código
# 1. Leitura do Mercado Spot (CEPEA) - Puxando Colunas 1 e 2 (Data e R$)
spot_milho <- read_csv2("ativos_todo_o_periodo/milho_real.csv", skip = 3, show_col_types = FALSE)[, 1:2]
colnames(spot_milho) <- c("data", "preco_spot")

spot_milho <- spot_milho %>%
  mutate(
    data = dmy(paste0("01/", data)),
    preco_spot = as.numeric(gsub(",", ".", as.character(preco_spot)))
  ) %>%
  filter(!is.na(data) & !is.na(preco_spot)) %>%
  arrange(data)

# 2. Leitura do Mercado Futuro (B3)
# Assumindo que o seu arquivo se chama "milho_futuro.csv" na pasta futuros
futuro_milho <- read_csv("futuros/milho_futuro.csv",
                         locale = locale(decimal_mark = ","),
                         show_col_types = FALSE)[, 1:2]
colnames(futuro_milho) <- c("data", "preco_futuro")

futuro_milho <- futuro_milho %>%
  mutate(
    data = dmy(data),
    preco_futuro = as.numeric(preco_futuro)
  ) %>%
  filter(!is.na(data) & !is.na(preco_futuro)) %>%
  arrange(data)

# 3. Cruzamento dos Dados (A partir de 2024)
df_arbitragem_milho <- inner_join(spot_milho, futuro_milho, by = "data") %>%
  filter(data >= as.Date("2024-01-01")) %>%
  mutate(
    Base = preco_spot - preco_futuro,
    Lucro_Arbitragem_Bruto = preco_futuro - preco_spot
  ) %>%
  arrange(data)

kable(head(df_arbitragem_milho, 5), digits = 2,
      caption = "Risco de Base Histórico (Milho em R$: Jan/2024 a Mar/2026)")
Risco de Base Histórico (Milho em R$: Jan/2024 a Mar/2026)
data preco_spot preco_futuro Base Lucro_Arbitragem_Bruto
2024-01-01 65.83 65.17 0.66 -0.66
2024-02-01 62.58 60.22 2.36 -2.36
2024-03-01 62.72 60.40 2.32 -2.32
2024-04-01 59.63 57.34 2.29 -2.29
2024-05-01 58.92 58.22 0.70 -0.70
Código
# 4. Gráfico de Convergência (Milho em Reais)
ggplot(df_arbitragem_milho, aes(x = data)) +
  geom_line(aes(y = preco_spot, color = "Mercado Spot (CEPEA)"), linewidth = 1.2) +
  geom_line(aes(y = preco_futuro, color = "Mercado Futuro (B3)"), linewidth = 1.2, linetype = "dashed") +
  scale_y_continuous(labels = scales::label_number(prefix = "R$ ", accuracy = 0.01)) +
  labs(title = "Evolução do Preço Spot vs Futuro (Milho)",
       subtitle = "Análise histórica do Risco de Base no mercado interno",
       x = "Ano", y = "Cotação Mensal (R$)") +
  scale_color_manual(values = c("Mercado Spot (CEPEA)" = "#f39c12", "Mercado Futuro (B3)" = "#8e44ad")) +
  theme_minimal() +
  theme(legend.title = element_blank(), legend.position = "bottom")

1.2 Estudo de Caso: Boi Gordo (Risco de Base em Reais)

O mercado de Boi Gordo possui dinâmicas peculiares ligadas ao ciclo pecuário e às condições de pastagem. Na B3, o contrato futuro (BGI) é cotado em Reais (R$) por arroba líquida. Para manter a coerência da análise de Risco de Base, extraímos a cotação em moeda nacional do indicador CEPEA/B3, garantindo a comparabilidade direta com os fechamentos do mercado futuro.

Código
# 1. Leitura do Mercado Spot (CEPEA) - Puxando Colunas 1 e 2 (Data e R$)
spot_boi <- read_csv2("ativos_todo_o_periodo/boi.csv", skip = 4, show_col_types = FALSE)[, 1:2]
colnames(spot_boi) <- c("data", "preco_spot")

spot_boi <- spot_boi %>%
  mutate(
    data = dmy(paste0("01/", data)),
    preco_spot = as.numeric(gsub(",", ".", as.character(preco_spot)))
  ) %>%
  filter(!is.na(data) & !is.na(preco_spot)) %>%
  arrange(data)

# 2. Leitura do Mercado Futuro (B3)
futuro_boi <- read_csv("futuros/boi_futuros.csv",
                         locale = locale(decimal_mark = ","),
                         show_col_types = FALSE)[, 1:2]
colnames(futuro_boi) <- c("data", "preco_futuro")

futuro_boi <- futuro_boi %>%
  mutate(
    data = dmy(data),
    preco_futuro = as.numeric(preco_futuro)
  ) %>%
  filter(!is.na(data) & !is.na(preco_futuro)) %>%
  arrange(data)

# 3. Cruzamento dos Dados (A partir de 2024)
df_arbitragem_boi <- inner_join(spot_boi, futuro_boi, by = "data") %>%
  filter(data >= as.Date("2024-01-01")) %>%
  mutate(
    Base = preco_spot - preco_futuro,
    Lucro_Arbitragem_Bruto = preco_futuro - preco_spot
  ) %>%
  arrange(data)

kable(head(df_arbitragem_boi, 5), digits = 2,
      caption = "Risco de Base Histórico (Boi Gordo em R$: Jan/2024 a Mar/2026)")
Risco de Base Histórico (Boi Gordo em R$: Jan/2024 a Mar/2026)
data preco_spot preco_futuro Base Lucro_Arbitragem_Bruto
2024-01-01 249.65 247.11 2.54 -2.54
2024-02-01 237.84 235.64 2.20 -2.20
2024-03-01 232.81 232.12 0.69 -0.69
2024-04-01 230.51 231.39 -0.88 0.88
2024-05-01 226.92 221.60 5.32 -5.32
Código
# 4. Gráfico de Convergência (Boi Gordo em Reais)
ggplot(df_arbitragem_boi, aes(x = data)) +
  geom_line(aes(y = preco_spot, color = "Mercado Spot (CEPEA)"), linewidth = 1.2) +
  geom_line(aes(y = preco_futuro, color = "Mercado Futuro (B3)"), linewidth = 1.2, linetype = "dashed") +
  scale_y_continuous(labels = scales::label_number(prefix = "R$ ", accuracy = 0.01)) +
  labs(title = "Evolução do Preço Spot vs Futuro (Boi Gordo)",
       subtitle = "Análise histórica do Risco de Base no mercado interno",
       x = "Ano", y = "Cotação Mensal (R$)") +
  scale_color_manual(values = c("Mercado Spot (CEPEA)" = "#8B4513", "Mercado Futuro (B3)" = "#D2691E")) +
  theme_minimal() +
  theme(legend.title = element_blank(), legend.position = "bottom")

Código
boi_macro <- read_csv2("ativos_todo_o_periodo/boi.csv", skip = 4, show_col_types = FALSE)[, 1:2]
colnames(boi_macro) <- c("data", "preco")

boi_macro <- boi_macro %>%
  mutate(
    data = dmy(paste0("01/", data)),
    preco = as.numeric(gsub(",", ".", as.character(preco)))
  ) %>%
  filter(!is.na(data) & !is.na(preco)) %>%
  arrange(data)

# Gráfico de Tendência
ggplot(boi_macro, aes(x = data, y = preco)) +
  geom_line(color = "#8B4513", alpha = 0.7) +
  geom_smooth(method = "lm", color = "#c0392b", linetype = "dashed", linewidth = 1.2) +
  labs(title = "Série Histórica e Tendência Linear (Boi Gordo)",
       subtitle = "Análise de longo prazo do ativo no mercado físico",
       x = "Ano", y = "Preço (R$)") +
  theme_minimal()

Código
# Decomposição Sazonal
ts_boi <- ts(boi_macro$preco, frequency = 12)
plot(decompose(ts_boi, type = "multiplicative"))

1.3 Estudo de Caso: Café Arabica

O mercado de Café Arábica possui dinâmicas peculiares ligadas ao seu ciclo de bienalidade produtiva e à alta sensibilidade a fatores climáticos globais, o que o torna um ativo de forte volatilidade. Na B3, o contrato futuro (ICF) é negociado e cotado em Dólares dos Estados Unidos (US$) por saca de 60 kg, diferentemente de ativos focados no mercado interno. Para manter a coerência atuarial da análise de Risco de Base e isolar o efeito do câmbio, extraímos a cotação já dolarizada do indicador CEPEA/ESALQ, garantindo a comparabilidade matemática direta com os fechamentos do mercado futuro.

Código
cafe_macro <- read_csv2("ativos_todo_o_periodo/cafe_arabica.csv", skip = 4, show_col_types = FALSE)[, c(1, 3)]
colnames(cafe_macro) <- c("data", "preco")

cafe_macro <- cafe_macro %>%
  mutate(
    data = dmy(paste0("01/", data)),
    preco = as.numeric(gsub(",", ".", as.character(preco)))
  ) %>%
  filter(!is.na(data) & !is.na(preco)) %>%
  arrange(data)

# Gráfico de Tendência
ggplot(cafe_macro, aes(x = data, y = preco)) +
  geom_line(color = "#6E2C00", alpha = 0.7) +
  geom_smooth(method = "lm", color = "#c0392b", linetype = "dashed", linewidth = 1.2) +
  labs(title = "Série Histórica e Tendência Linear (Café Arábica)",
       subtitle = "Análise de longo prazo do ativo no mercado físico",
       x = "Ano", y = "Preço (US$)") +
  theme_minimal()

Código
# Decomposição Sazonal
ts_cafe <- ts(cafe_macro$preco, frequency = 12)
plot(decompose(ts_cafe, type = "multiplicative"))

Código
# 1. Leitura do Mercado Spot (CEPEA) - Puxando Colunas 1 e 3 (Data e US$)
spot_cafe <- read_csv2("ativos_todo_o_periodo/cafe_arabica.csv", skip = 4, show_col_types = FALSE)[, c(1, 3)]
colnames(spot_cafe) <- c("data", "preco_spot")

spot_cafe <- spot_cafe %>%
  mutate(
    data = dmy(paste0("01/", data)),
    preco_spot = as.numeric(gsub(",", ".", as.character(preco_spot)))
  ) %>%
  filter(!is.na(data) & !is.na(preco_spot)) %>%
  arrange(data)

# 2. Leitura do Mercado Futuro (B3)
futuro_cafe <- read_csv("futuros/cafe_arabica_futuros.csv",
                         locale = locale(decimal_mark = ","),
                         show_col_types = FALSE)[, 1:2]
colnames(futuro_cafe) <- c("data", "preco_futuro")

futuro_cafe <- futuro_cafe %>%
  mutate(
    data = dmy(data),
    preco_futuro = as.numeric(preco_futuro)
  ) %>%
  filter(!is.na(data) & !is.na(preco_futuro)) %>%
  arrange(data)

# 3. Cruzamento dos Dados (A partir de 2024)
df_arbitragem_cafe <- inner_join(spot_cafe, futuro_cafe, by = "data") %>%
  filter(data >= as.Date("2024-01-01")) %>%
  mutate(
    Base = preco_spot - preco_futuro,
    Lucro_Arbitragem_Bruto = preco_futuro - preco_spot
  ) %>%
  arrange(data)

kable(head(df_arbitragem_cafe, 5), digits = 2,
      caption = "Risco de Base Histórico (Café Arábica em US$: Jan/2024 a Mar/2026)")
Risco de Base Histórico (Café Arábica em US$: Jan/2024 a Mar/2026)
data preco_spot preco_futuro Base Lucro_Arbitragem_Bruto
2024-01-01 201.52 237.85 -36.33 36.33
2024-02-01 203.34 236.25 -32.91 32.91
2024-03-01 203.66 232.55 -28.89 28.89
2024-04-01 236.77 267.95 -31.18 31.18
2024-05-01 228.75 278.65 -49.90 49.90
Código
# 4. Gráfico de Convergência (Café em Dólares)
ggplot(df_arbitragem_cafe, aes(x = data)) +
  geom_line(aes(y = preco_spot, color = "Mercado Spot (CEPEA)"), linewidth = 1.2) +
  geom_line(aes(y = preco_futuro, color = "Mercado Futuro (B3)"), linewidth = 1.2, linetype = "dashed") +
  scale_y_continuous(labels = scales::label_number(prefix = "US$ ", accuracy = 0.01)) +
  labs(title = "Evolução do Preço Spot vs Futuro (Café Arábica)",
       subtitle = "Análise histórica do Risco de Base e aderência dos mercados",
       x = "Ano", y = "Cotação Mensal (US$)") +
  scale_color_manual(values = c("Mercado Spot (CEPEA)" = "#6E2C00", "Mercado Futuro (B3)" = "#A04000")) +
  theme_minimal() +
  theme(legend.title = element_blank(), legend.position = "bottom")

2 Simulação Prática de Estratégia: Short Hedge (Estudo de Caso)

Para materializar os conceitos de precificação de derivativos estruturados por John Hull e a dinâmica de Risco de Base analisada nas seções anteriores, simulamos a seguir uma operação de proteção (Hedge) utilizando os dados reais extraídos do mercado de Milho.

O Cenário Base (Produtor Agrícola): Um produtor de milho iniciou seu plantio em Janeiro de 2024, com expectativa de colheita e venda física para Maio de 2024. Temendo uma queda nas cotações durante o desenvolvimento da safra, ele decide travar seu preço de venda realizando um Short Hedge (Hedge de Venda) na B3.

  • Ativo: Milho (CCM)
  • Tamanho do Contrato B3: 450 sacas de 60 kg.
  • Tamanho da Proteção: 5 contratos (Volume total de 2.250 sacas).
  • Mecânica: No momento do plantio (\(T_0\)), o produtor vende 5 contratos futuros. Na colheita (\(T_1\)), ele vende sua soja no mercado físico (Spot) e simultaneamente compra 5 contratos futuros para zerar sua posição na bolsa, apurando os ajustes.

Abaixo, o algoritmo extrai as cotações históricas reais do CEPEA e da B3 para estas datas específicas e estrutura a planilha de liquidação da operação:

Código
# 1. Parâmetros da Operação (Fidelidade à planilha de sala de aula)
contratos <- 5                  
tamanho_contrato <- 450         
volume_total <- contratos * tamanho_contrato 

# 2. Resgatando os preços REAIS da nossa base de dados (Plantio Jan/24, Colheita Mai/24)
operacao <- df_arbitragem_milho %>%
  filter(data %in% as.Date(c("2024-01-01", "2024-05-01")))

# Separando as variáveis (s = spot, f = futuro)
s0 <- operacao$preco_spot[1]
f0 <- operacao$preco_futuro[1]
s1 <- operacao$preco_spot[2]
f1 <- operacao$preco_futuro[2]

# 3. Matemática Financeira da Operação de Short Hedge
# O produtor ganha no futuro se o preço cair (f0 > f1).
resultado_futuro_saca <- f0 - f1
preco_efetivo_recebido <- s1 + resultado_futuro_saca

receita_fisico <- s1 * volume_total
ajuste_futuro_total <- resultado_futuro_saca * volume_total
receita_final_hedge <- receita_fisico + ajuste_futuro_total

# 4. Estruturando a Planilha Financeira para o Relatório
tabela_hedge <- data.frame(
  Evento = c("Montagem (Jan/24)", "Desmonte (Mai/24)", "Liquidação Final"),
  Mercado_Fisico_Spot = c(sprintf("Cotação: R$ %.2f", s0),
                          sprintf("Vende Físico a R$ %.2f", s1),
                          sprintf("Receita Físico: R$ %.2f", receita_fisico)),
  Mercado_Futuro_B3 = c(sprintf("Vende Futuro a R$ %.2f", f0),
                        sprintf("Compra Futuro a R$ %.2f", f1),
                        sprintf("Ajuste B3: R$ %.2f", ajuste_futuro_total)),
  Risco_de_Base = c(sprintf("Base Inicial: R$ %.2f", s0 - f0),
                    sprintf("Base Final: R$ %.2f", s1 - f1),
                    sprintf("Preço Efetivo/Saca: R$ %.2f", preco_efetivo_recebido))
)

kable(tabela_hedge, align = "c", caption = "Planilha de Liquidação: Short Hedge com Milho (5 Contratos B3)")
Planilha de Liquidação: Short Hedge com Milho (5 Contratos B3)
Evento Mercado_Fisico_Spot Mercado_Futuro_B3 Risco_de_Base
Montagem (Jan/24) Cotação: R$ 65.83 Vende Futuro a R$ 65.17 Base Inicial: R$ 0.66
Desmonte (Mai/24) Vende Físico a R$ 58.92 Compra Futuro a R$ 58.22 Base Final: R$ 0.70
Liquidação Final Receita Físico: R$ 132570.00 Ajuste B3: R$ 15637.50 Preço Efetivo/Saca: R$ 65.87

2.0.1 1.5 Estatística Descritiva: Risco e Volatilidade (Mercado Físico)

Para justificar a necessidade de operações de proteção (Hedge) no mercado de derivativos, é fundamental quantificar o risco inerente a cada commodity no mercado físico. A estatística descritiva abaixo calcula o Coeficiente de Variação (CV), que mensura a dispersão relativa dos preços, e a Volatilidade Anualizada, calculada a partir do desvio padrão dos retornos logarítmicos.

Código
# Função para calcular CV e Volatilidade Anualizada
calcula_risco <- function(df, nome_ativo) {
  precos <- df$preco
  retornos <- diff(log(precos))
  
  media_preco <- mean(precos, na.rm = TRUE)
  desvio_preco <- sd(precos, na.rm = TRUE)
  cv_preco <- (desvio_preco / media_preco) * 100
  
  # Volatilidade Anualizada (dados mensais = raiz de 12)
  volatilidade <- sd(retornos, na.rm = TRUE) * sqrt(12) * 100
  
  data.frame(
    Commodity = nome_ativo,
    CV_Preco_Perc = cv_preco,
    Volatilidade_Anual_Perc = volatilidade
  )
}

# Aplicando a função nas bases Macro que já processamos
risco_milho <- calcula_risco(commodity_macro, "Milho (R$)")
risco_soja <- calcula_risco(soja_macro, "Soja (US$)")
risco_boi <- calcula_risco(boi_macro, "Boi Gordo (R$)")
risco_cafe <- calcula_risco(cafe_macro, "Café Arábica (US$)")

# Consolidando a Tabela
tabela_risco <- rbind(risco_milho, risco_soja, risco_boi, risco_cafe)

kable(tabela_risco, digits = 2, align = "c",
      col.names = c("Commodity", "Coef. de Variação (CV %)", "Volatilidade Anualizada (%)"),
      caption = "Métricas de Risco Histórico no Mercado Físico (Spot)")
Métricas de Risco Histórico no Mercado Físico (Spot)
Commodity Coef. de Variação (CV %) Volatilidade Anualizada (%)
Milho (R\() | 56.25 | 24.09 | | Soja (US\)) 22.20 18.39
Boi Gordo (R\() | 50.72 | 14.70 | | Café Arábica (US\)) 52.52 26.93

2.0.2 1.3 Fundamentos de Mercado: A Perspectiva da CONAB

O comportamento estrutural dos preços no mercado físico, evidenciado na análise de decomposição temporal, reflete diretamente os choques de oferta e demanda do setor agropecuário. Para fundamentar as movimentações da série histórica, utilizam-se os levantamentos de safra da Companhia Nacional de Abastecimento (CONAB).

A precificação da commodity é sensível a variáveis como área plantada, produtividade estimada e condições climáticas. Segundo o 6º Levantamento da Safra 2025/26 da CONAB , a estimativa aponta para uma produção nacional recorde de 177,8 milhões de toneladas para a Soja e 138,3 milhões de toneladas para o Milho Total. O relatório destaca que o clima apresentou desafios recentes, como o excesso de precipitações no Centro-Oeste e Sudeste, além da severa restrição hídrica no Rio Grande do Sul. No entanto, de modo geral, as chuvas favoreceram o desenvolvimento das lavouras em fase de enchimento de grãos na maior parte do país.

Essa dinâmica fundamenta a tendência observada nos dados empíricos: momentos de expansão de área e clima favorável tendem a gerar excedentes que deprimem as cotações no período de colheita, enquanto quebras de safra ou aumento na demanda aquecem os preços. Compreender esses fundamentos é essencial, pois o risco de oscilação de preço gerado por esses fatores macroeconômicos é exatamente o que motiva a necessidade de proteção no mercado futuro.

2.1 4. Econometria do Hedge (Abordagem de Ederington) 

Para que uma operação de proteção seja eficiente, não basta assumir posições opostas no mercado físico e futuro em proporções iguais (o chamado Hedge Ingênuo ou 1:1). Devido ao Risco de Base e às diferentes volatilidades entre os mercados, é necessário calibrar a posição estatisticamente. Conforme a metodologia de Ederington (1979) adotada na literatura atuarial, utilizamos a regressão linear pelo Método dos Mínimos Quadrados Ordinários (OLS) para encontrar a Razão Ótima de Hedge (\(h^*\)). Para evitar problemas de regressão espúria, o modelo não cruza os preços absolutos, mas sim as variações (retornos logarítmicos) do mercado à vista (\(\Delta S\)) e do mercado futuro (\(\Delta F\)): \[\Delta S_t = \alpha + \beta \Delta F_t + \epsilon_t\] O coeficiente angular (\(\beta\)) dessa regressão equivale à razão ótima \(h^*\). Além disso, o Coeficiente de Determinação (\(R^2\)) da regressão fornece a **Efetividade do Hedge (\(E^*\))**, que representa o percentual da variância do preço físico que é mitigado pela posição no mercado futuro.

## 4.1 Cálculo de \(h^*\), Efetividade (\(R^2\)) e Número de Contratos (\(N^*\)) Abaixo, calculamos a econometria do *hedge* utilizando os dados mensais das *commodities* analisadas. Para o cálculo do Número Ótimo de Contratos (\(N^*\)), assumimos um cenário onde o agente (Produtor ou Processador) possui uma exposição física (\(Q_A\)) equivalente a 10 vezes o tamanho de um contrato padrão da B3 (\(Q_F\)). \[N^* = h^* \times \left( \frac{Q_A}{Q_F} \right)\]

Código
# Função para rodar a regressão com os Retornos (Ederington)
calcula_parametros_ederington <- function(df_arbitragem, nome_ativo) {
  
  # Calculando as variações (Retornos Logarítmicos)
  df_retornos <- df_arbitragem %>%
    mutate(
      delta_S = c(NA, diff(log(preco_spot))),
      delta_F = c(NA, diff(log(preco_futuro)))
    ) %>%
    drop_na() # Remove a primeira linha vazia
  
  # Regressão Linear: delta S ~ delta F
  modelo <- lm(delta_S ~ delta_F, data = df_retornos)
  
  # Extraindo parâmetros
  h_star <- coef(modelo)[2] # O Beta da regressão
  r_quadrado <- summary(modelo)$r.squared
  
  # Calculando N* (Assumindo QA/QF = 10)
  razao_QA_QF <- 10 
  n_star <- h_star * razao_QA_QF
  
  data.frame(
    Commodity = nome_ativo,
    Razao_Otima_h = h_star,
    Efetividade_R2 = r_quadrado * 100,
    Contratos_N = n_star
  )
}

# Aplicando aos nossos dataframes mensais já existentes
# (Os dataframes df_arbitragem... foram gerados na Seção 2)
hedge_milho <- calcula_parametros_ederington(df_arbitragem_milho, "Milho")
hedge_soja <- calcula_parametros_ederington(df_arbitragem, "Soja")
hedge_boi <- calcula_parametros_ederington(df_arbitragem_boi, "Boi Gordo")
hedge_cafe <- calcula_parametros_ederington(df_arbitragem_cafe, "Café Arábica")

# Consolidando a tabela
tabela_econometria <- rbind(hedge_milho, hedge_soja, hedge_boi, hedge_cafe)

kable(tabela_econometria, digits = 4, align = "c",
      col.names = c("Commodity", "Razão Ótima (h*)", "Efetividade do Hedge (R² %)", "Nº Ótimo de Contratos (N*)"),
      caption = "Parâmetros Econométricos de Hedge (Abordagem de Ederington)")
Parâmetros Econométricos de Hedge (Abordagem de Ederington)
Commodity Razão Ótima (h*) Efetividade do Hedge (R² %) Nº Ótimo de Contratos (N*)
delta_F Milho 0.3734 20.3463 3.7337
delta_F1 Soja 0.0306 0.3616 0.3061
delta_F2 Boi Gordo 0.7855 83.1999 7.8545
delta_F3 Café Arábica 0.4295 30.2436 4.2946

Os resultados econométricos indicam diferenças relevantes na qualidade do hedge entre as commodities analisadas. O Boi Gordo apresentou o melhor desempenho relativo, com Razão Ótima de Hedge ((h^* = 0{,}7855)) próxima de 0,8 e efetividade elevada ((R^2 = 83{,}20%)), sugerindo forte capacidade do contrato futuro de reduzir o risco do mercado físico no período analisado. Esse resultado indica que, para essa commodity, a proteção via mercado futuro mostrou-se economicamente consistente e operacionalmente relevante.

Em contraste, a Soja apresentou desempenho bastante limitado como instrumento de hedge, com razão ótima muito baixa \(((h^* = 0{,}0306))\) e efetividade praticamente nula \(((R^2 = 0{,}36%))\) . Esse resultado sugere baixa aderência entre os movimentos do mercado físico e do mercado futuro, reduzindo significativamente a utilidade prática da proteção para essa commodity no intervalo analisado. Já o Milho e o Café Arábica apresentaram resultados intermediários, com efetividade superior à da Soja, porém consideravelmente inferior à observada para o Boi Gordo, indicando capacidade parcial de mitigação do risco.

Código
# NOTA: O código abaixo assume que os dados mensais ou semanais já estão carregados 
# nos dataframes (ex: df_arbitragem) com colunas 'preco_spot' e 'preco_futuro'.

# Função para extrair métricas do Hedge
calcular_metricas_hedge <- function(df, nome_ativo) {
  # Cálculo dos retornos logarítmicos
  df_ret <- df %>%
    mutate(
      ret_spot = c(NA, diff(log(preco_spot))),
      ret_futuro = c(NA, diff(log(preco_futuro)))
    ) %>%
    drop_na()
  
  # Estatísticas básicas
  correlacao <- cor(df_ret$ret_spot, df_ret$ret_futuro)
  sd_spot <- sd(df_ret$ret_spot)
  sd_futuro <- sd(df_ret$ret_futuro)
  
  # Regressão OLS: Retorno Spot ~ Retorno Futuro
  modelo <- lm(ret_spot ~ ret_futuro, data = df_ret)
  h_star <- coef(modelo)[2]
  efetividade_R2 <- summary(modelo)$r.squared
  
  # Cálculo de Contratos (Assumindo uma exposição equivalente a 10 contratos padrão)
  Q_A <- 10 
  Q_F <- 1
  N_star <- h_star * (Q_A / Q_F)
  
  data.frame(
    Ativo = nome_ativo,
    Correlacao = round(correlacao, 4),
    h_Otimo = round(h_star, 4),
    Efetividade_Perc = round(efetividade_R2 * 100, 2),
    Contratos_N = round(N_star, 1)
  )
}

2.2 6. Simulação Prática:

Margem, Ajuste Diário e Alavancagem A efetivação de um hedge no mercado futuro não exige o desembolso do valor total dos contratos, mas sim o depósito de uma Margem de Garantia. Essa característica gera o efeito de Alavancagem, permitindo que o produtor proteja grandes volumes de capital imobilizando uma fração muito menor de recursos em caixa. Para mitigar o risco de crédito entre as partes, a B3 utiliza o mecanismo de Ajuste Diário (marcação a mercado), onde lucros e prejuízos são creditados ou debitados diariamente nas contas dos investidores com base no preço de ajuste de fechamento. Para ilustrar essa dinâmica financeira e calcular o Retorno sobre a Margem, simulamos abaixo um Short Hedge (Hedge de Venda) de 5 pregões no mercado de Milho (CCM).

Parâmetros da Operação: * Ativo: Milho (CCM) - 1 Contrato = 450 sacas. * Posição: Venda de 5 contratos (Volume total = 2.250 sacas). * Margem de Garantia Exigida: 10% do valor total do contrato no momento da entrada.

Código
# 1. Dados Simulados Diários (5 Pregões de Milho)
dias <- c("Dia 1 (Entrada)", "Dia 2", "Dia 3", "Dia 4", "Dia 5 (Saída)")
preco_futuro_ajuste <- c(60.00, 59.00, 59.50, 58.00, 57.00) # Cotação em R$

# 2. Parâmetros do Contrato
contratos <- 5
tamanho_contrato <- 450
volume_total <- contratos * tamanho_contrato

# 3. Dinâmica Financeira
valor_contrato_total <- preco_futuro_ajuste[1] * volume_total
margem_garantia <- valor_contrato_total * 0.10 # 10% de margem
alavancagem <- valor_contrato_total / margem_garantia

# Calculando o Ajuste Diário (Como estamos VENDIDOS, ganhamos quando o preço cai)
ajuste_diario <- c(0, -diff(preco_futuro_ajuste)) * volume_total
fluxo_caixa_acumulado <- cumsum(ajuste_diario)
saldo_conta_margem <- margem_garantia + fluxo_caixa_acumulado

# 4. Estruturando a Tabela
tabela_ajustes <- data.frame(
  Pregao = dias,
  Preco_Ajuste_B3 = sprintf("R$ %.2f", preco_futuro_ajuste),
  Ajuste_Diario_R = sprintf("R$ %.2f", ajuste_diario),
  Fluxo_Acumulado = sprintf("R$ %.2f", fluxo_caixa_acumulado),
  Saldo_Conta = sprintf("R$ %.2f", saldo_conta_margem)
)

kable(tabela_ajustes, align = "c", 
      caption = "Fluxo de Caixa Diário: Ajuste e Margem de Garantia (Short Hedge)")
Fluxo de Caixa Diário: Ajuste e Margem de Garantia (Short Hedge)
Pregao Preco_Ajuste_B3 Ajuste_Diario_R Fluxo_Acumulado Saldo_Conta
Dia 1 (Entrada) R$ 60.00 R$ 0.00 R$ 0.00 R$ 13500.00
Dia 2 R$ 59.00 R$ 2250.00 R$ 2250.00 R$ 15750.00
Dia 3 R$ 59.50 R$ -1125.00 R$ 1125.00 R$ 14625.00
Dia 4 R$ 58.00 R$ 3375.00 R$ 4500.00 R$ 18000.00
Dia 5 (Saída) R$ 57.00 R$ 2250.00 R$ 6750.00 R$ 20250.00
Código
# 5. Calculando Métricas de Desempenho do Hedge
lucro_total_hedge <- fluxo_caixa_acumulado[5]
retorno_sobre_margem <- (lucro_total_hedge / margem_garantia) * 100

cat(sprintf("-> Margem de Garantia Depositada: R$ %.2f\n", margem_garantia))
-> Margem de Garantia Depositada: R$ 13500.00
Código
cat(sprintf("-> Valor Total Protegido (Nocional): R$ %.2f\n", valor_contrato_total))
-> Valor Total Protegido (Nocional): R$ 135000.00
Código
cat(sprintf("-> Fator de Alavancagem: %.1fx\n", alavancagem))
-> Fator de Alavancagem: 10.0x
Código
cat(sprintf("-> Lucro Total no Mercado Futuro: R$ %.2f\n", lucro_total_hedge))
-> Lucro Total no Mercado Futuro: R$ 6750.00
Código
cat(sprintf("-> Retorno sobre a Margem (ROE): %.2f%%\n", retorno_sobre_margem))
-> Retorno sobre a Margem (ROE): 50.00%

2.2.1 2.1 Volatilidade, Correlação e Comportamento da Base

Enquanto a análise mensal revela a tendência e os fundamentos de longo prazo, a decisão operacional de proteção requer a compreensão da dinâmica diária.

volatilidade diária reflete o risco de curto prazo e a incerteza imediata do mercado. Uma volatilidade alta indica oscilações bruscas, o que eleva a necessidade de proteção, mas também exige maior robustez financeira do agente produtor para suportar a operação de margem. Com base nos retornos logarítmicos, o mercado físico (Spot) apresentou volatilidades variando de 14,14% ao ano (Milho) até 21,55% ao ano (Boi Gordo). O mercado futuro, por sua natureza mais líquida e especulativa, apresentou picos de volatilidade ainda maiores, chegando a 33,21% no Café Arábica.

A viabilidade dessa proteção diária depende diretamente da correlação entre o Spot e o Futuro no curto prazo. O Café Arábica registrou a melhor correlação da amostra (ρ=0,6925), atestando que ambos os mercados caminham juntos de forma razoável. Por outro lado, a baixíssima correlação do Boi Gordo (ρ=0,0604) alerta para um Risco de Base elevadíssimo.

Por fim, a Base Diária (diferença entre preço físico e futuro) traduz esse risco. Se a base for estável ou previsível ao longo do tempo, o hedge é altamente confiável. Quando a base é muito instável e descorrelacionada (como evidenciado nos dados do Boi e do Milho da amostra), a operação futura pode gerar resultados inesperados, descolando-se da realidade física e atuando mais como um risco adicional do que como uma trava de proteção.

Código
library(tidyverse)
library(lubridate)
library(knitr)

# 1. Importando e limpando o Futuro (B3)
milho_fut_bruto <- read_csv("futuros_diario/milho_futuro.csv") 
milho_fut_clean <- milho_fut_bruto %>%
  select(Data, preco_futuro = Último) %>%
  mutate(
    Data = dmy(Data),
    preco_futuro = ifelse(preco_futuro > 1000, preco_futuro / 100, preco_futuro) 
  )

# 2. Importando e limpando o Spot (CEPEA)
milho_spot_bruto <- read_csv2("ativos_diario/milho_diario.csv") 
milho_spot_clean <- milho_spot_bruto %>%
  select(Data = 1, preco_spot = 2) %>% 
  mutate(Data = dmy(Data))

# 3. Cruzando as planilhas (Inner Join), ajustando a vírgula e calculando retornos
df_diario_real <- inner_join(milho_spot_clean, milho_fut_clean, by = "Data") %>%
  arrange(Data) %>%
  mutate(
    preco_spot = as.numeric(gsub(",", ".", preco_spot)), 
    retorno_spot = c(NA, diff(log(preco_spot))),
    retorno_futuro = c(NA, diff(log(preco_futuro)))
  ) %>%
  drop_na()

# 4. Cálculo da Volatilidade Anualizada
vol_spot <- sd(df_diario_real$retorno_spot) * sqrt(252) * 100
vol_futuro <- sd(df_diario_real$retorno_futuro) * sqrt(252) * 100

tabela_volatilidade <- data.frame(
  Mercado = c("Físico (Spot)", "Futuro (B3)"),
  Volatilidade_Anualizada = c(sprintf("%.2f%%", vol_spot), sprintf("%.2f%%", vol_futuro))
)

kable(tabela_volatilidade, align = "c", 
      caption = "Volatilidade Anualizada (Base: Cotações Diárias Reais)")
Volatilidade Anualizada (Base: Cotações Diárias Reais)
Mercado Volatilidade_Anualizada
Físico (Spot) 14.14%
Futuro (B3) 24.55%
Código
# 5. Distribuição dos Retornos (Risco de Cauda)
ggplot(df_diario_real, aes(x = retorno_spot)) +
  geom_histogram(bins = 30, fill = "#2c3e50", color = "white", alpha = 0.8) +
  geom_vline(aes(xintercept = mean(retorno_spot)), color = "red", linetype = "dashed", linewidth = 1) +
  labs(title = "Distribuição dos Retornos Diários (Mercado Físico)",
       subtitle = "Avaliação empírica da dispersão e risco do ativo objeto",
       x = "Retorno Logarítmico Diário", y = "Frequência") +
  scale_x_continuous(labels = scales::percent_format(accuracy = 0.1)) +
  theme_minimal()

A decisão de proteção não deve ser baseada apenas na observação visual das séries, mas em uma relação estatística rigorosa entre o mercado à vista (Spot) e o mercado Futuro. Para isso, estima-se uma regressão linear (OLS) entre as variações (retornos) dos preços físicos e futuros.

Razão Ótima de Hedge (\(h^*\)) A literatura financeira demonstra que a proporção ideal de proteção para minimizar a variância do portfólio não é necessariamente 1:1. A Razão Ótima de Hedge (\(h^*\)) é calculada pela relação entre a correlação dos mercados (\(\rho\)) e a razão de suas volatilidades (\(\sigma\)), conforme a fórmula:

\[h^* = \rho_{(S,F)} \times \left( \frac{\sigma_S}{\sigma_F} \right)\]

A modelagem econométrica revelou cenários distintos entre os ativos. O Café Arábica obteve a melhor relação, com um \(h^*\) de 0,4041. Economicamente, isso significa que para cada unidade de café físico exposta ao risco de oscilação, o agente deve proteger 40,41% dessa posição no mercado futuro para obter a mitigação ideal. Para a Soja, essa razão ótima foi de 30,51%, enquanto o Milho exigiria apenas 14,45%.

Efetividade do Hedge (\(R^2\)) O coeficiente de determinação (\(R^2\)) da regressão mede a Efetividade do Hedge. Ele indica qual percentual do risco de preço do ativo físico consegue ser eliminado ao assumir a posição oposta no mercado futuro. O Café Arábica destacou-se com um \(R^2\) de 47,95%, demonstrando que a operação de proteção é capaz de mitigar quase metade da variância total da carteira do produtor. Em contrapartida, ativos como o Boi Gordo (0,36%) e o Milho (6,30%) apresentaram baixíssima efetividade, indicando que os mercados físico e futuro descolaram no período analisado.

Número Ótimo de Contratos (\(N^*\)) Na prática operacional da B3, a Razão Ótima deve ser convertida no número de contratos padrão a serem negociados. Isso é feito pela seguinte equação:

\[N^* = h^* \times \left( \frac{Q_A}{Q_F} \right)\]

Onde \(Q_A\) representa a quantidade total do ativo físico que se deseja proteger e \(Q_F\) representa o tamanho padrão de um contrato futuro. Considerando uma exposição hipotética equivalente a 10 contratos (\(Q_A/Q_F = 10\)), o cafeicultor precisaria negociar 4 contratos (\(N^* = 4,0\)) para blindar sua safra com a máxima eficiência matemática, evitando ficar subprotegido ou assumir um risco especulativo residual.

Código
library(tidyverse)
library(lubridate)
library(knitr)

# 1. Criando a "Máquina" com Volatilidade Incluída
calcular_hedge_completo <- function(nome_ativo, path_spot, path_futuro) {
  
  # A) Importação e limpeza
  df_fut <- read_csv(path_futuro, show_col_types = FALSE) %>%
    select(Data, preco_futuro = Último) %>%
    mutate(Data = dmy(Data), preco_futuro = ifelse(preco_futuro > 1000, preco_futuro / 100, preco_futuro))
  
  df_spot <- read_csv2(path_spot, show_col_types = FALSE) %>%
    select(Data = 1, preco_spot = 2) %>% mutate(Data = dmy(Data))
  
  # B) Cruzamento e Retornos
  df_join <- inner_join(df_spot, df_fut, by = "Data") %>%
    arrange(Data) %>%
    mutate(
      preco_spot = as.numeric(gsub(",", ".", preco_spot)),
      retorno_spot = c(NA, diff(log(preco_spot))),
      retorno_futuro = c(NA, diff(log(preco_futuro)))
    ) %>% drop_na()
  
  # C) Cálculos de Volatilidade (Anualizada)
  vol_spot <- sd(df_join$retorno_spot) * sqrt(252) * 100
  vol_fut <- sd(df_join$retorno_futuro) * sqrt(252) * 100
  
  # D) Regressão de Ederington
  modelo <- lm(retorno_spot ~ retorno_futuro, data = df_join)
  h_star <- coef(modelo)[2]
  r_quadrado <- summary(modelo)$r.squared
  correlacao <- cor(df_join$retorno_spot, df_join$retorno_futuro)
  
  # E) Número de Contratos (Assumindo QA/QF = 10)
  N_star <- h_star * 10 
  
  # Retorna a linha completa para a tabela
  data.frame(
    Commodity = nome_ativo,
    Volatilidade_Spot = sprintf("%.2f%%", vol_spot),
    Volatilidade_Futuro = sprintf("%.2f%%", vol_fut),
    Correlacao = round(correlacao, 4),
    Razao_Otima_h = round(h_star, 4),
    Efetividade_R2 = sprintf("%.2f%%", r_quadrado * 100),
    Contratos_N = round(N_star, 1)
  )
}

# 2. Rodando para todas as commodities
res_milho <- calcular_hedge_completo("Milho", "ativos_diario/milho_diario.csv", "futuros_diario/milho_futuro.csv")
res_soja  <- calcular_hedge_completo("Soja", "ativos_diario/soja_diario.csv", "futuros_diario/soja_futuro.csv")
res_boi   <- calcular_hedge_completo("Boi Gordo", "ativos_diario/boi_diario.csv", "futuros_diario/boi_futuro.csv")
res_cafe  <- calcular_hedge_completo("Café Arábica", "ativos_diario/cafe_diario.csv", "futuros_diario/cafe_futuro.csv")

# 3. Consolidando a super tabela
tabela_geral <- rbind(res_milho, res_soja, res_boi, res_cafe)

kable(tabela_geral, align = "c",
      col.names = c("Commodity", "Volatilidade Spot", "Volatilidade Futuro", "Correlação (ρ)", "Razão Ótima (h*)", "Efetividade (R²)", "Nº de Contratos"),
      caption = "Quadro Completo de Risco e Parâmetros de Hedge (Base: Cotações Diárias)")
Quadro Completo de Risco e Parâmetros de Hedge (Base: Cotações Diárias)
Commodity Volatilidade Spot Volatilidade Futuro Correlação (ρ) Razão Ótima (h*) Efetividade (R²) Nº de Contratos
retorno_futuro Milho 14.14% 24.55% 0.2510 0.1445 6.30% 1.4
retorno_futuro1 Soja 21.52% 22.49% 0.3187 0.3051 10.16% 3.1
retorno_futuro2 Boi Gordo 21.55% 14.96% 0.0604 0.0869 0.36% 0.9
retorno_futuro3 Café Arábica 19.38% 33.21% 0.6925 0.4041 47.95% 4.0

2.3 Conclusão: Afinal, vale a pena realizar o Hedge?

O presente estudo estruturou a análise de derivativos agropecuários conectando a econometria teórica com a realidade do mercado físico brasileiro. A partir dos dados empíricos analisados, a resposta à pergunta central de pesquisa é: Depende substancialmente da commodity e da estabilidade da base.

A recomendação favorável à utilização de contratos futuros ampara-se apenas nos casos em que a matemática comprova a convergência. Para o Café Arábica, a resposta é um categórico sim. A modelagem econométrica revelou uma correlação positiva forte (ρ=0,6925) e uma Efetividade (R2) de 47,95%. Nesse caso, utilizar a Razão Ótima (h∗) otimiza a redução da variância do portfólio, justificando plenamente a alocação de capital para o depósito de margem de garantia. 

Em contrapartida, para o Boi GordoMilho e Soja, as métricas apuradas no período histórico em questão desaconselham a operação mecânica. Com coeficientes de efetividade baixos (abaixo de 11%), fica estatisticamente provado que assumir posições na B3 para esses ativos não eliminou o risco do mercado físico de forma eficiente. Nesses cenários de alto Risco de Base, a montagem da posição futura não traz proteção atuarial robusta, incorrendo apenas em custos de ajuste diário e alavancagem, o que pode pressionar o fluxo de caixa do produtor rural. 

2.4 Referências Bibliográficas

CENTRO DE ESTUDOS AVANÇADOS EM ECONOMIA APLICADA (CEPEA). Indicadores Agropecuários: Milho, Soja, Boi Gordo e Café Arábica. Piracicaba: ESALQ/USP, 2026. Disponível em: https://www.cepea.esalq.usp.br. Acesso em: abr. 2026.

COMPANHIA NACIONAL DE ABASTECIMENTO (CONAB). Acompanhamento da Safra Brasileira de Grãos: 6º Levantamento, Safra 2025/26. Brasília: Conab, mar. 2026.

EDERINGTON, L. H. The Hedging Performance of the New Futures Markets. The Journal of Finance, v. 34, n. 1, p. 157-170, mar. 1979.

HULL, J. C. Opções, Futuros e Outros Derivativos. 11. ed. São Paulo: Pearson Education do Brasil, 2023.

INVESTING.COM. Cotações Históricas de Contratos Futuros Agropecuários. [S.l.]: Investing.com, 2026. Disponível em: https://br.investing.com. Acesso em: abr. 2026.