we redesigned all our strategies after I read Rob's book (increased diversification, avoid overfit, continuous signals...)
Blimey!
GAT
we redesigned all our strategies after I read Rob's book (increased diversification, avoid overfit, continuous signals...)
I think there's also a problem with mini-crude: it has a good liquidity but not in the Dec contract, all volume is concentrated in the 2 front months. I guess it's still possible to trade it but not with Dec contract.. How critical is avoiding seasonality in this case by trading only December ?That's a good spot, thanks I'd missed that. Guess I'll be taking Copper out of the list of substitutes. For the record the others are:
NYMEX MINY Light Sweet Crude Oil
NYMEX MINY Natural Gas Index
E-Micro Gold
Mini KOSPI200 Index
Micro E-Mini Nasdaq-100 Index
Micro E-Mini S&P 500 Stock Price Index
... which I've doubled checked and all look fine.
(Was a mistake to say performance was good. Dropped over 2% yesterday!)
GAT

And another thingI think there's also a problem with mini-crude: it has a good liquidity but not in the Dec contract, all volume is concentrated in the 2 front months. I guess it's still possible to trade it but not with Dec contract.. How critical is avoiding seasonality in this case by trading only December ?
View attachment 258857
We do trade GAS_US monthly even though it should also probably have seasonality..
Btw, in this file "https://github.com/robcarver17/pysystemtrade/blob/master/sysinit/futures/config/rollconfig.csv" X and V months in the roll and hold parameters are flipped for GAS, does it have any special meaning or it doesn't matter?
View attachment 258858
Also, regarding mini-GAS, not sure if there's enough volume in the second contract if we use front as carry and trade second., e.g. we would probably need to roll into the Jul contract around April 20th to April 27th (when May, which was Carry for Jun expired), and Jul's volume only started reaching 100 contracts on April 26..
Sorry for too many annoying questions![]()

I think there's also a problem with mini-crude: it has a good liquidity but not in the Dec contract, all volume is concentrated in the 2 front months. I guess it's still possible to trade it but not with Dec contract.. How critical is avoiding seasonality in this case by trading only December ?
We do trade GAS_US monthly even though it should also probably have seasonality..
Btw, in this file "https://github.com/robcarver17/pysystemtrade/blob/master/sysinit/futures/config/rollconfig.csv" X and V months in the roll and hold parameters are flipped for GAS, does it have any special meaning or it doesn't matter?
Also, regarding mini-GAS, not sure if there's enough volume in the second contract if we use front as carry and trade second., e.g. we would probably need to roll into the Jul contract around April 20th to April 27th (when May, which was Carry for Jun expired), and Jul's volume only started reaching 100 contracts on April 26..
And another thing
MINI-KOSPI seems to be monthly, not quaterly:
http://global.krx.co.kr/contents/GLB/02/0201/0201040204/GLB0201040204.jsp
"The quaterly month : The settlement price of KOSPI200 futures
The non-quaterly month : The current settlement price methodology is applied"
I was just looking at the volume of the HMUZ months and there's a volume gap, i.e. if I tried to roll from Mar to Jun I would have to do it before Mar 11th (expiry day) and the Jun contract has almost zero volume around Mar 11, so people are clearly rolling into April and May first..
Sorry for too many annoying questions![]()
What is IB's symbol code for this KOSPI-mini? I am using K200 as KOSPI and have daily OHLC price files since about middle of 2018.Action (for now): override positions on KOSPI-mini
Action: Get prices from scratch for KOSPI-mini
What is IB's symbol code for this KOSPI-mini? I am using K200 as KOSPI and have daily OHLC price files since about middle of 2018.
I only know of K200 being a quarterly contract using March, June, September and December. I am not aware of any other expiry dates. IB only shows me these when I use reqContractDetails().It's K200M. If you have monthly rolled K200 prices though that would be perfect as well.
No problem! In fact I should really have put these changes up on here before implementation as a sense check. Stupid to waste the free resource of people looking at your stuff for you.
GAT
Onboarding new instruments is very annoying and it's always good to have multiple eyeballs on the details., and I'm naturally encountering these issues as I'm trying to onboard these contracts into my system, especially because I have automatic rolls I'm forced to check all these things when I generate new contracts and roll-schedules..Yeah, I think the full KOSPI has only quaterly contracts (http://global.krx.co.kr/contents/GLB/02/0201/0201040201/GLB0201040201.jsp) so no way to use full KOSPI prices for all monthly contracts of mini-KOSPI..I only know of K200 being a quarterly contract using March, June, September and December. I am not aware of any other expiry dates.
View attachment 258867
Micro WTI futures are coming soon. If it's like the other micros, it should have good liquidity, but only in the front month. https://www.cmegroup.com/media-room...e_group_to_launchmicrowtifuturesonjuly12.htmlI think there's also a problem with mini-crude: it has a good liquidity but not in the Dec contract, all volume is concentrated in the 2 front months. I guess it's still possible to trade it but not with Dec contract.. How critical is avoiding seasonality in this case by trading only December ?
View attachment 258857
We do trade GAS_US monthly even though it should also probably have seasonality..
Btw, in this file "https://github.com/robcarver17/pysystemtrade/blob/master/sysinit/futures/config/rollconfig.csv" X and V months in the roll and hold parameters are flipped for GAS, does it have any special meaning or it doesn't matter?
View attachment 258858
Also, regarding mini-GAS, not sure if there's enough volume in the second contract if we use front as carry and trade second., e.g. we would probably need to roll into the Jul contract around April 20th to April 27th (when May, which was Carry for Jun expired), and Jul's volume only started reaching 100 contracts on April 26..
Sorry for too many annoying questions![]()
Feels like it's time for a progress report, as it's my birthday and I'm feeling introspective.
Performance has been good; a quick check on the tape reveals my drawdown is down to less than 4% and I'm up more than 10% for the tax year (perhaps 8% for the calendar year because the first two months were down).
pysystemtrade is in a pretty stable condition, with both the production and sim code pretty decently refactored to the point where I'm confident I can keep it well maintained. Today I decided to release 'version 1.0'; about 5.5 years after it's first release - incredible how time flies!
Right now I'm working on adding lots of markets, as per the recent blog post. This is pretty tedious stuff which involves backfilling data from barchart, running a load of scripts, etc etc etc. I have another 75 (!) markets to do in the current batch (markets I can get data for, and which pass my trading filters). Then there another 100 or so markets for the next batch (markets I can get data for, but which don't currently pass my trading filters).
The main constraint is the 100 tickers a day I can download from barchart (eg two instruments with 12 years of quarterly rolls), and the fact I'd kill myself if I spent more than a couple of hours on this a day. I'm probably going to take at least 2 months to get through the curent batch, and another 3 months for the next batch (it could be quicker, as Barchart doesn't always have more than a few years of data, and it's possible there are markets that aren't on barchart at all). I could speed things up by looking at buying the data elsewhere, but the manual process means I actually check everything quite carefully.
The other thing I'm doing, also flagged up in the post, is to substitute several of my existing markets for the relevant micro or mini contract. This is slightly easier, but you just need to be a bit careful. First, I make sure I close my positions in the relevant contracts by setting my trade control to 'reduce only'. I now have to wait for all the positions to be closed. If it gets close to a roll, and they aren't closed, I'll have to close them manually.
Then once I have no active positions in the relevant instrument, I change the IB and instrument configuration so that it is using the new ticker and multiplier. I then get the prices to pull in manually and make sure there is no jump. This is also a good time to do a futures roll if one is due. Finally I turn off the 'reduce only' flag and check that the new positions are opened up okay. Obviously this means historic positions can't be compared, but that doesn't bother me.
Running alongside that I need to do some profiling and optimisation work (just got a copy of https://www.oreilly.com/library/view/high-performance-python/9781492055013/). With around 230 instruments pysystemtrade will be very slow indeed even on my 32GB/i7 trading servers, if it runs at all! Even so, I'd probably never run a fully blown backtest (up to 35 years of daily data plus 7 years of hourly data, 230 instruments, rolling optimisations...). Instead, I'll do things like run single instrument systems with one period optimisation to get the forecast weights and FDM; then with those fixed do a single period optimisation to get the instrument weights and IDM. In production I'll only pull in say the last two years of data for the nightly backtest.
Once I've sped things up a bit, but not neccessarily before I've finished eithier batch one or batch of adding new instruments, I'm going to look into my idea of modifying the system to make better use of limited capital. At the moment I have the very hacky solution I wrote about here. I probably get asked about this more than anything, and I'm as excited as anyone to see if my idea works, but the profiling has to come first!
Other projects to follow that are, in no particular order:
- I have a bunch of other changes and potential trading signals I want to look at putting into the core model. A lot of this is stuff I've blogged about over the last couple of years but not implemented.
- Some completely new systems: fast mean reversion, intermarket RV eg spreads, intramarket RV spreads (calendar spreads).
- The next book...
GAT
MISSING_STR = -1
def list_of_items_separated_by_underscores(this_str, result = ()):
find_underscore = this_str.find("_")
if find_underscore is MISSING_STR:
result_as_list = list(result)
result_as_list.append(this_str)
return result_as_list
partial_str = this_str[:find_underscore]
result = result + tuple([partial_str])
remaining_str = this_str[find_underscore+1:]
return list_of_items_separated_by_underscores(remaining_str, result=result)
date_str_as_list = date_str.split("_")