Skip to content

Learn

Stock Factor Research

Audit an added stock factor through changed selections and net costs

An added stock factor has decision value only after its effect on selections, quantities and costs is made explicit. Freeze the combination rule, compare the base and combined scores on the same eligible cross section, and trace every replacement into an independent account ledger. Low correlation or a favorable regression coefficient cannot substitute for this portfolio comparison.

This guide uses four fictional US stocks, supplied ordinal ranks and synthetic USD prices. CoTrading multifactor checks remain planned or unverified. The example tests a fixed equal-weight combination; it does not search for optimal weights, estimate an independent return premium or present historical performance.

Define the candidate before combining it

Record both factors’ raw definitions, timestamps, valid domains and economic direction. If one prefers low raw values and the other high values, orient them consistently before combining. Missing candidate information is not a neutral zero unless an explicit imputation rule says so. Save candidate coverage separately from its numeric values.

Use a comparable scale for the stated combination. This fixture receives four-to-one ordinal ranks for both factors, with higher ranks preferred. They are author-supplied ranks of one current cross section, not estimates of equal increments in expected return. In real research, declare ranking, standardization or another transformation using only the permitted observation window.

Freeze candidate definition and a 50/50 score weight before viewing the later marks. Weighting factor scores is different from allocating half the account to each stock. The account below uses forty shares per selected member and a cash reserve. Keep score weights and portfolio weights in different configuration fields to avoid a misleading interpretation.

Keep the comparison cohort and timing fixed

Both constructions use the same four names, information cutoff, decision and execution events. A candidate with missing coverage may require a common eligible comparison universe; report that restriction rather than attribute a different cohort’s return to the added factor. A separate deployment study can measure the cost of lost coverage under its own rules.

Do not let a new score read a later revised fundamental simply because the base factor does not use that field. Availability constraints apply to each input. Save the transformation and combination versions so a later rerun can identify whether a new holding came from a candidate revision, a base-factor change or a genuine new decision date.

The fixed rule takes the arithmetic mean of the two supplied ranks. Python’s statistics documentation describes the mean operation used in the standalone script. Its mathematical simplicity does not validate the economic choice of equal weights; that choice is a predeclared hypothesis for this exercise.

Reconstruct base and combined rankings

Base ranks are A four, B three, C two and D one. Candidate ranks are A three, B one, C four and D two. Their equal-weight combined scores are A 3.5, B two, C three and D 1.5. Sort descending score, then ascending stable identifier, selecting two stocks.

The base portfolio selects A/B. The combined portfolio selects A/C. A remains common; B leaves because the candidate gives it the lowest candidate rank, while C enters with the highest candidate rank. Preserve these individual contributions rather than report only a changed average portfolio score.

This is a boundary decision, not a causal estimate. The candidate has changed one selected member under one frozen combination and capacity. A different number of slots or weighting method could produce another result, but those are additional experiments. Do not adjust the weight until a favorite stock enters and then present the final rule as the original test.

Begin both ledgers from identical holdings

The starting account owns forty A shares and forty B shares, each referenced at ten, and has 200 cash. Initial equity is 1,000. These are supplied beginning holdings; earlier acquisition costs are outside this next-rebalance comparison. Both methods receive the same later price marks.

The base method retains A/B without trading. At marks A 10.2 and B 10.1, holdings are worth 408 and 404, plus cash 200, producing equity 1,012. No fictional daily transaction fee is charged merely because the base ranking was recomputed.

The combined method retains A, sells forty B at ten and buys forty C at ten. Each executed order pays one fictional fee, so cash becomes 198. At A 10.2 and C 10.5, holdings are 408 and 420, giving equity 1,026. The net decision increment over the base account is fourteen.

Explain the increment rather than naming a premium

C’s later marked position exceeds B’s by sixteen: 420 versus 404. Replacement costs two, leaving fourteen. The account result therefore reconciles to a specific substitution and actual costs. It is not a return contribution inferred solely from factor correlation, nor evidence that the candidate will continue to help.

Both positions remain open at the final mark. A liquidation comparison would require corresponding exit prices and costs for both accounts. Do not compare one marked basket with another already liquidated basket, because terminal cost differences would contaminate the decision increment.

If a candidate forces many replacements in a larger panel, include all resulting orders, quantity rounding and unfilled targets. A gross benefit that disappears after those costs should remain visible as such. Conversely, a candidate can change scores substantially without crossing a selection or sizing boundary; that is the next explicit counterexample.

Test a redundant candidate without forced turnover

Replace the candidate ranks with an exact copy of the base ranks, preserving the same equal-weight rule. Each combined score equals its base score, selected members remain A/B and no order is created. The script asserts zero incremental fees for this case instead of manufacturing trades to demonstrate that a new factor was “used.”

This boundary isolates decision redundancy from the main example’s member replacement. A low pairwise correlation would not guarantee a replacement either; only the complete rule determines whether a candidate crosses the boundary. The duplicate example is deliberately obvious so an implementation that unnecessarily rebuilds all positions is easy to detect.

Save the candidate-alone rank, combined rank and selected flag for every stock. These artifacts reveal whether a claimed improvement came from a real change in decision, a changed coverage set or simply a reporting recalculation. Do not label the candidate an independent source of returns on the strength of this synthetic comparison.

Run the incremental-decision acceptance pack

Download the complete example, save it as R570.py and run python R570.py with Python 3.12 or later. It uses only the standard library and synthetic data. The source is docs/growth/research/round-5/examples/R570.py.

Assertions verify all combined scores through the selection, A/B versus A/C, the two replacement orders, zero base fees, two combined fees, equities 1,012 and 1,026 and unchanged members under the duplicate candidate. Inspect the before-and-after holdings as well as the fourteen-unit summary.

The script asserts the exact combined-score dictionary, empty base orders and cash 200, and the sell-B/buy-C pair at forty shares, price ten and fee one per order. Combined cash must be 198 and fees two. The reported decision increment is calculated by subtracting the base account’s final equity from the combined account’s final equity, then asserted equal to fourteen. Removing order appends must fail even if both terminal values remain numerically correct.

Update the experiment without changing its question

Archive the frozen rule, weights, transformations, availability policy, universe and starting holdings. On each new version, identify the first changed input and the first changed selected name before interpreting the account difference. If the candidate has a new definition, start a new comparison rather than merge it into the old series silently.

For a historical extension, report coverage, turnover, exposure, cost assumptions and comparison dates alongside genuine returns. Keep the planned market’s execution constraints separate and verified. Completion means a reviewer can reconstruct the candidate’s exact decision increment and its net cash consequences, including a no-change case; it does not certify optimal weights or establish a persistent causal benefit.

Match the comparison window and accounting state

The supplied starting holdings make this a next-rebalance comparison, not a claim that acquisition fees have disappeared from a full historical strategy. If a real report begins earlier, include those earlier trades for both constructions. If it ends with liquidation, apply comparable terminal rules. Otherwise an apparent candidate increment may be an accounting-window difference.

Keep actual holdings separate from requested targets when an order fails. A requested B-to-C replacement that never fills cannot receive C’s later mark. The synthetic example assumes complete fills at the supplied prices; a real extension must propagate rejection and cash constraints before attributing incremental performance to the candidate.

FAQ

Does low correlation prove a candidate helps the portfolio?

No. The frozen combination, selection boundary, sizing and costs determine its actual decision effect.

Should unchanged members be forced to trade?

No. Under the fixed-quantity rule, unchanged targets do not require replacement orders.