/BacenDRM.jl

Writes DRM (monthly market risk report) XML file, as required by Brazilian Central Bank (BACEN)

Primary LanguageJuliaMIT LicenseMIT

BacenDRM.jl

License travis codecov

Writes DRM (monthly market risk report) XML file, as required by Brazilian Central Bank (BACEN)

Example

# create document with basic information
doc = BacenDRM.Documento(
    "2060",              # id_docto::String,
    "v1",                # id_docto_versao::String,
    "2020-06",           # data_base::String,
    123456,              # id_inst_financ::Int64,
    :I,                  # tipo_arq::Symbol,
    "Fulano",            # nome_contato::String,
    "555-1234",          # fone_contato::String
)

# create ItemCarteira, which is an index to document data
item_carteira = BacenDRM.ItemCarteira(
    :A20,
    nothing,
    :JM1,
    :offshore,
    :banking
)

# repeat for each vertice
codigo_vertice = 1
vertice_1 = BacenDRM.Vertice(
    100_000.0, # valor_alocado::Float64
      0.0      # valor_mam::Float64
)
push!(doc, item_carteira, codigo_vertice, vertice_1) # add Vertice
# end repeat

# two vertices
ic = BacenDRM.ItemCarteira(:A30, nothing, :ME1, :offshore, :banking)
push!(doc, ic,  3, BacenDRM.Vertice(100_000.0,  0.0))
push!(doc, ic, 12, BacenDRM.Vertice(200_000.0, 10_000.0))

# you can also build a vertice adding incrementally its values
ic = BacenDRM.ItemCarteira(:P30, nothing, :JM1, :onshore_sem_clearing, :trading)
push!(doc, ic, 1, BacenDRM.Vertice(70_000.0, 0.0))
push!(doc, ic, 1, BacenDRM.Vertice(230_000.0, 0.0))
# will result in: Vertice(300_000.0, 0.0)

# one-liner
push!(doc, BacenDRM.ItemCarteira(:D41, :C, :JM1, :onshore_clearing, :banking), 1, BacenDRM.Vertice(400_000.0, 0.0))

# hedge fund assets: data goes into ativo_fundo section
ic = BacenDRM.ItemCarteira(
    :A90,
    nothing,
    :JM1,
    :offshore,
    :banking,
    true      # is_ativo_fundo::Bool=false
)
push!(doc, ic, 1, BacenDRM.Vertice(500_000.0, 0.0))

# atividade_financeira
push!(doc, BacenDRM.ItemCarteira(:AFC, :V, :JM1, nothing, :banking), 1, BacenDRM.Vertice(600_000.0, 0.0))

# write a xml file ready to be sent to BACEN...
BacenDRM.write_xml("DRM.xml", doc)

# ... or a csv file to debug results
BacenDRM.write_csv("DRM.csv", doc)

Content of "DRM.xml"

Numbers are truncated to thousands when writing in xml.

<?xml version="1.0" encoding="UTF-8"?>
<DocDRM>
  <IdDocto>2060</IdDocto>
  <IdDoctoVersao>v1</IdDoctoVersao>
  <DataBase>2020-06</DataBase>
  <IdInstFinanc>123456</IdInstFinanc>
  <TipoArq>I</TipoArq>
  <NomeContato>Fulano</NomeContato>
  <FoneContato>555-1234</FoneContato>
  <Ativo>
    <ItemCarteira Item="A20" FatorRisco="JM1" LocalRegistro="03" CarteiraNegoc="02">
      <FluxoVertice CodVertice="01" ValorAlocado="100"/>
    </ItemCarteira>
    <ItemCarteira Item="A30" FatorRisco="ME1" LocalRegistro="03" CarteiraNegoc="02">
      <FluxoVertice CodVertice="03" ValorAlocado="100"/>
      <FluxoVertice CodVertice="12" ValorAlocado="200" ValorMaM="10"/>
    </ItemCarteira>
  </Ativo>
  <Passivo>
    <ItemCarteira Item="P30" FatorRisco="JM1" LocalRegistro="02" CarteiraNegoc="01">
      <FluxoVertice CodVertice="01" ValorAlocado="300"/>
    </ItemCarteira>
  </Passivo>
  <Derivativo>
    <ItemCarteira Item="D41" IdPosicao="C" FatorRisco="JM1" LocalRegistro="01" CarteiraNegoc="02">
      <FluxoVertice CodVertice="01" ValorAlocado="400"/>
    </ItemCarteira>
  </Derivativo>
  <AtivoFundo>
    <ItemCarteira Item="A90" FatorRisco="JM1" LocalRegistro="03" CarteiraNegoc="02">
      <FluxoVertice CodVertice="01" ValorAlocado="500"/>
    </ItemCarteira>
  </AtivoFundo>
  <AtividadeFinanceira>
    <ItemCarteira Item="AFC" IdPosicao="V" FatorRisco="JM1" CarteiraNegoc="02">
      <FluxoVertice CodVertice="01" ValorAlocado="600"/>
    </ItemCarteira>
  </AtividadeFinanceira>
</DocDRM>

Content of "DRM.csv"

secao item id_posicao fator_risco local_registro carteira_negoc v01 v02 v03 v04 v05 v06 v07 v08 v09 v10 v11 v12 v12_MaM
ativo A20 JM1 offshore banking 100000.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
ativo A30 ME1 offshore banking 0.0 0.0 100000.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 200000.0 10000.0
passivo P30 JM1 onshore_sem_clearing trading 300000.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
derivativo D41 C JM1 onshore_clearing banking 400000.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
ativo_fundo A90 JM1 offshore banking 500000.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
atividade_financeira AFC V JM1 banking 600000.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0