How do I create a fund?

Prev Next

You can create a fund that marshalls all the components necessary to strike a NAV and generate other financial reports for different audiences at regular intervals.

Methods

Call the CreateFund API, for example:

curl -X POST 'https://<your-domain>.lusid.com/api/api/funds/v2/FundV2'
  -H 'Content-Type: application/json-patch+json' 
  -H 'Authorization: Bearer <your-API-access-token>'
  -d '{
  "code": "FundCode",
  "displayName": "Fund Name",
  "description": "Standard Fund",
  "baseCurrency": "USD",
  "portfolioIds": [
    {
      "scope": "Scope1",
      "code": "Portfolio1",
      "portfolioEntityType": "SinglePortfolio"
    }
  ],
  "fundConfigurationId": {
    "scope": "FundConfigurationScope",
    "code": "FundConfigurationCode"
  },
  "shareClassInstrumentScopes": [
    "Scope1"
  ],
  "shareClassInstruments": [
    {
      "instrumentIdentifiers": {
        "Instrument/default/Figi": "GB0007980598"
      }
    },
    {
      "instrumentIdentifiers": {
        "Instrument/default/ClientInternal": "ShareClassA"
      }
    }
  ],
  "type": "Master",
  "inceptionDate": "2024-01-01T00:00:00.0000000+00:00",
  "decimalPlaces": 6,
  "primaryNavType": {
    "code": "PrimaryNav1",
    "displayName": "PrimaryNav1",
    "description": "This is the primary NAV type",
    "chartOfAccountsId": {
      "scope": "ChartOfAccountsScope",
      "code": "ChartOfAccountsCode"
    },
    "postingModuleCodes": [
      "PostingModule1"
    ],
    "cleardownModuleCodes": [
      "CleardownModule1"
    ],
    "valuationRecipeId": {
      "scope": "RecipeScope",
      "code": "RecipeCode"
    },
    "holdingRecipeId": {
      "scope": "RecipeScope",
      "code": "RecipeCode"
    },
    "accountingMethod": "FirstInFirstOut",
    "subHoldingKeys": [],
    "amortisationMethod": "EffectiveYield",
    "transactionTypeScope": "TransactionTypeScope",
    "cashGainLossCalculationDate": "Default"
  },
  "additionalNavTypes": [
    {
      "code": "taxNav",
      "displayName": "Tax Nav",
      "description": "Tax Nav description",
      "chartOfAccountsId": {
        "scope": "TaxChartOfAccountsScope",
        "code": "TaxChartOfAccountsCode"
      },
      "postingModuleCodes": [
        "TaxPostingModule1"
      ],
      "cleardownModuleCodes": [
        "TaxCleardownModule1"
      ],
      "valuationRecipeId": {
        "scope": "TaxRecipeScope",
        "code": "TaxRecipeCode2"
      },
      "holdingRecipeId": {
        "scope": "TaxRecipeScope",
        "code": "TaxRecipeCode3"
      },
      "accountingMethod": "FirstInFirstOut",
      "subHoldingKeys": [],
      "amortisationMethod": "EffectiveYield",
      "transactionTypeScope": "TransactionTypeScope",
      "cashGainLossCalculationDate": "Default"
    }
  ],
  "properties": {
    "Fund/MyScope/FundManagerName": {
      "key": "Fund/MyScope/FundManagerName",
      "value": {
        "labelValue": "Smith"
      },
      "effectiveFrom": "2024-01-01T00:00:00.0000000+00:00"
    }
  }
}'

Navigate to Fund Accounting > Funds and click Create fund:

Write a Luminesce SQL query using the Lusid.Fund.Writer provider and execute it using a tool such as the LUSID web app, for example:

Data fields and properties

This section supplements the API documentation and on-screen help text in the LUSID web app.

Fields

A fund is identified by a scope and a code that must be unique within that scope.

A fund must:

  • Have a type. You should set this to Standalone for now. Other options are under development.

  • Reference one or more transaction portfolios from an IBOR.

  • Have a baseCurrency that is an ISO 4217 currency code, for example GBP. Note all referenced transaction portfolios must have the same base currency.

  • Have an inceptionDate. Note this must be prior to the creation date of all referenced transaction portfolios.

  • Reference a pricing template.

  • Reference one or more share classes mastered as instruments. Note you can add or remove share class instruments independently using the SetShareClassInstruments API. There is no significance to the order in which these are added.

  • A shareClassInstrumentScopes (singular) if these share classes are mastered in an instrument scope other than the default scope.

  • A primaryNavType that contains all the settings necessary to strike a NAV and generate other financial reports for a particular audience. More information.

  • Optionally, any number of additionalNavTypes to strike NAVs for different audiences using the same underlying data.

Properties

You can optionally extend the data model of a fund by adding custom properties from the Fund domain, either when you create it or subsequently using the UpsertFundProperties API.

Subsequent updates

You can change most aspects of an existing fund using the PatchFund API.

Understanding NAV types

A fund must have at least one NAV type, containing all the settings required to strike a NAV and generate other financial reports for a particular audience. For example, you might create:

  • An offical NAV type to process subscriptions and redemptions to be run each weekday at EOD. This might be the primary NAV type.

  • A tax NAV type that uses a different tax lot methodology and market data to be run at end of year.

  • A regulatory reporting NAV type that uses a different chart of accounts to be run monthly or quarterly.

When used in combination with a valuation point, LUSID closes an accounting period for a NAV type and persists the underlying data so reports are always reproducible.

The following settings can be configured independently for each NAV type:

Setting

Information

Chart of accounts (CoA)

Identifies the chart of accounts (CoA) to use.

Posting modules

You must reference at least one posting module from this CoA. If you reference more than one, the order is significant; for each journal entry line, LUSID uses the first matching rule found.

Cleardown modules

If this CoA contains cleardown module(s), you must reference at least one. If you reference more than one, the order is significant; for each journal entry line, LUSID uses the first matching rule found.

Valuation recipe

This recipe must contain the following:

  • Market data rules able to locate market data loaded into LUSID suitable for valuing every holding in every underlying transaction portfolio on the effective date of the valuation point.

  • Pricing model rules suitable for the instruments held in every underlying transaction portfolio. If only instruments of type Equity are held, there is nothing to do here. However, for most other instruments we strongly recommend changing the default pricing model.

Holding recipe

If any underlying transaction portfolio contains an instrument for which LUSID requires market data in order to generate holdings (such as floating-rate or inflation-linked bonds), this recipe must contain market data rules able to locate that data.

Accounting method

You must specify a tax lot liquidation strategy.

Note there is an option to choose the AverageCost method, which effectively means ‘no strategy’.

Amortisation method

You must specify an amortisation strategy for all instruments of type Bond, ComplexBond and InflationLinkedBond held in underlying transaction portfolios.

Note there is an option to choose ‘no strategy’.

Cash gain/loss calculation date

You must specify a cost normalisation strategy that nominates either settlement date or transaction date.

Transaction type scope

You have the option to specify a custom scope containing transaction types defining the economic impact of transactions in underlying portfolios. If you omit this, LUSID expects to find all transaction types in use residing in the default scope.

Note: If you specify a custom scope you must recreate every transaction type and side in that scope. LUSID does not fall back from a custom to the default scope.

Sub-holding keys

For now, at a minimum, you should specify the Transaction/default/ShortClassShareCode system property as a sub-holding key (SHK) for each NAV type.

You can optionally specify as many other SHKs from underlying transaction portfolio(s) as you wish. These SHKs are then available for grouping purposes when you generate a fund holdings report.

If you do not specify any SHKs (either omit the field or set it to an empty array) then no SHKs are available; they are not inherited from underlying portfolios.