FactSet Optimization Engine API (Multi-period)

The Optimization Engine API (Multi-period) allows users to execute multi-period optimization, with client provided data, to solve dynamic asset allocation problems.

OpenAPI Specification

optimization-engine-api-multi-period-openapi-original.yml Raw ↑
swagger: '2.0'
info:
  title: Factset fpo_mp_input
  description: ''
  version: '1'
paths:
  /mpo/v1/optimizeFPO:
    post:
      consumes:
        - application/x-protobuf
      produces:
        - application/x-protobuf
      parameters:
        - in: body
          name: MultiPeriodInput
          description: Multiperiod protobuf input
          schema:
            $ref: '#/definitions/optimizer.inputs.MultiPeriodInput'
      responses:
        '200':
          description: Multiperiod protobuf output
          schema:
            $ref: '#/definitions/optimizer.outputs.MultiPeriodOutput'
      tags:
        - Mpo
definitions:
  VAR.DistributionType:
    type: number
    enum:
      - 0
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
    description: |-
      0 - eMonteCarlo 
      1 - eExtremeEventSimulation 
      2 - eHistorical 
      3 - eFactorStressTest 
      4 - eExtremeEventStressTest 
      5 - eStressTestPerSe 
      6 - eFactorExposure 
  VAR.StatusIndicator:
    type: number
    enum:
      - 0
      - 1
    description: |-
      0 - eSuccess 
      1 - eFailure 
  VAR.DistributionDescription:
    type: object
    properties:
      riskModel:
        type: string
      factorGroup:
        type: string
      factors:
        type: array
        items:
          type: string
      distributionType:
        $ref: '#/definitions/VAR.DistributionType'
      reportDate:
        type: integer
        format: int32
      reportCurrency:
        type: string
      horizonInTradingDays:
        type: number
        format: float
      returnDates:
        type: array
        items:
          type: integer
          format: int32
        description: Only possibly defined for historical distributions
    required: []
  VAR.SimulatedReturns:
    type: object
    properties:
      entity:
        type: string
      returns:
        type: array
        items:
          type: number
          format: float
    required: []
  VAR.DistributionStatus:
    type: object
    properties:
      indicator:
        $ref: '#/definitions/VAR.StatusIndicator'
      message:
        type: string
    required: []
  VAR.DistributionDataMessage:
    type: object
    properties:
      description:
        $ref: '#/definitions/VAR.DistributionDescription'
      securitySimulations:
        type: array
        items:
          $ref: '#/definitions/VAR.SimulatedReturns'
      status:
        $ref: '#/definitions/VAR.DistributionStatus'
    required: []
  optimizer.inputs.MultiPeriodInput:
    type: object
    properties:
      strategy:
        $ref: '#/definitions/optimizer.inputs.MultiPeriodStrategy'
      universe:
        $ref: '#/definitions/optimizer.inputs.TotalUniverse'
      portfolios:
        $ref: '#/definitions/optimizer.inputs.Portfolios'
      riskmodels:
        $ref: '#/definitions/optimizer.inputs.MultiPeriodRiskModels'
      lookup_tables:
        $ref: '#/definitions/optimizer.inputs.LookupTables'
      output_statistics:
        type: boolean
    required: []
  optimizer.inputs.MPFrontierInput:
    type: object
    properties:
      input:
        $ref: '#/definitions/optimizer.inputs.MultiPeriodInput'
      frontier:
        $ref: '#/definitions/optimizer.inputs.FrontierSettings'
    required: []
  optimizer.inputs.MultiPeriodStrategy:
    type: object
    properties:
      objective:
        $ref: '#/definitions/optimizer.inputs.MultiPeriodObjective'
      constraints:
        $ref: '#/definitions/optimizer.inputs.MultiPeriodConstraints'
      transaction_cost:
        $ref: '#/definitions/optimizer.inputs.TransactionCost'
      options:
        $ref: '#/definitions/optimizer.inputs.MultiPeriodOptions'
      expected_return:
        $ref: '#/definitions/optimizer.inputs.ExpectedReturn'
    required: []
  optimizer.inputs.MultiPeriodConstraints:
    type: object
    properties:
      expected_returns:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPExpectedReturnConstraint'
      diversification:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPDiversificationConstraint'
      factor_exposures:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPFactorExposureConstraint'
      general_linear:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPGeneralLinearConstraint'
      holding_threshold:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPHoldingsThresholdConstraint'
      leverage:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPLeverageConstraint'
      num_of_assets:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPNumberofAssetsConstraint'
      sensitivity:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPSensitivityConstraint'
      weight_constraint:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPHoldingsWeightConstraint'
      number_of_buys:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPNumberOfBuysConstraint'
      number_of_sells:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPNumberOfSellsConstraint'
      round_lots:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPRoundlotsConstraint'
      trade_threshold:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPTradeThresholdConstraint'
      trading_turnover:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPTurnoverConstraint'
      risk_contribution:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPRiskContributionConstraint'
      risk_volatility:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPRiskVolatilityConstraint'
      tail_risk:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPLimitTailRiskConstraint'
        description: MultiPeriod-Specific
      target_probability:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.MPTargetProbabilityConstraint'
    required: []
  optimizer.inputs.MPExpectedReturnConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.ExpectedReturnConstraint'
      constraint_on:
        $ref: '#/definitions/optimizer.inputs.BoundSource.Enum'
      annualization_factor:
        type: number
        format: double
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
      across_periods:
        $ref: '#/definitions/optimizer.inputs.AcrossPeriods'
    required: []
  optimizer.inputs.MPDiversificationConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.DiversificationConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
    required: []
  optimizer.inputs.MPFactorExposureConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.FactorExposureConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
      across_periods:
        $ref: '#/definitions/optimizer.inputs.AcrossPeriods'
    required: []
  optimizer.inputs.MPGeneralLinearConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.GeneralLinearConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
      across_periods:
        $ref: '#/definitions/optimizer.inputs.AcrossPeriods'
    required: []
  optimizer.inputs.MPHoldingsThresholdConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.HoldingsThresholdConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
    required: []
  optimizer.inputs.MPLeverageConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.LeverageConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
    required: []
  optimizer.inputs.MPNumberofAssetsConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.NumberofAssetsConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
    required: []
  optimizer.inputs.MPSensitivityConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.SensitivityConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
      across_periods:
        $ref: '#/definitions/optimizer.inputs.AcrossPeriods'
    required: []
  optimizer.inputs.MPHoldingsWeightConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.HoldingsWeightConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
    required: []
  optimizer.inputs.MPNumberOfBuysConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.NumberOfBuysConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
    required: []
  optimizer.inputs.MPNumberOfSellsConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.NumberOfSellsConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
    required: []
  optimizer.inputs.MPRoundlotsConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.RoundlotsConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
    required: []
  optimizer.inputs.MPTradeThresholdConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.TradeThresholdConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
    required: []
  optimizer.inputs.MPTransactionCostConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.TransactionCostConstraint'
        description: not supported in engine yet.
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
      across_periods:
        $ref: '#/definitions/optimizer.inputs.AcrossPeriods'
    required: []
  optimizer.inputs.MPTurnoverConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.TurnoverConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
      across_periods:
        $ref: '#/definitions/optimizer.inputs.AcrossPeriods'
    required: []
  optimizer.inputs.MPRiskContributionConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.RiskContributionConstraint'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
    required: []
  optimizer.inputs.MPRiskVolatilityConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.RiskVolatilityConstraint'
      constraint_on:
        $ref: '#/definitions/optimizer.inputs.BoundSource.Enum'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
      across_periods:
        $ref: '#/definitions/optimizer.inputs.AcrossPeriods'
    required: []
  optimizer.inputs.MPLimitTailRiskConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.LimitTailRiskConstraint'
      constraint_on:
        $ref: '#/definitions/optimizer.inputs.BoundSource.Enum'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
      across_periods:
        $ref: '#/definitions/optimizer.inputs.AcrossPeriods'
    required: []
  optimizer.inputs.LimitTailRiskConstraint:
    type: object
    properties:
      name:
        type: string
      risk_measure:
        $ref: '#/definitions/optimizer.inputs.TailRiskMeasure.Enum'
      max_risk:
        $ref: '#/definitions/optimizer.inputs.Value'
      confidence_level:
        $ref: '#/definitions/optimizer.inputs.Value'
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      active_risk:
        type: boolean
      benchmark_index:
        type: integer
        format: int32
      hierarchy:
        type: integer
        format: int32
    required: []
  optimizer.inputs.MPTargetProbabilityConstraint:
    type: object
    properties:
      constraint:
        $ref: '#/definitions/optimizer.inputs.TargetProbabilityConstraint'
      constraint_on:
        $ref: '#/definitions/optimizer.inputs.BoundSource.Enum'
      on_periods:
        $ref: '#/definitions/optimizer.inputs.OnPeriods'
      across_periods:
        $ref: '#/definitions/optimizer.inputs.AcrossPeriods'
    required: []
  optimizer.inputs.TargetProbabilityConstraint:
    type: object
    properties:
      name:
        type: string
      threshold_min:
        $ref: '#/definitions/optimizer.inputs.Value'
      threshold_max:
        $ref: '#/definitions/optimizer.inputs.Value'
      min_probability:
        $ref: '#/definitions/optimizer.inputs.Value'
      max_probability:
        $ref: '#/definitions/optimizer.inputs.Value'
      hierarchy:
        type: integer
        format: int32
    required: []
  optimizer.inputs.EFPOConstraintWeightType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EFPOConstraintAssetType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EConstraintReturnType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EConstraintRiskRelativeInterpretationType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EConstraintGroupType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EConstraintTurnoverType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EConstraintValueType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.ELeverageValueType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EConstraintLevel:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EConstraintPenaltyType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EConstraintRiskType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EConstraintUnitType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.EWeightingMethodType:
    type: object
    properties: {}
    required: []
    description: 'ToDo :: follow-up for what unit type the optimizer expects,'
  optimizer.inputs.ConstraintGroup:
    type: object
    properties:
      min:
        $ref: '#/definitions/optimizer.inputs.Value'
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      id:
        type: string
      nested_groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      group_lookup_index:
        type: integer
        format: int32
    required: []
  optimizer.inputs.FactorExposureAttributes:
    type: object
    properties:
      min:
        $ref: '#/definitions/optimizer.inputs.Value'
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
    required: []
  optimizer.inputs.Penalty:
    type: object
    properties:
      enabled:
        type: boolean
      penalty_type:
        $ref: '#/definitions/optimizer.inputs.EConstraintPenaltyType.Enum'
      penalty_value:
        $ref: '#/definitions/optimizer.inputs.Value'
      max_violation:
        $ref: '#/definitions/optimizer.inputs.Value'
    required: []
  optimizer.inputs.Constraints:
    type: object
    properties:
      expected_returns:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ExpectedReturnConstraint'
      diversification:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.DiversificationConstraint'
      factor_exposures:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.FactorExposureConstraint'
      general_linear:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.GeneralLinearConstraint'
      holding_threshold:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.HoldingsThresholdConstraint'
      leverage:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.LeverageConstraint'
      num_of_assets:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.NumberofAssetsConstraint'
      sensitivity:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.SensitivityConstraint'
      weight_constraint:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.HoldingsWeightConstraint'
      number_of_buys:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.NumberOfBuysConstraint'
      number_of_sells:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.NumberOfSellsConstraint'
      round_lots:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.RoundlotsConstraint'
      trade_threshold:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.TradeThresholdConstraint'
      transaction_cost:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.TransactionCostConstraint'
      trading_turnover:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.TurnoverConstraint'
      risk_etl:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.LimitRiskETLConstraint'
      risk_contribution:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.RiskContributionConstraint'
      risk_volatility:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.RiskVolatilityConstraint'
      limit_trade_constraint:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.TradingLimitTradeConstraint'
    required: []
  optimizer.inputs.ExpectedReturnConstraint:
    type: object
    properties:
      name:
        type: string
      min:
        $ref: '#/definitions/optimizer.inputs.Value'
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      return_value:
        $ref: '#/definitions/optimizer.inputs.Value'
      use_strategy_return_value:
        type: boolean
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      return_type:
        $ref: '#/definitions/optimizer.inputs.EConstraintReturnType.Enum'
      rel_to_benchmark:
        type: boolean
      benchmark_index:
        type: integer
        format: int32
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '1'
  optimizer.inputs.DiversificationConstraint:
    type: object
    properties:
      name:
        type: string
      asset_value:
        $ref: '#/definitions/optimizer.inputs.Value'
      max_percent:
        $ref: '#/definitions/optimizer.inputs.Value'
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      unit:
        $ref: '#/definitions/optimizer.inputs.EConstraintUnitType.Enum'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '2'
  optimizer.inputs.FactorExposureConstraint:
    type: object
    properties:
      name:
        type: string
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      rel_to_benchmark:
        type: boolean
      benchmark_index:
        type: integer
        format: int32
      factors:
        $ref: '#/definitions/optimizer.inputs.FactorExposureAttributes'
        description: id --> min/max
      hierarchy:
        type: integer
        format: int32
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
    required: []
    description: '3'
  optimizer.inputs.GeneralLinearConstraint:
    type: object
    properties:
      name:
        type: string
      security_attribute:
        $ref: '#/definitions/optimizer.inputs.Value'
      min:
        $ref: '#/definitions/optimizer.inputs.Value'
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      weighting_method:
        $ref: '#/definitions/optimizer.inputs.EWeightingMethodType.Enum'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      hierarchy:
        type: integer
        format: int32
      rel_to_benchmark:
        type: boolean
      benchmark_index:
        type: integer
        format: int32
    required: []
    description: '4'
  optimizer.inputs.HoldingsThresholdConstraint:
    type: object
    properties:
      name:
        type: string
      custom_asset:
        $ref: '#/definitions/optimizer.inputs.Value'
      min:
        $ref: '#/definitions/optimizer.inputs.Value'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      asset_type:
        $ref: '#/definitions/optimizer.inputs.EFPOConstraintAssetType.Enum'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
        description: Scope can be asset
      unit:
        $ref: '#/definitions/optimizer.inputs.EConstraintUnitType.Enum'
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '5'
  optimizer.inputs.LeverageConstraint:
    type: object
    properties:
      name:
        type: string
      value:
        $ref: '#/definitions/optimizer.inputs.Value'
      value_type:
        $ref: '#/definitions/optimizer.inputs.ELeverageValueType.Enum'
      hierarchy:
        type: integer
        format: int32
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
    required: []
    description: '6'
  optimizer.inputs.NumberofAssetsConstraint:
    type: object
    properties:
      name:
        type: string
      min:
        $ref: '#/definitions/optimizer.inputs.Value'
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '7'
  optimizer.inputs.SensitivityConstraint:
    type: object
    properties:
      name:
        type: string
      min:
        $ref: '#/definitions/optimizer.inputs.Value'
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      sensitivity_attribute:
        $ref: '#/definitions/optimizer.inputs.Value'
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      rel_to_benchmark:
        type: boolean
      benchmark_index:
        type: integer
        format: int32
      hierarchy:
        type: integer
        format: int32
      unit:
        $ref: '#/definitions/optimizer.inputs.EConstraintUnitType.Enum'
    required: []
    description: '8'
  optimizer.inputs.HoldingsWeightConstraint:
    type: object
    properties:
      name:
        type: string
      custom_asset:
        $ref: '#/definitions/optimizer.inputs.Value'
      min:
        $ref: '#/definitions/optimizer.inputs.Value'
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      unit:
        $ref: '#/definitions/optimizer.inputs.EConstraintUnitType.Enum'
      weight_type:
        $ref: '#/definitions/optimizer.inputs.EFPOConstraintWeightType.Enum'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      asset_type:
        $ref: '#/definitions/optimizer.inputs.EFPOConstraintAssetType.Enum'
      rel_to_benchmark:
        type: boolean
      benchmark_index:
        type: integer
        format: int32
      hierarchy:
        type: integer
        format: int32
      apply_only_to_direct:
        type: boolean
    required: []
    description: '9'
  optimizer.inputs.NumberOfBuysConstraint:
    type: object
    properties:
      name:
        type: string
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '10'
  optimizer.inputs.NumberOfSellsConstraint:
    type: object
    properties:
      name:
        type: string
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '11'
  optimizer.inputs.RoundlotsConstraint:
    type: object
    properties:
      name:
        type: string
      asset_level:
        $ref: '#/definitions/optimizer.inputs.Value'
        description: No Negative Value
      custom_asset:
        $ref: '#/definitions/optimizer.inputs.Value'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      asset_type:
        $ref: '#/definitions/optimizer.inputs.EFPOConstraintAssetType.Enum'
      general_value:
        type: number
        format: double
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '12'
  optimizer.inputs.TradeThresholdConstraint:
    type: object
    properties:
      name:
        type: string
      min:
        $ref: '#/definitions/optimizer.inputs.Value'
      custom_asset:
        $ref: '#/definitions/optimizer.inputs.Value'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      unit:
        $ref: '#/definitions/optimizer.inputs.EConstraintUnitType.Enum'
      asset_type:
        $ref: '#/definitions/optimizer.inputs.EFPOConstraintAssetType.Enum'
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '13'
  optimizer.inputs.TransactionCostConstraint:
    type: object
    properties:
      name:
        type: string
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      custom_asset:
        $ref: '#/definitions/optimizer.inputs.Value'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      unit:
        $ref: '#/definitions/optimizer.inputs.EConstraintUnitType.Enum'
      asset_type:
        $ref: '#/definitions/optimizer.inputs.EFPOConstraintAssetType.Enum'
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '14'
  optimizer.inputs.TurnoverConstraint:
    type: object
    properties:
      name:
        type: string
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      custom_asset:
        $ref: '#/definitions/optimizer.inputs.Value'
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      value_type:
        $ref: '#/definitions/optimizer.inputs.EConstraintValueType.Enum'
      asset_type:
        $ref: '#/definitions/optimizer.inputs.EFPOConstraintAssetType.Enum'
      turnover_type:
        $ref: '#/definitions/optimizer.inputs.EConstraintTurnoverType.Enum'
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '15'
  optimizer.inputs.TradingLimitTradeConstraint:
    type: object
    properties:
      name:
        type: string
      custom_asset:
        $ref: '#/definitions/optimizer.inputs.Value'
      min:
        $ref: '#/definitions/optimizer.inputs.Value'
      max:
        $ref: '#/definitions/optimizer.inputs.Value'
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      unit:
        $ref: '#/definitions/optimizer.inputs.EConstraintUnitType.Enum'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      asset_type:
        $ref: '#/definitions/optimizer.inputs.EFPOConstraintAssetType.Enum'
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '19'
  optimizer.inputs.LimitRiskETLConstraint:
    type: object
    properties:
      name:
        type: string
      max_etl:
        $ref: '#/definitions/optimizer.inputs.Value'
      confidence_level:
        $ref: '#/definitions/optimizer.inputs.Value'
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      active_etl:
        type: boolean
      benchmark_index:
        type: integer
        format: int32
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '16'
  optimizer.inputs.RiskContributionConstraint:
    type: object
    properties:
      name:
        type: string
      max_percent:
        $ref: '#/definitions/optimizer.inputs.Value'
      custom_asset:
        $ref: '#/definitions/optimizer.inputs.Value'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      asset_type:
        $ref: '#/definitions/optimizer.inputs.EFPOConstraintAssetType.Enum'
      risk_type:
        $ref: '#/definitions/optimizer.inputs.EConstraintRiskType.Enum'
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '17'
  optimizer.inputs.RiskVolatilityConstraint:
    type: object
    properties:
      name:
        type: string
      max_value_of_risk:
        $ref: '#/definitions/optimizer.inputs.Value'
      level:
        $ref: '#/definitions/optimizer.inputs.EConstraintLevel.Enum'
      penalty:
        $ref: '#/definitions/optimizer.inputs.Penalty'
      groups:
        type: array
        items:
          $ref: '#/definitions/optimizer.inputs.ConstraintGroup'
      risk_type:
        $ref: '#/definitions/optimizer.inputs.EConstraintRiskType.Enum'
      active_risk:
        type: boolean
      benchmark_index:
        type: integer
        format: int32
      hierarchy:
        type: integer
        format: int32
    required: []
    description: '18'
  optimizer.inputs.EValueType:
    type: object
    properties: {}
    required: []
  optimizer.inputs.Value:
    type: object
    properties:
      value_type:
        $ref: '#/definitions/optimizer

# --- truncated at 32 KB (62 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/factset/refs/heads/main/openapi/optimization-engine-api-multi-period-openapi-original.yml