RSJ Portfolio Portfolio Optimization

← All posts

2026-10-04

Portfolio Optimization Software for Quantitative Investors

Portfolio Optimization Software for Quantitative Investors
portfolio optimization modern portfolio theory portfolio correlation portfolio optimization hierachical risk parity minimize volatility minimize semivariance maximize sharpe

Portfolio Optimization Software for Quantitative Investors

It’s Monday morning, and Mira has a problem that is not a data problem. She does quantitative research for a small fund. Her candidate list for the next mandate holds eighteen tickers, all of which survived her screen. The investment committee meets on Thursday, and what it wants is not another screen — it wants an allocation: how much to each name, why those weights, and which risk assumptions produced them.

That is the moment where most quants pick one of two bad options. Option one: a spreadsheet that implicitly assumes every pair of stocks moves together, which makes the correlation work disappear. Option two: a bespoke optimizer — your own covariance estimator, your own cleaning pipeline, your own constraint solver — which is a multi-week project before you get anywhere near the actual question.

This article is the playbook for the middle path: how to choose and run portfolio optimization software as a quantitative investor, and how to defend the resulting allocation in front of people who will ask hard questions. The concrete example throughout is RSJ Portfolio — a Windows desktop application that builds a statistically optimized stock portfolio from historic end-of-day prices.

Why Quantitative Investors Need a Dedicated Optimizer

The gap between a spreadsheet and a real optimizer isn’t arithmetic. It’s three things that decide whether your allocation survives review.

  • Correlation-aware allocation. Weights should reflect how candidates co-move, not just how attractive each one looks alone.
  • Selectable risk estimators. Different questions need different risk models, and the estimator you pick changes the answer.
  • Reproducible constraints. A weight cap should encode a mandate limit, and it should be recorded so the run can be repeated.

RSJ Portfolio’s statistical core is exactly this: it analyses the return correlation between stocks and allocates capital to candidates that correlate weakly — or whose downside correlates weakly — which reduces the volatility of the resulting portfolio. Allocation uses modern portfolio theory, and the objective, the risk estimator and the weight constraints are all selectable rather than baked in.

That last point matters most for a quant. A tool with one built-in method answers one question. A tool where you choose the objective and the risk model answers the question you were asked.

Two sibling articles go deeper on the modelling side, and you should read them once the mechanics here are clear: Minimum Semivariance vs Minimum Volatility: Which Objective? for the downside-risk case, and What Is Hierarchical Risk Parity? A Plain-Language Explanation for the clustering-based approach.

A Practical Playbook: Running an Optimization in RSJ Portfolio

The workflow is five steps. Do them in this order the first time; after that, steps 1 and 2 are largely a repeat of your last run.

Step 1 — Configure before the first run

Before you touch a candidate list, set the environment the optimizer will work in: data provider, local cache, local currency, date range and cleaning settings. These are the parameters that quietly determine every number downstream, so they belong at the front of the process, not in a scramble at the end.

The Configuration guide chapter walks through each setting, and the Data and currencies page documents the supported providers, the price cleaning pipeline and the local cache.

Step 2 — Build the candidate list by searching symbols

Assemble the universe you actually want to allocate across — not everything your screen returned, but the set you are willing to hold and can explain. RSJ Portfolio lets you search symbols and build that candidate list directly; the Selection guide chapter covers it.

A useful discipline here: if you cannot justify a name to the committee in one sentence, it does not belong in the optimization. The optimizer will happily allocate to it, and you will still owe the explanation.

Step 3 — Choose the objective and the risk model

This is the decision that carries the most analytical weight. The allocation methods available include:

  • minimum volatility
  • maximum Sharpe ratio
  • minimum semi variance
  • hierarchical risk parity
  • conditional value at risk

Pair the objective with one of the eight risk models, and use the return models where your objective needs them. The Methods and features page enumerates the full set; the Recommendation guide chapter explains the optimizer’s parameters and the resulting allocation.

Match the objective to the question. If the mandate is “do not lose money in a bad quarter”, minimum volatility or minimum semi variance is the conversation. If it is “best risk-adjusted return on history”, maximum Sharpe. If you want an allocation that does not depend on inverting a noisy covariance matrix, hierarchical risk parity.

Step 4 — Set weight constraints and run the optimizer

Weight constraints are mandate limits expressed as numbers: a single-name cap, a sector cap, a fully-invested requirement. Set them before the run, not after you have seen the weights you dislike. Then run the optimizer and read the allocation in the Recommendation view.

Step 5 — Export and handle multi-currency portfolios

Export the results into whatever you use for reporting or further analysis. If the portfolio is quoted in several currencies, the Data and currencies page documents the conversion path, so you are not stitching FX rates into a spreadsheet by hand.

Whatever format the export takes, the cheapest possible sanity check is that the weights sum to one and sit inside your constraints:

import csv

# Adapt the column name to your export format
weights = [float(row["weight"]) for row in csv.DictReader(open("allocation.csv"))]

print(f"n={len(weights)} sum={sum(weights):.6f} min={min(weights):.4f} max={max(weights):.4f}")
# sum should be ~1.000000; min/max should respect your mandate caps

Checklist for a Defensible Allocation

Run this list before you send anything to a committee.

  • Data hygiene. Confirm the price cleaning pipeline and local cache are set up, so the optimizer runs on consistent end-of-day series rather than a patchwork of manual fixes.
  • Parameter sanity. Match the objective to the question you are answering, and pick a risk estimator you can justify out loud to a reviewer.
  • Constraint discipline. Use weight constraints to encode mandate limits, not to nudge the output toward an answer you already preferred.
  • Reproducibility. Record the date range, cleaning settings and parameters alongside the exported allocation. A run you cannot repeat is an anecdote.
  • Cross-check. Before committing capital, review the result against Is Your Optimized Allocation Overfit? A Practical Checklist.

A run record costs thirty seconds and saves an afternoon of archaeology later:

# Attach this to every exported allocation you circulate
run:
  date: 2026-10-04
  universe: candidates-2026-10.csv
  history:
    start: 2019-01-01
    end: 2026-09-30
  objective: minimum-volatility      # or max-sharpe, min-semivariance, hrp, cvar
  risk_model: <exact label from the UI>
  constraints:
    single_name_max: 0.10
    fully_invested: true
  data:
    provider: <provider>
    currency: EUR
    cleaning: <settings as configured>

What to Avoid When Choosing Optimization Software

  • Tools that hide the risk model. If you cannot select or inspect the estimator, you cannot defend the allocation. Full stop.
  • One-size-fits-all objectives. A single built-in method will not cover minimum volatility, maximum Sharpe, minimum semi variance, HRP and CVaR use cases.
  • Ignoring data provenance. Unsupported providers and unclear cleaning steps undermine every number downstream, no matter how good the optimizer is.
  • Treating the optimizer as a black box. The statistics matter, which is why the guide ships a Concept chapter on the statistical background.
  • Assuming a cloud-only workflow when yours is desktop and file-based. RSJ Portfolio is a Windows desktop application with a local cache, which fits a process built around local files and a named analyst rather than a shared browser session.

Getting Started Without a Long Evaluation Cycle

You do not need a pilot project to answer “does this fit our process”. Start with the Getting Started guide — requirements, the configuration worth setting before the first run, recommended starting parameters, and how to read the results. If your team prefers to see the workflow before installing anything, the explainer video is a short walkthrough.

The Downloads page has the Windows installer plus the user guide. The installer filename is versioned and a SHA-512 hash is published on that page — verify before you install:

# Installer filename is versioned; the hash is published on the same page
$installer = ".\RSJPortfolio-<version>-setup.exe"
(Get-FileHash $installer -Algorithm SHA512).Hash

The Pricing and license page describes the single user license and the checkout; the Installation and license guide chapter covers what the license includes. The user guide is available in English and German.

FAQ

Does RSJ Portfolio run on Windows, and what does the license include?

RSJ Portfolio is a Windows desktop application. The product information describes a single user license; the Pricing and license page and the Installation and license guide chapter are the authoritative sources for what the license covers.

Which optimization objectives and risk models can I select?

The allocation methods include minimum volatility, maximum Sharpe ratio, minimum semi variance, hierarchical risk parity and conditional value at risk. The product information also lists eight risk models, return models and weight constraints; the Methods and features page enumerates them in detail.

How does end-of-day price data get into the optimizer, and how are multiple currencies handled?

The tool works from historic end-of-day prices supplied through supported data providers, with a price cleaning pipeline and a local cache. For portfolios quoted in several currencies, the Data and currencies page documents the conversion path.

How do I know my optimized allocation is not overfit?

Overfitting is a real risk with any optimizer. The dedicated article Is Your Optimized Allocation Overfit? A Practical Checklist walks through a pre-commit review; use it alongside the parameter and constraint discipline described in this playbook.

Conclusion

Mira’s Thursday meeting is not won by the optimizer. It is won by being able to say: here is the universe, here is the date range, here is the objective, here is the risk model, here are the constraints, and here is the allocation they produce — reproducibly. That is the whole point of running dedicated software instead of a spreadsheet or a home-grown script.

RSJ Portfolio packages that workflow into a Windows desktop application: supported end-of-day data with cleaning and caching, selectable objectives and risk models, weight constraints, and exports you can hand to a committee. Start with the Getting Started guide, install from the Downloads page, and bring your next candidate list into a run rather than a spreadsheet.

Related posts

EU label: AI-generated content