Proven Winner WFO

System Trading

Apr 24

One way to think about WFO is instead of thinking about it as in-sample and out-of-sample performance is to think about a static population of strategies because it truly is a static population of strategies. In seeing it in this light, we can start to realize the correlation between past and future periods will be a predictor for the suitability of WFO and may provide insight into the optimal period. My recent Weighted Anchored WFO seeks to de-minimize the in-sample period by using mathematical decay function which is presumably more universal and for which fewer reason possibilities exist (i.e. linear, exponential, or decay function).

One problem that can come up even among strategies that do pass WFO is having trust in the suggested optimal parameters to trade– especially if those parameters have never came up as leaders in historical testing. An alternative theory to WFO is that the developer should use all the data and only trade proven long term winners. Logically, both methods have appeal: WFO allows the developer to most accurately obtain out-of-sample performance while choosing a long term proven winner has appeal too.

Proven Winner WFO is a variation on the WFO theme that tries to combine the best of both methodologies. First, you split your data into two compartments. The first is a long term history where you run an exhaustive optimization. The developer picks a population of top performing strategies, i.e. proven winners from this run. Next, in the WFO stage the WFO isn’t picking parameters but is basically picking the best performing strategies. In this way, it is similar to a relative strength strategy.

The logic is that being a “proven” winner is prerequisite but not enough in itself to warrant trading. Likewise, recent outperformance is a requirement but insufficient to warrant trading. Proven Winner WFO requires that the strategy be a proven winner and be performing relatively well over the most recent history, well. This methodology addresses many of the potential problems that may be inherit in traditional WFO engine such as inability to consider the entire strategy space or pick sensible winners while still preserving the best parts of the having a walk-forward out-of-sample period for strategy verification and proofing.


The initial optimization is just a traditional exhaustive optimization. Proven winners are select. The next phase of WFO among systems is not as straightforward. There are 3 ways to implement it:

  1. Build a virtual position tracker and feed it all the sets of parameters. The VPS must be able to track multiple systems within a same code base.
  2. Apply individual strategies to multiple charts. Program the strategies to communicate using Global Dictionary.
  3. Somehow take advantage of the traditional WFO process.

Trade-offs and Implementation Insights

Virtual position tracking has the advantage of being able to do the optimization/adaption in real-time while not requiring the overhead of running multiple charts. The downside is beyond the most basic order logic will require more advanced virtual position tracking. The complexity could become unwieldy. An alternative would be to base the optimizations decisions off simpler proxy models.

Running the strategies on multiple charts has the advantage you can still get the data in real-time. It exchanges code complexity for management complexity and extra load in the real-time. This method realistically probably only favors a relatively few feeder strategies.

If a trader could make use of the the built in WFO process then both code complexity, management complexity, and real-time performance qualifications would be eliminated. The one downside is that you can only get data at re-optimization schedules. However, Multicharts has the ability to automatically re-optimize running strategies at select intervals suggesting this method may be ideal for cases where one wants to run a portfolio of more strategies.

But, a method to utilize the traditional WFO process is not straightforward obvious because we need to provide sets of parameters for the optimizer to work with. The optimizer should not be optimizing individual parameters. Thinking back to my machine language programming days, the solution is to add a level of indirection!

We simply add a master variable which switches between the pre-programmed sets! The optimizer can do what it does “naturally”. If our population is say 100 strategies then the optimizer will optimize the sets selector variable over 100 combinations, i.e. 1 to 100. In the code, we simply need to load the proper sub-configuration for each selection.

About the Author

The author is passionate about markets. He has developed top ranked futures strategies. His core focus is (1) applying machine learning and developing systematic strategies, and (2) solving the toughest problems of discretionary trading by applying quantitative tools, machine learning, and performance discipline. You can contact the author at