@lap v0.3
# Machine-readable API spec. Each @endpoint block is one API call.
@api Portfolio Optimizer
@base https://api.portfoliooptimizer.io/v1
@version 1.0.10
@auth ApiKey X-API-Key in header
@endpoints 229
@hint download_for_search
@toc markets(6), factors(4), assets(114), portfolios(104), portfolio(1)

@group markets
@endpoint GET /markets/indicators/aiae/us
@returns(200) {aiaeIndicator: map{aiaeRegion: str, aiaeComputationDate: str, aiaeReferenceDate: str, aiaeForecasts: [map]}}
@errors {401}

@endpoint GET /markets/indicators/naaim-exposure-index
@returns(200) {naaimExposureIndexIndicator: map{naaimExposureIndexComputationDate: str, naaimExposureIndexValues: [map]}}
@errors {401}

@endpoint GET /markets/capital-assumptions/usd
@returns(200) {capitalMarketAssumptions: map{cmaCurrency: str, cmaComputationDate: str, cmaHorizon: str, cmaInstitutions: [str], cmaReferenceDates: map{earliestReferenceDate: str, latestReferenceDate: str}, cmaAssets: [map], cmaAssetsCorrelationMatrixLabels: [str], cmaAssetsCorrelationMatrix: [[num]], cmaAssetsCorrelationMatrixLowerBounds: [[num]], cmaAssetsCorrelationMatrixUpperBounds: [[num]]}}

@endpoint GET /markets/capital-assumptions/eur
@returns(200) {capitalMarketAssumptions: map{cmaCurrency: str, cmaComputationDate: str, cmaHorizon: str, cmaInstitutions: [str], cmaReferenceDates: map{earliestReferenceDate: str, latestReferenceDate: str}, cmaAssets: [map], cmaAssetsCorrelationMatrixLabels: [str], cmaAssetsCorrelationMatrix: [[num]], cmaAssetsCorrelationMatrixLowerBounds: [[num]], cmaAssetsCorrelationMatrixUpperBounds: [[num]]}}

@endpoint GET /markets/capital-assumptions/chf
@returns(200) {capitalMarketAssumptions: map{cmaCurrency: str, cmaComputationDate: str, cmaHorizon: str, cmaInstitutions: [str], cmaReferenceDates: map{earliestReferenceDate: str, latestReferenceDate: str}, cmaAssets: [map], cmaAssetsCorrelationMatrixLabels: [str], cmaAssetsCorrelationMatrix: [[num]], cmaAssetsCorrelationMatrixLowerBounds: [[num]], cmaAssetsCorrelationMatrixUpperBounds: [[num]]}}

@endpoint GET /markets/indicators/bsrmb/us
@returns(200) {bsrmbIndicator: map{bsrmbRegion: str, bsrmbComputationDate: str, bsrmbReferenceDate: str, bsrmbForecasts: [map]}}
@errors {401}

@endgroup

@group factors
@endpoint GET /factors/models/fama-french/us
@returns(200) {famaFrenchFactors: map{factorsRegion: str, factorsComputationDate: str, factors: [map]}}
@errors {401}

@endpoint GET /factors/models/fama-french/developed-markets
@returns(200) {famaFrenchFactors: map{factorsRegion: str, factorsComputationDate: str, factors: [map]}}
@errors {401}

@endpoint GET /factors/models/fama-french/emerging-markets
@returns(200) {famaFrenchFactors: map{factorsRegion: str, factorsComputationDate: str, factors: [map]}}
@errors {401}

@endpoint POST /factors/residualization
@required {factors: [map{factorReturns!: [num], factorResidualization: bool}]}
@returns(200) {factors: [map]}

@endgroup

@group assets
@endpoint POST /assets/clustering/hierarchical/correlation-based
@required {assets: int, assetsCorrelationMatrix: [[num]]}
@optional {clusteringMethod: str(singleLinkage/averageLinkage/completeLinkage/wardLinkage)=wardLinkage, clusters: int, clusteringSimulations: int=500}
@returns(200) {assetsGroups: [[int]]}

@endpoint POST /assets/clustering/thresholding/correlation-based
@required {assets: int, assetsCorrelationMatrix: [[num]]}
@optional {assetsCorrelationThreshold: num=0.5}
@returns(200) {assetsGroups: [[int]]}

@endpoint POST /assets/clustering/spectral/correlation-based
@required {assets: int, assetsCorrelationMatrix: [[num]]}
@optional {clusteringMethod: str(blockbuster/sponge/spongeSymmetric)=spongeSymmetric, clusters: int, clusteringSimulations: int=500, positiveDegreeMatrixRegularizationParameter: num=1, negativeDegreeMatrixRegularizationParameter: num=1}
@returns(200) {assetsGroups: [[int]]}

@endpoint POST /assets/prices/adjusted
@required {assets: [map{assetPrices!: [map], assetDividends: [map], assetSplits: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/prices/adjusted/forward
@required {assets: [map{assetPrices!: [map], assetDividends: [map], assetSplits: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns
@required {assets: [map{assetPrices!: [num]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/logarithmic
@required {assets: [map{assetPrices!: [num]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/mean
@required {assets: [map{assetReturns!: [num]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/backfilled
@required {assets: [map{assetReturns!: [num]}]}
@optional {assetsReturnsBackfillingMethod: str(betaAdjusting/conditionalSampling/residualsRecycling)=residualsRecycling}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/transformation/turbulence-partitioned
@returns(200) {partitions: [map]}

@endpoint POST /assets/returns/transformation/exponentially-weighted
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/simulation/bootstrap/empirical
@required {assets: [map{assetReturns!: [num]}]}
@optional {simulations: int=1, simulationsLength: int}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/simulation/bootstrap/online
@required {assets: [map{assetReturns!: [num]}]}
@optional {bootstrapPersistenceParameter: num, simulations: int=1, simulationsLength: int}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/simulation/bootstrap/circular
@required {assets: [map{assetReturns!: [num]}]}
@optional {bootstrapBlockLength: int, simulations: int=1, simulationsLength: int}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/simulation/bootstrap/stationary
@required {assets: [map{assetReturns!: [num]}]}
@optional {bootstrapAverageBlockLength: num, simulations: int=1, simulationsLength: int}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/simulation/monte-carlo/arma-garch
@required {assets: [any]}
@optional {simulations: int=1, simulationsLength: int=1}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/simulation/monte-carlo/arma-ewma
@required {assets: [any]}
@optional {simulations: int=1, simulationsLength: int=1}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/simulation/monte-carlo/gaussian
@required {assets: [any]}
@optional {simulations: int=1, simulationsLength: int=1}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/simulation/monte-carlo/student
@required {assets: [any]}
@optional {simulations: int=1, simulationsLength: int=1}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/fitting/generalized-pareto
@required {assets: [map{assetReturns!: [num], assetReturnsTailLocation: str, assetReturnsTailType: str, assetReturnsTailFittingMethod: str, assetReturnsTailParametersBiasReduction: bool, assetReturnsTailThresholdEstimationMethod: str, assetReturnsTailThreshold: num, assetReturnsTailObservations: int, assetReturnsTailPercentObservations: num}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/simulation/monte-carlo/generalized-pareto
@required {assets: [any]}
@optional {simulations: int=1, simulationsLength: int=1}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/fitting/arma-garch
@required {assets: [map{assetReturns!: [num], assetReturnsConditionalMeanModel: str, assetReturnsStandardizedResidualsDistribution: str}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/fitting/arma-ewma
@required {assets: [map{assetReturns!: [num], assetReturnsConditionalMeanModel: str, assetReturnsStandardizedResidualsDistribution: str}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/fitting/gaussian
@required {assets: [map{assetReturns!: [num]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/fitting/student
@required {assets: [map{assetReturns!: [num]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/simulation/monte-carlo/gaussian/mixture
@required {assets: [any]}
@optional {simulations: int=1, simulationsLength: int=1}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/fitting/gaussian/mixture
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/fitting/gaussian/mixture/multivariate
@returns(200) {assets: int, assetsReturnsMixtureComponents: [map]}

@endpoint POST /assets/returns/simulation/monte-carlo/gaussian/multivariate
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/fitting/gaussian/multivariate
@required {assets: [map{assetReturns!: [num]}]}
@returns(200) {assets: int, assetsMeans: [num], assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/returns/simulation/monte-carlo/gaussian/mixture/multivariate
@required {assets: int, assetsReturnsMixtureComponents: [map{assetsReturnsMixtureComponentWeight!: num, assetsReturnsMixtureComponentMeans!: [num], assetsReturnsMixtureComponentCovarianceMatrix!: [[num]]}]}
@optional {simulations: int=1, simulationsLength: int=1}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/simulation/monte-carlo/cornish-fisher
@required {assets: [any]}
@optional {simulations: int=1, simulationsLength: int=1}
@returns(200) {simulations: [map]}

@endpoint POST /assets/returns/fitting/cornish-fisher
@required {assets: [map{assetReturns!: [num]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/simulation/monte-carlo/cornish-fisher/corrected
@required {assets: [any]}
@optional {simulations: int=1, simulationsLength: int=1}
@returns(200) {simulations: [map]}
@errors {500}

@endpoint POST /assets/covariance/matrix
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/estimation/empirical
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/estimation/distance
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/estimation/empirical/shrunk
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/estimation/empirical/shrunk/clustering-based
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/estimation/gerber
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/estimation/empirical/exponentially-weighted
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/forecast/ewma
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/forecast/ewma/iterated
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/forecast/ewma/iterated
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/forecast/sma
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/forecast/average-oracle
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/forecast/ewma
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/forecast/sma
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/forecast/average-oracle
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/validation
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@returns(200) {message: str}

@endpoint POST /assets/returns/standard-deviation
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/estimation/close-to-close
@required {assets: [map{assetPrices!: [map], assetReturnsDemeaning: bool}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/estimation/garman-klass
@required {assets: [map{assetPrices!: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/estimation/garman-klass/jump-adjusted
@required {assets: [map{assetPrices!: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/estimation/garman-klass/original
@required {assets: [map{assetPrices!: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/estimation/garman-klass/original/jump-adjusted
@required {assets: [map{assetPrices!: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/estimation/parkinson
@required {assets: [map{assetPrices!: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/estimation/parkinson/jump-adjusted
@required {assets: [map{assetPrices!: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/estimation/rogers-satchell
@required {assets: [map{assetPrices!: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/estimation/rogers-satchell/jump-adjusted
@required {assets: [map{assetPrices!: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/estimation/yang-zhang
@required {assets: [map{assetPrices!: [map]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/forecast/sma
@required {assets: [map{assetPrices: [map], assetVarianceProxies: [any], varianceProxy: str, varianceProxyWindowSize!: int, volatilityForecastHorizon: int}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/forecast/ewma
@required {assets: [map{assetPrices: [map], assetVarianceProxies: [any], varianceProxy: str, varianceProxyDecayFactor: any, oneOf: any, volatilityForecastHorizon: int}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/forecast/garch
@required {assets: [map{assetPrices: [map], assetVarianceProxies: [any], varianceProxy: str, volatilityForecastHorizon: int}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/forecast/har
@returns(200) {assets: [map]}

@endpoint POST /assets/volatility/forecast/hexp
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/variance
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/skewness
@required {assets: [map{assetReturns!: [num]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/kurtosis
@required {assets: [map{assetReturns!: [num]}]}
@returns(200) {assets: [map]}

@endpoint POST /assets/indicators/effective-rank
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@returns(200) {assetsEffectiveRank: num}

@endpoint POST /assets/indicators/turbulence-index
@required {assets: int, assetsCovarianceMatrix: [[num]], assetsMeanReturns: [num], assetsReturns: [num]}
@returns(200) {assetsTurbulenceIndex: num}

@endpoint POST /assets/indicators/absorption-ratio
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@optional {assetsCovarianceMatrixEigenvectors: map{eigenvectorsRetained: int}}
@returns(200) {assetsAbsorptionRatio: num}

@endpoint POST /assets/indicators/momentum/sign
@returns(200) {assets: [map]}

@endpoint POST /assets/indicators/momentum
@returns(200) {assets: [map]}

@endpoint POST /assets/indicators/momentum/rank
@returns(200) {assetsRankMomentum: [num]}

@endpoint POST /assets/indicators/information-discreteness
@returns(200) {assets: [map]}

@endpoint POST /assets/indicators/trend-clarity
@returns(200) {assets: [map]}

@endpoint POST /assets/indicators/market-rank
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@optional {assetsCovarianceMatrixEigenvectors: map{eigenvectorsRetained: int}}
@returns(200) {assetsMarketRank: num}

@endpoint POST /assets/indicators/entropic-connectedness
@required {assets: int, assetsCorrelationMatrix: [[num]]}
@optional {assetsEntropicConnectednessOrder: num=2}
@returns(200) {assetsEntropicConnectedness: num}

@endpoint POST /assets/correlation/matrix
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/spearman
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/kendall
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/popov
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/gerber
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/chatterjee
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/lancaster
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/fechner
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/distance
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/empirical
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/empirical/shrunk
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/empirical/shrunk/clustering-based
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/empirical/exponentially-weighted
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/validation
@required {assets: int, assetsCorrelationMatrix: [[num]]}
@returns(200) {message: str}

@endpoint POST /assets/correlation/matrix/theory-implied
@required {assets: [map{assetHierarchicalClassification!: [any]}], assetsCorrelationMatrix: [[num]]}
@optional {clusteringMethod: str(singleLinkage/averageLinkage/completeLinkage/wardLinkage)=averageLinkage}
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/random
@required {assets: int}
@optional {simulations: int=1}
@returns(200) {simulations: [map]}

@endpoint POST /assets/correlation/matrix/perturbed
@required {assets: int}
@optional {assetsCorrelationMatrix: [[num]], noiseLevel: num, maximumNoiseLevel: num, simulations: int=1}
@returns(200) {simulations: [map]}

@endpoint POST /assets/correlation/matrix/nearest
@required {assets: int, assetsApproximateCorrelationMatrix: [[num]]}
@optional {assetsFixedCorrelations: [[int]]}
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/completed
@required {assets: int, assetsIncompleteCorrelationMatrix: [[num]]}
@optional {assetsCorrelationMatrixCompletionMethod: str(maximumDeterminantCompletion/heuristicCompletion)}
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/shrunk
@required {assets: int, assetsCovarianceMatrix: [[num]], targetCovarianceMatrix: [[num]], shrinkageFactor: num}
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/aggregated
@required {assets: int, assetsGlobalCorrelationMatrix: [[num]], assetsLocalCorrelationMatrices: [map{assetsLocalCorrelationMatrix!: [[num]]}]}
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/aggregated
@required {assets: int, assetsGlobalCovarianceMatrix: [[num]], assetsLocalCovarianceMatrices: [map{assetsLocalCovarianceMatrix!: [[num]]}]}
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/shrunk
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/shrunk/clustering-based
@required {assets: int, assetsCorrelationMatrix: [[num]], targetCorrelationMatrix: str, shrinkageFactor: num, assetsGroups: [[int]]}
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/estimation/empirical/filtered/random-matrix-theory-based
@returns(200) {assetsCorrelationMatrix: [[num]]}

@endpoint POST /assets/covariance/matrix/estimation/empirical/filtered/random-matrix-theory-based
@returns(200) {assetsCovarianceMatrix: [[num]]}

@endpoint POST /assets/correlation/matrix/distance
@required {assets: int, assetsCorrelationMatrix: [[num]], referenceCorrelationMatrix: [[num]]}
@optional {distanceMetric: str(euclidean/correlationMatrix/bures)=euclidean}
@returns(200) {assetsCorrelationMatrixDistance: num}

@endpoint POST /assets/correlation/matrix/informativeness
@required {assets: int, assetsCorrelationMatrix: [[num]]}
@optional {distanceMetric: str(euclidean/correlationMatrix/bures)=euclidean}
@returns(200) {assetsCorrelationMatrixInformativeness: num}

@endpoint POST /assets/correlation/matrix/average-correlation
@required {assets: int, assetsCorrelationMatrix: [[num]]}
@returns(200) {assetsCorrelationMatrixAverageCorrelation: num}

@endpoint POST /assets/correlation/matrix/bounds
@required {assets: int, assetsCorrelationMatrix: [[num]], assetsGroup: [int]}
@returns(200) {assetsCorrelationMatrixLowerBounds: [[num]], assetsCorrelationMatrixUpperBounds: [[num]]}

@endgroup

@group portfolios
@endpoint POST /portfolios/simulation/random
@required {assets: int}
@optional {simulations: int=1, constraints: map{minimumAssets: int, maximumAssets: int, minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {simulations: [map]}

@endpoint POST /portfolios/simulation/evolution
@required {assets: [map{assetPrices!: [num]}], portfolios: [map{assetsWeights!: [num], portfolioRebalancingMethod: str, portfolioRebalancingThreshold: num, portfolioRebalancingThresholdType: str}]}
@returns(200) {simulations: [map]}

@endpoint POST /portfolios/simulation/evolution/random
@required {assets: [map{assetPrices!: [num]}]}
@optional {simulations: int=1, portfolioRebalancingMethod: str(noRebalancing/continuousRebalancing/randomRebalancing)=noRebalancing, constraints: map{minimumAssets: int, maximumAssets: int, minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {simulations: [map]}

@endgroup

@group portfolio
@endpoint POST /portfolio/construction/investable
@required {assets: int, portfolioValue: num, assetsPrices: [num]}
@optional {assetsWeights: [num], assetsGroups: [[int]], assetsGroupsWeights: [num], maximumAssetsGroupsWeights: [num], assetsSizeLots: [num], assetsMinimumPositions: [num], assetsMinimumNotionalValues: [num]}
@returns(200) {assetsPositions: [num], assetsWeights: [num]}

@endgroup

@group portfolios
@endpoint POST /portfolios/post-optimization/rounding
@required {portfolios: [map{assets!: int, assetsWeights!: [num], constraints: map}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/replication/index-tracking
@required {assets: [map{assetReturns!: [num]}], benchmarkReturns: [num]}
@optional {constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/replication/index-tracking/sparse
@required {assets: [map{assetReturns!: [num]}], benchmarkReturns: [num]}
@optional {constraints: map{maximumAssets: int, minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/analysis/factors/exposures
@returns(200)

@endpoint POST /portfolios/analysis/effective-number-of-bets
@required {assets: int, assetsCovarianceMatrix: [[num]], portfolios: [map{assetsWeights!: [num]}]}
@optional {factorsComputationMethod: str(principalComponentAnalysis/exactMinimumLinearTorsion/approximateMinimumLinearTorsion)=exactMinimumLinearTorsion}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/effective-number-of-assets
@required {portfolios: [map{assets!: int, assetsWeights!: [num]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/alpha
@required {benchmarkReturns: [num], portfolios: [map{portfolioReturns: [num], portfolioValues: [num]}]}
@optional {riskFreeReturn: num=0, riskFreeReturns: [num]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/beta
@required {benchmarkReturns: [num], portfolios: [map{portfolioReturns: [num], portfolioValues: [num]}]}
@optional {riskFreeReturn: num=0, riskFreeReturns: [num]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/tracking-error-variance
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/empirical-tracking-error
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/drawdowns
@required {portfolios: [map{portfolioReturns: [num], portfolioValues: [num]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/drawdowns/worst
@required {portfolios: [map{portfolioReturns: [num], portfolioValues: [num], portfolioWorstDrawdowns: int}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/mean-variance/efficient-frontier
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]]}
@optional {portfolios: int=25, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/mean-variance/efficient-frontier/resampling-based
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]]}
@optional {simulatedEfficientFrontiers: int=128, simulatedEfficientFrontiersAggregationMethod: str(average/median)=average, simulatedEfficientFrontiersDiscretizationMethod: str(rankAssociation/lambdaAssociation)=lambdaAssociation, assetsReturnsUncertaintyIntervals: [[num]], assetsStandardDeviationsUncertaintyIntervals: [[num]], assetsCorrelationMatrixUncertaintyLevel: num, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/mean-variance/minimum-variance-frontier
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]]}
@optional {portfolios: int=25, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/returns/semivariance
@required {portfolios: [map{portfolioReturns: [num], portfolioValues!: [num]}]}
@optional {minimalAcceptableReturn: num, minimalAcceptableReturns: [num]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/returns/semideviation
@required {portfolios: [map{portfolioReturns: [num], portfolioValues!: [num]}]}
@optional {minimalAcceptableReturn: num, minimalAcceptableReturns: [num]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/returns/lower-partial-moment
@required {lowerPartialMomentOrder: num, portfolios: [map{portfolioReturns: [num], portfolioValues!: [num]}]}
@optional {minimalAcceptableReturn: num, minimalAcceptableReturns: [num]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/drawdowns/ulcer-index
@required {portfolios: [map{portfolioReturns: [num], portfolioValues: [num]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/drawdowns/pitfall-indicator
@required {portfolios: [map{portfolioReturns: [num], portfolioValues: [num]}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/drawdowns/conditional/empirical
@required {portfolios: [map{portfolioReturns: [num], portfolioValues: [num]}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/drawdowns/maximum
@required {portfolios: [map{portfolioReturns: [num], portfolioValues: [num]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/drawdowns/average
@required {portfolios: [map{portfolioReturns: [num], portfolioValues: [num]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/drawdowns/pain-index
@required {portfolios: [map{portfolioReturns: [num], portfolioValues!: [num]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/drawdowns/ulcer-performance-index
@required {portfolios: [map{portfolioReturns: [num], portfolioValues: [num]}]}
@optional {riskFreeReturn: num=0, benchmarkReturns: [num]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/returns
@required {portfolios: [map{portfolioValues!: [num]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/returns/logarithmic
@required {portfolios: [map{portfolioValues!: [num]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/returns/mean
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/return
@required {portfolios: [map{portfolioValues!: [any]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/return/time-weighted
@required {portfolios: [map{portfolioValues!: [map], portfolioContributions: [map], portfolioWithdrawals: [map]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/return/money-weighted
@required {portfolios: [map{portfolioValues!: [map], portfolioContributions: [map], portfolioWithdrawals: [map]}]}
@optional {moneyWeightedReturnComputationMethod: str(irr/modifiedDietz)=irr}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/transformation/time-weighted
@required {portfolios: [map{portfolioValues!: [map], portfolioContributions: [map], portfolioWithdrawals: [map]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/transformation/money-weighted
@required {portfolios: [map{portfolioValues!: [map], portfolioContributions: [map], portfolioWithdrawals: [map]}]}
@optional {moneyWeightedReturnComputationMethod: str(irr/modifiedDietz)=irr}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/returns/standard-deviation
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/returns/variance
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/mean-variance/sharpe-ratio
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/mean-variance/information-ratio
@required {benchmarkReturns: [num], portfolios: [map{portfolioReturns: [num], portfolioValues: [num]}]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/mean-variance/sharpe-ratio/confidence-interval
@required {portfolios: [map{portfolioValues!: [num]}]}
@optional {riskFreeReturn: num=0, confidenceIntervalType: str(twoSided/lowerOneSided/upperOneSided)=twoSided, confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/mean-variance/sharpe-ratio/probabilistic
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/diversification-ratio
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/correlation-spectrum
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/contributions/return
@required {assets: int, assetsMeanReturns: [num], portfolios: [map{assetsWeights!: [num]}]}
@optional {assetsGroups: [[int]]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/contributions/risk
@required {assets: int, assetsCovarianceMatrix: [[num]], portfolios: [map{assetsWeights!: [num]}]}
@optional {assetsGroups: [[int]]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/contributions/value-at-risk/empirical/multivariate
@required {assets: [any], portfolios: [map{assetsWeights!: [num]}]}
@optional {confidenceLevel: num=0.95, empiricalQuantileEstimationMethod: str(linearInterpolationQuantileEstimation/harrellDavisQuantileEstimation)=linearInterpolationQuantileEstimation, assetsGroups: [[int]]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/contributions/value-at-risk/parametric/gaussian/multivariate
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/contributions/value-at-risk/parametric/gaussian/mixture/multivariate
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/contributions/diversification-ratio
@required {assets: int, assetsCovarianceMatrix: [[num]], portfolios: [map{assetsWeights!: [num]}]}
@optional {assetsGroups: [[int]]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/contributions/sharpe-ratio
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]], portfolios: [map{assetsWeights!: [num]}]}
@optional {riskFreeReturn: num=0, assetsGroups: [[int]]}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/optimization/equal-weighted
@required {assets: int}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/inverse-variance-weighted
@required {assets: int, assetsVariances: [num]}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/inverse-volatility-weighted
@required {assets: int, assetsVolatilities: [num]}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/equal-volatility-weighted
@required {assets: int, assetsVolatilities: [num]}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/equal-risk-contributions
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@optional {constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num]}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/equal-risk-contributions/clustering-based
@required {assets: int, assetsCovarianceMatrix: [[num]], assetsGroups: [[int]]}
@optional {constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num]}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/supervised/nearest-neighbors-based
@required {assets: int, assetsTrainingSample: [map{assetsFeatures!: [num], assetsWeights!: [num]}], assetsInferenceSample: [map{assetsFeatures!: [num]}]}
@optional {nearestNeighborsForecastMethod: str(kMean/kStar/kEnsemble)=kStar, nearestNeighbors: int=1, nearestNeighborsDistanceMetric: str(euclidean/hassanat)=hassanat}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/optimization/risk-budgeting
@required {assets: int, assetsCovarianceMatrix: [[num]], assetsRiskBudgets: [num]}
@optional {constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num]}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/maximum-decorrelation
@required {assets: int, assetsCorrelationMatrix: [[num]]}
@optional {constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/minimum-correlation
@required {assets: int, assetsCorrelationMatrix: [[num]], assetsVolatilities: [num]}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/most-diversified
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@optional {constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/minimum-variance
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@optional {assetsMeanReturns: [num], constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/minimum-variance/diversified
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@optional {assetsMeanReturns: [num], portfolioMeanReturnTolerance: num=0.1, portfolioVolatilityTolerance: num=0.1, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/minimum-variance/resampling-based
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@optional {assetsMeanReturns: [num], simulatedPortfolios: int=128, simulatedPortfoliosAggregationMethod: str(average/median)=average, assetsMeanReturnsUncertaintyIntervals: [[num]], assetsStandardDeviationsUncertaintyIntervals: [[num]], assetsCorrelationMatrixUncertaintyLevel: num, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/minimum-variance/subset-resampling-based
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@optional {assetsMeanReturns: [num], subsetSize: int, simulatedPortfolios: int=128, simulatedPortfoliosGenerationMethod: str(complete/random)=random, simulatedPortfoliosAggregationMethod: str(average/median)=average, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/hierarchical-risk-parity
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@optional {clusteringMethod: str(singleLinkage/averageLinkage/completeLinkage/wardLinkage)=singleLinkage, clusteringOrdering: str(r-hclust/optimal)=r-hclust, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/hierarchical-risk-parity/clustering-based
@required {assets: int, assetsCovarianceMatrix: [[num]]}
@optional {clusteringMethod: str(singleLinkage/averageLinkage/completeLinkage/wardLinkage)=wardLinkage, clusteringOrdering: str(r-hclust/optimal)=r-hclust, clusters: int, acrossClusterAllocationMethod: str(equalWeighting/inverseVolatility/inverseVariance)=equalWeighting, withinClusterAllocationMethod: str(equalWeighting/inverseVolatility/inverseVariance)=equalWeighting, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/maximum-return
@required {assets: int, assetsMeanReturns: [num]}
@optional {assetsCovarianceMatrix: [[num]], constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/maximum-return/diversified
@required {assets: int, assetsMeanReturns: [num]}
@optional {assetsCovarianceMatrix: [[num]], portfolioMeanReturnTolerance: num=0.1, portfolioVolatilityTolerance: num=0.1, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/maximum-return/resampling-based
@required {assets: int, assetsMeanReturns: [num]}
@optional {assetsCovarianceMatrix: [[num]], simulatedPortfolios: int=128, simulatedPortfoliosAggregationMethod: str(average/median)=average, assetsMeanReturnsUncertaintyIntervals: [[num]], assetsStandardDeviationsUncertaintyIntervals: [[num]], assetsCorrelationMatrixUncertaintyLevel: num, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/maximum-return/subset-resampling-based
@required {assets: int, assetsMeanReturns: [num]}
@optional {assetsCovarianceMatrix: [[num]], subsetSize: int, simulatedPortfolios: int=128, simulatedPortfoliosGenerationMethod: str(complete/random)=random, simulatedPortfoliosAggregationMethod: str(average/median)=average, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/maximum-sharpe-ratio
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]]}
@optional {riskFreeReturn: num=0, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/maximum-sharpe-ratio/diversified
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]]}
@optional {riskFreeReturn: num=0, portfolioMeanReturnTolerance: num=0.1, portfolioVolatilityTolerance: num=0.1, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/maximum-sharpe-ratio/resampling-based
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]]}
@optional {riskFreeReturn: num=0, simulatedPortfolios: int=128, simulatedPortfoliosAggregationMethod: str(average/median)=average, assetsMeanReturnsUncertaintyIntervals: [[num]], assetsStandardDeviationsUncertaintyIntervals: [[num]], assetsCorrelationMatrixUncertaintyLevel: num, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/maximum-sharpe-ratio/subset-resampling-based
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]]}
@optional {riskFreeReturn: num=0, subsetSize: int, simulatedPortfolios: int=128, simulatedPortfoliosGenerationMethod: str(complete/random)=random, simulatedPortfoliosAggregationMethod: str(average/median)=average, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/mean-variance-efficient
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]], constraints: map{portfolioMeanReturn: num, portfolioVolatility: num, maximumPortfolioVolatility: num, riskTolerance: num, minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/mean-variance-efficient/diversified
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]], constraints: map{portfolioMeanReturn: num, portfolioVolatility: num, riskTolerance: num, minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@optional {portfolioMeanReturnTolerance: num=0.1, portfolioVolatilityTolerance: num=0.1}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/mean-variance-efficient/resampling-based
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]]}
@optional {simulatedPortfolios: int=128, simulatedPortfoliosAggregationMethod: str(average/median)=average, assetsMeanReturnsUncertaintyIntervals: [[num]], assetsStandardDeviationsUncertaintyIntervals: [[num]], assetsCorrelationMatrixUncertaintyLevel: num, constraints: map{portfolioMeanReturn: num, portfolioVolatility: num, maximumPortfolioVolatility: num, riskTolerance: num, minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/mean-variance-efficient/subset-resampling-based
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]], constraints: map{portfolioMeanReturn: num, portfolioVolatility: num, riskTolerance: num, minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@optional {subsetSize: int, simulatedPortfolios: int=128, simulatedPortfoliosGenerationMethod: str(complete/random)=random, simulatedPortfoliosAggregationMethod: str(average/median)=average}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/equal-sharpe-ratio-contributions
@required {assets: int, assetsMeanReturns: [num], assetsCovarianceMatrix: [[num]]}
@optional {riskFreeReturn: num=0}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/market-capitalization-weighted
@required {assets: int, assetsMarketCapitalizations: [num]}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/maximum-ulcer-performance-index
@required {assets: [map{assetPrices!: [num]}]}
@optional {riskFreeReturn: num=0, constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/optimization/minimum-ulcer-index
@required {assets: [map{assetPrices!: [num]}]}
@optional {constraints: map{minimumAssetsWeights: [num], maximumAssetsWeights: [num], assetsGroups: [[int]], assetsGroupsMatrix: [[num]], maximumAssetsGroupsWeights: [num], minimumPortfolioExposure: num, maximumPortfolioExposure: num}}
@returns(200) {assetsWeights: [num]}

@endpoint POST /portfolios/analysis/value-at-risk/estimation/empirical
@required {portfolios: [map{portfolioValues!: [num]}]}
@optional {confidenceLevel: num=0.95, empiricalQuantileEstimationMethod: str(linearInterpolationQuantileEstimation/hutsonQuantileEstimation/harrellDavisQuantileEstimation)=linearInterpolationQuantileEstimation}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/estimation/empirical/multivariate
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/estimation/extreme-value-theory-based
@required {portfolios: [map{portfolioValues!: [num]}]}
@optional {confidenceLevel: num=0.95, evtQuantileEstimationMethod: str(gpdQuantileEstimation/weissmanHeavyTailedQuantileEstimation)=gpdQuantileEstimation}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/estimation/parametric/gaussian
@required {portfolios: [any]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/estimation/parametric/gaussian/multivariate
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/estimation/parametric/student
@required {portfolios: [any]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/estimation/parametric/cornish-fisher
@required {portfolios: [any]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/estimation/parametric/cornish-fisher/corrected
@required {portfolios: [any]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/estimation/parametric/gaussian/mixture
@required {portfolios: [any]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/estimation/parametric/gaussian/mixture/multivariate
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/forecast/arma-garch
@required {portfolios: [map{portfolioValues!: [num], portfolioReturnsConditionalMeanModel: str, portfolioReturnsStandardizedResidualsDistribution: str}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/forecast/arma-ewma
@required {portfolios: [map{portfolioValues!: [num], portfolioReturnsConditionalMeanModel: str, portfolioReturnsStandardizedResidualsDistribution: str}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/conditional/forecast/arma-garch
@required {portfolios: [map{portfolioValues!: [num], portfolioReturnsConditionalMeanModel: str, portfolioReturnsStandardizedResidualsDistribution: str}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/conditional/forecast/arma-ewma
@required {portfolios: [map{portfolioValues!: [num], portfolioReturnsConditionalMeanModel: str, portfolioReturnsStandardizedResidualsDistribution: str}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/conditional/estimation/empirical
@required {portfolios: [map{portfolioValues!: [num]}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/conditional/estimation/parametric/gaussian
@required {portfolios: [map{portfolioValues!: [num]}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/conditional/estimation/parametric/student
@required {portfolios: [map{portfolioValues!: [num]}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/conditional/estimation/parametric/cornish-fisher
@required {portfolios: [map{portfolioValues!: [num]}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/conditional/estimation/parametric/cornish-fisher/corrected
@required {portfolios: [map{portfolioValues!: [num]}]}
@optional {confidenceLevel: num=0.95}
@returns(200) {portfolios: [map]}

@endpoint POST /portfolios/analysis/value-at-risk/conditional/estimation/parametric/gaussian/mixture
@required {portfolios: [map{portfolioValues!: [num], confidenceLevel: num}]}
@returns(200) {portfolios: [map]}

@endgroup

@group assets
@endpoint POST /assets/returns/transformation/moment-matched
@required {assets: [map{assetReturns!: [num]}]}
@optional {targetMeans: [num], targetCovarianceMatrix: [[num]]}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/transformation/unsmoothed
@required {assets: [map{assetReturns!: [num]}]}
@optional {unsmoothingMethod: str(geltner/okunevWhite)=geltner, unsmoothingMethodOrder: int=1}
@returns(200) {assets: [map]}

@endpoint POST /assets/returns/expected/estimation/empirical
@returns(200) {assetsMeanReturns: [num]}

@endpoint POST /assets/returns/expected/estimation/implied
@required {assets: int, assetsCovarianceMatrix: [[num]], assetsWeights: [num], constraints: map{riskTolerance: num, portfolioMeanReturn: num, portfolioSharpeRatio: num, assetsExpectedReturns: [num], portfolioHistoricalReturns: [num], riskFreeHistoricalReturns: [num], riskFreeHistoricalReturn: num}}
@optional {riskFreeReturn: num=0}
@returns(200) {assetsMeanReturns: [num]}

@endpoint POST /assets/returns/expected/estimation/ordering-information-based
@required {assets: int, assetsOrderingBeliefsMatrix: [[num]]}
@optional {assetsExpectedReturnsScalingFactor: num=1}
@returns(200) {assetsMeanReturns: [num]}

@endgroup

@end
