openfunds to FundsXML 4

The converter reads an openfunds file (XLSX, CSV or a ZIP of both) and writes one FundsXML 4.2.11 document, validated against the bundled schema. The openfunds field list shows the target of every single field.

Funds and share classes

Share class rows are grouped into funds by the fund's LEI (OFST010030), or else by the legal fund name (OFST010020). Each fund becomes a Funds/Fund with its share classes. Fund-level values are written once, from the fund's first share class. A share class whose value differs keeps that value as a custom attribute.

Holdings

OFPH rows become Portfolio/Positions/Position elements of their share class (OFST020000), plus one AssetMasterData/Asset per instrument. openfunds documents the TPT field of each holding field, so the converter translates a holding into TPT values and writes it with the same rules as a TPT file: CIC, market values, weight, quantity or nominal, issuer, coupon, maturity, underlying.

Templates: EMT, EPT, EET, EFT

The OFEM, OFEP, OFEE and OFEF fields name their FinDatEx field (for example EMT: 00001_EMT_Version). FundsXML documents the same numbers in its template blocks EMT_V4_3, PRIIPS_V20, EET1.1.3 and EFTs, so about 880 template fields have an exact target. Yes/no values become Y/N or YES/NO, and decimal fractions become FundsXML percentages. A template block needs its mandatory fields. If they are missing, the block is not written, its values are kept as custom attributes and the report says so (of_template_incomplete).

Lossless: custom attributes

Every value that does not reach a FundsXML element is kept:

<CustomAttributes>
  <Attribute><Name>OF_OFST500010</Name><Type>T</Type><ValueText>yes</ValueText></Attribute>
</CustomAttributes>

These are fields without a FundsXML counterpart, values the schema rejects and values a code list cannot express exactly. FundsXML to openfunds reads them first, so openfunds → FundsXML → openfunds returns every value; the converter's tests check this.

Convert openfunds to FundsXML

Questions

What happens to openfunds fields FundsXML has no element for?

They are written as custom attributes named OF_<OF-ID> on the share class (or position). FundsXML to openfunds reads them first, so the round trip returns the original file.

Which file formats are accepted?

XLSX (all sheets are read; a sheet of OFPH columns holds the holdings), CSV with any common delimiter, and a ZIP of such files. Flat and narrow layouts are detected automatically.