OK I got 0.89 for the correlation which is higher than I expected (though perhaps not as high as you got). I used equal weights for the optimisation for speed, but I wouldn't expect much difference with more complex techniques. Partly this might be because using the classic set of 5 instruments, for most of the time there aren't many instruments with data except for US10, CORN and EUROSTX, and these instruments happen to have more correlation between the breakout and ewmac rules. Anyway I'm running with all 37 instruments to see what that looks like. Here's the code I ran (using the very latest version) Code: from syscore.accounting import account_test from syscore.pdutils import turnover from sysdata.configdata import Config from systems.provided.futures_chapter15.estimatedsystem import futures_system from systems.provided.moretradingrules.morerules import breakout import pandas as pd import numpy as np from matplotlib.pyplot import show, legend, matshow bvariations=["breakout"+str(ws) for ws in [10, 20, 40, 80, 160, 320]] evariations=["ewmac%d_%d" % (fast, fast*4) for fast in [2,4,8,16,32, 64]] my_config = Config("examples.breakout.breakoutfuturesestimateconfig.yaml") ## old system has ewmac only my_config.rule_variations=evariations my_config.forecast_weight_estimate["method"]="equal_weights" system_old = futures_system(config=my_config, log_level="on") ## new system has breakouts new_config = Config("examples.breakout.breakoutfuturesestimateconfig.yaml") new_config.rule_variations=bvariations new_config.forecast_weight_estimate["method"]="equal_weights" system_new = futures_system(config=new_config, log_level="on") curve1=system_old.accounts.portfolio() curve2=system_new.accounts.portfolio() print(curve1.stats()) print(curve2.stats()) print(account_test(curve2, curve1)) curves_to_plot=pd.concat([curve1.as_df(), curve2.as_df()], axis=1) curves_to_plot.columns=["ewmac", "breakout"] print(curves_to_plot.corr()) curves_to_plot.cumsum().plot() show() GAT
I'm just working backwards to try and simulate rolling the contracts over on historical data, looking at corn one year out and rolling 12 months forwards, using spread trades. It seems the 'prudent' way to do this would be an 'open interest crossover', passively before the crossover and forced afterwards. For corn, it looks like you have a window of a few months to make the roll. According to your blog post, you mention price action as being a factor in choosing when to roll. As best as I can tell, this is a random process, so catching a favourable spread is akin to 'getting lucky'. Doesn't it make sense here to use optimal stopping theory to decide the roll date, rather than guessing? (explained in a fun way here: http://www.npr.org/sections/krulwic...-marry-the-right-girl-a-mathematical-solution) Also: If you had to measure the quality of a discretionary roll, what statistic would you use? Lastly, in the managed futures world, is rolling fully automated or is there still a discretionary element? Sorry for all the questions, just trying to make sure I understand every bit! Thank you!
I don't use "price action" myself, I just mentioned it in passing and said I don't believe that the price action of different contracts is meaningfully different. By the way when I talked about "price action" I wasn't talking about trying to roll at a time when the spread was favourable (this is seperate from being in the contract with the best carry which I do look at). And I don't look at this eithier. I suppose one could model the spread - you wouldn't need such a fancy model to do this as you mention it, it would be just like predicting any other price. The spread tends to trend in the short term and mean revert in the long term. It's also often driven by the overall direction of spot. I'm happy to answer your questions, but this isn't a subject I personally pay a lot of attention to. I view the spread I get on the roll as pure luck. I can only speak of one fund, and the situation a couple of years ago, but rolling is still a very discretionary call. GAT
So, for someone rolling a contract for the first time, the key things to look at are: Liquidity of contracts Carry between them ?
Yes, mostly. The blog article is pretty detailed, there's nothing I can add to it here that will be of any further help. GAT
Hi GAT, i was looking at one of the earlier posts on this thread and it looks like you allocate more to the breakout system than the traditional momentum if you were to consider the ewmac as that. How come? Is this driven by the optimizer or is it driven by you/your gut? Great thread by the way.
More by the optimiser. I run some other trading rules in my system that are more similar to ewmac, whereas breakout is a bit different. GAT
Thanks for the prompt reply. I think I get what you mean. Choosing which trading rules to include is your decision, optimizer decides the proportions. Do you intend to discuss what those other trading rules are at some point, or is that the "secret sauce"? I am curious as to what made you decide to include rules that are similar to each other.
Here it is with 37 instruments Correlation is 0.91 actually slightly higher than with 5 instruments. Again using equal weights after screening for things that have costs which are too high. It looks like your correlation is closer to 1.0, which suggests something very strange is going on.... Although my correlation is higher later in the period. Code: from syscore.accounting import account_test from syscore.pdutils import turnover from sysdata.configdata import Config from systems.provided.futures_chapter15.estimatedsystem import futures_system from systems.provided.moretradingrules.morerules import breakout import pandas as pd import numpy as np from matplotlib.pyplot import show, legend, matshow bvariations=["breakout"+str(ws) for ws in [10, 20, 40, 80, 160, 320]] evariations=[ "ewmac%d_%d" % (fast, fast*4) for fast in [2,4,8,16,32, 64]] my_config = Config("examples.breakout.breakoutfuturesestimateconfig.yaml") ## will do all instruments we have data for del(my_config.instruments) ## temporarily remove breakout rules my_config.rule_variations=evariations my_config.forecast_weight_estimate["method"]="equal_weights" system_old = futures_system(config=my_config, log_level="on") ## new system has all trading rules new_config = Config("examples.breakout.breakoutfuturesestimateconfig.yaml") new_config.rule_variations=bvariations new_config.forecast_weight_estimate["method"]="equal_weights" del(new_config.instruments) system_new = futures_system(config=new_config, log_level="on") curve1=system_old.accounts.portfolio() curve2=system_new.accounts.portfolio() print(curve1.stats()) print(curve2.stats()) print(account_test(curve2, curve1)) curves_to_plot=pd.concat([curve1.as_df(), curve2.as_df()], axis=1) curves_to_plot.columns=["ewmac", "breakout"] print(curves_to_plot.corr()) curves_to_plot.cumsum().plot() show() GAT
I'll discuss most of them at some point. One or two are copies of stuff I developed whilst at my former employer. If I put those in the public domain I'll get sued. I'm happy to include things that are around 90% correlated or less. There is almost no penalty in having additional rules as a fully automated trader. GAT