Each of you has finished a strategy. Now you put them together into one fund and see how the combination did. This guide assumes you have not done that before and explains every word as it comes up.
A fund is a portfolio of portfolios. Each teammate's strategy becomes one holding, and you decide how much of the money goes to each.
In the design app you built a rule for picking shares. This page does not do that. It
starts from the finished strategy.json files your team already exported
and asks a different question: given these four or five designs, how should the team
split its money between them, and how would the combination have done?
This page cannot create or change a design. That is not a rule it enforces: the design form is not in this file at all. If you need to change a strategy, go back to the main The backtesting app page, change it there, and export it again.
team-01-a3f91c4d that names one design. It is printed
next to the export buttons in the design app and stamped inside the file. Two exports
of the same unchanged design get the same id, and any change to the design gives a
different one. The fund uses it to say exactly which file carries which weight.
README.html, that says what the pack covers and which
companies it does not carry. Read it before you load the pack.
| You need | Where it comes from |
|---|---|
One strategy.json per teammate |
Each person exports their own from the design app. They must be the frozen versions you handed in, not later edits. |
| The term's three packs: design, test 1 and test 2 |
The same design zip you used for your own backtests, plus the two test zips
released after the freeze. Each has a README.html beside it; the
app's pack table shows the same dates and trading-day counts once they load.
|
| Your team name, written the same way by everyone |
It is inside each strategy.json. If two people typed it differently
the files still work together, because the id treats "Team 01" and "team-01" as
the same team.
|
Drag everything onto the box at the top: the pack zips and every teammate's
strategy.json. You can do it in any order and in any number of goes.
As each pack loads, the panel below lists the window it carries. This term each pack carries one window, so three packs give the three windows your fund is measured over. Drop all three together: the page refuses two packs that claim the same window, and it says so under the table rather than quietly picking one.
Three packs take a few seconds to load and a few hundred megabytes of memory, because the app keeps every price in memory to run the backtests quickly. On an older laptop, close other heavy tabs first.
Every accepted design shows its strategy id, the analyst, the team and the design name. Read that table out loud against what your team expects. This is the moment to catch a file that is one version out of date.
A file can be refused, and the message says why. See if something is refused at the bottom of this page.
Four options, described in the next section. Start with equal allocation and look at the numbers, because that is what everything else gets compared to.
Minimum variance and maximum Sharpe both need a stretch of history to work from. You tick which windows. This is your decision, it is recorded in what you hand in, and there is a whole section on it below.
Press the button. Each design runs over each window, on the pack that window came from. With ten designs and three windows that is thirty backtests, so give it a moment. The bar at the top says what it is doing.
Change the method or the weights and build again. The backtests are kept, so a second build with different weights is quick. If you change the designs or the packs, everything runs again.
fund.json is what you hand in. The spreadsheet is for you, and for the
part of the report where you explain what the fund did.
| Method | What it does | What it needs from you |
|---|---|---|
| Equal | Every component the same weight. | Nothing. It is arithmetic. |
| Manual | You type each weight yourself. | A reason for each number, which the interview will ask for. |
| Minimum variance | The weights that would have given the steadiest fund. It uses covariance, so it leans towards components that move differently from each other. | Which windows to fit to. |
| Maximum Sharpe | The weights that would have given the best return per unit of risk over the window you fit to. | Which windows to fit to. |
Whatever you pick, each weight has to be between 0.05 and 0.40, and the weights have to add up to 1. Those numbers come from your course settings, not from this page.
The floor stops a component being in the fund in name only. The ceiling stops one person's design becoming the whole fund, which would make it a single strategy wearing a team's name. A consequence worth knowing: a team of two cannot satisfy a ceiling of 0.40, because two weights of at most 0.40 cannot reach 1.
The optimisers use no randomness and no clock. Running the same fit twice gives
identical weights, on any computer, and the settings used are written into your
fund.json so your instructor can reproduce them from the file alone.
An optimiser has to look at some history to work out its weights. You choose which history. By the time you build the fund you hold every pack, so all the windows are available to you.
Look at which boxes are ticked before you build, because the choice is yours and it is written into what you hand in. You may tick any of the three windows, including the two test windows your fund is graded on. Remember that this term's test windows sit before the design window on the calendar, so "fit to the test windows" means fitting to 2023 and 2025, history none of the designs were tuned on but history your fund will be marked on all the same.
A useful thing to do, and a good paragraph for your report: fit the weights to the design window alone, write down the numbers, then fit them to everything and compare. If the two sets of weights are close, your allocation is saying something stable. If they are far apart, that is worth understanding before you defend it.
Two halves, and only one of them responds to anything you do here.
| Half | What it measures | Can your weights move it? |
|---|---|---|
| Equal allocation performance | The quality of the underlying designs. Every component at the same weight, across every graded window. | No. Equal weights are fixed by arithmetic. Your instructor rebuilds this from the list of components, which is why you do not hand in an equal-weight fund. |
| Improvement over equal | Your allocation, minus that baseline. | Yes. That is the point of it. |
This is why the equal-allocation figure sits on screen the whole time you are choosing weights. You can see what you are being compared against while you decide, rather than finding out afterwards.
The improvement figure is a plain subtraction and it is not floored at zero. A team whose allocation did worse than equal weights sees a negative number, which is information rather than a punishment: it usually means the components move together more than the team expected.
Left is the equal-allocation composite, right is yours. The note under the right tile gives the difference. Both are Sharpe ratios across all the graded windows.
One row per window, with its trading days, how much it counts towards the composite, and both Sharpe ratios. Windows are weighted by length, so the longest window carries the most.
The spreadsheet is there so you can check the arithmetic yourself, in a tool you already know.
| Sheet | What is on it |
|---|---|
| Fund summary | The composite figures, the per-window rows, and the weights. |
| Fund daily | One row per trading day: the fund's value under your weights and under equal weights. |
| Fund holdings | One row per component per day: units held, value per unit, value, share of the fund. |
| Contribution, one per window | Each component's weight, its return over the window, and the two multiplied. |
Two checks you can run, and both should come out exactly:
The contribution sheets add up to roughly the fund's return over the window rather than exactly. That is not an error: the fund rebalances back to your weights at intervals and the weights drift in between, which the holdings sheet shows day by day.
It also records a fingerprint of each strategy file, so it is tied to the exact designs you handed in. If someone edits their strategy after you build the fund, your instructor sees that the fund was built against a different copy, and it is a named finding rather than something anyone has to go looking for.
Scenario mode, the tickbox above the design list, lets you combine designs from more
than one team so you can explore. The figures and the spreadsheet still work; the
fund.json export switches off, because a submission names one team.
| What you see | What it means and what to do |
|---|---|
| "carries no strategy id" | The file was exported before ids existed, or was hand-edited. Open the design in the main page of the app and export it again. The design does not change and the id it gets is the design's own. |
| "was changed after it was exported" | The id inside the file no longer matches what is in the file, so the file was edited by hand after export. Export it again from the app rather than repairing it in a text editor. |
| "the same design twice" | Two files carry the same strategy id, so they are the same design. Someone probably sent their file twice, or two people exported the same work. One weight goes to one design. |
| "a submitted fund names one team" | One of the files names a different team. Check that everyone typed the team the same way, or turn on scenario mode if you are exploring on purpose. |
| "Both ... and ... carry the design window", naming two of your packs | You have loaded two packs that both claim the same window. Because they were built at different times they disagree slightly about shared history, so there is no correct way to pick between them. Remove the one that window was not released on. |
| "the covariance matrix ... is singular" | Two components have return series the optimiser cannot tell apart, or one of them does not move at all. Look at the per-window figures for two components that behave identically. Equal or manual weights still work. |
| "the estimation window is N trading days long" | You are asking the optimiser to fit more components than you have given it days of history. Tick more windows, or use fewer components. |
| "outside the allowed band" | A manual weight is below 0.05 or above 0.40. The message names the component by its strategy id, which you can read off the design list above. |
Everything on this page runs on your own computer. Nothing is uploaded, there is no account, and closing the tab loses nothing you have exported.