Keeping one symbol fixed in a portfolio backtest

I'd like to learn more about the benefits of diversification and portfolios so I've started with a naive system to be long SPY. I'd like to find the most optimal symbols in which to form a diversified portfolio. I'd like to be able to run a large basket of symbols to fill in the remaining, in this case, 30% of the portfolio. However, when I run a standard optimization, it states the test will take 59 days on a core i9. Trust me, I know it's poor and incredibly inefficient programming! Can anyone help me come up with a better way?
Thanks!
Tony


SetForeign("SPY");
openingtrade=c>ma(c,200);
closingtrade=c<ma(c,200);
RestorePriceArrays();

SetOption("MaxOpenPositions",2);

OPT1=70;
OPT2=Optimize("IWM",0,0,30,30);
OPT3=Optimize("QQQ",0,0,30,30);
OPT4=Optimize("IWF",0,0,30,30);
OPT5=Optimize("IWD",0,0,30,30);
OPT6=Optimize("IWO",0,0,30,30);
OPT7=Optimize("IWN",0,0,30,30);
OPT8=Optimize("VNQ",0,0,30,30);
OPT9=Optimize("REM",0,0,30,30);
OPT10=Optimize("TLT",0,0,30,30);
OPT11=Optimize("IEF",0,0,30,30);
OPT12=Optimize("SHY",0,0,30,30);
OPT13=Optimize("LQD",0,0,30,30);
OPT14=Optimize("HYG",0,0,30,30);
OPT15=Optimize("AGG",0,0,30,30);
OPT16=Optimize("TIP",0,0,30,30);
OPT17=Optimize("EFA",0,0,30,30);
OPT18=Optimize("EEM",0,0,30,30);
OPT19=Optimize("SCZ",0,0,30,30);
OPT20=Optimize("EFV",0,0,30,30);
OPT21=Optimize("EWJ",0,0,30,30);
OPT22=Optimize("VGK",0,0,30,30);
OPT23=Optimize("BWX",0,0,30,30);
OPT24=Optimize("EMB",0,0,30,30);
OPT25=Optimize("RWO",0,0,30,30);
OPT26=Optimize("RWX",0,0,30,30);
OPT27=Optimize("GLD",0,0,30,30);
OPT28=Optimize("DBC",0,0,30,30);
OPT29=Optimize("BNDX",30,0,30,30);

Exclude=OPT1+OPT2+OPT3+OPT4+OPT5+OPT6+OPT7+OPT8+OPT9+OPT10+OPT11+OPT12+OPT13+OPT14+OPT15+OPT16+OPT17+OPT18+OPT19+OPT20+OPT21+OPT22+OPT23+OPT24+OPT25+OPT26+OPT27+OPT28+OPT29!=100;

nm = Name();
switch( nm ) {

	case "SPY":
		SetPositionSize( OPT1, spsPercentOfEquity ); 
		break;
	case "IWM":
		SetPositionSize( OPT2, spsPercentOfEquity ); 
		break;
	case "QQQ":
		SetPositionSize( OPT3, spsPercentOfEquity ); 
		break;
	case "IWF":
		SetPositionSize( OPT4, spsPercentOfEquity ); 
		break;
	case "IWD":
		SetPositionSize( OPT5, spsPercentOfEquity ); 
		break;
	case "IWO":
		SetPositionSize( OPT6, spsPercentOfEquity ); 
		break;
	case "IWN":
		SetPositionSize( OPT7, spsPercentOfEquity ); 
		break;
	case "VNQ":
		SetPositionSize( OPT8, spsPercentOfEquity ); 
		break;
	case "REM":
		SetPositionSize( OPT9, spsPercentOfEquity ); 
		break;
	case "TLT":
		SetPositionSize( OPT10, spsPercentOfEquity ); 
		break;
	case "IEF":
		SetPositionSize( OPT11, spsPercentOfEquity ); 
		break;
	case "SHY":
		SetPositionSize( OPT12, spsPercentOfEquity ); 
		break;
	case "LQD":
		SetPositionSize( OPT13, spsPercentOfEquity ); 
		break;
	case "HYG":
		SetPositionSize( OPT14, spsPercentOfEquity ); 
		break;
	case "AGG":
		SetPositionSize( OPT15, spsPercentOfEquity ); 
		break;
	case "TIP":
		SetPositionSize( OPT16, spsPercentOfEquity ); 
		break;
	case "EFA":
		SetPositionSize( OPT17, spsPercentOfEquity ); 
		break;
	case "EEM":
		SetPositionSize( OPT18, spsPercentOfEquity ); 
		break;
	case "SCZ":
		SetPositionSize( OPT19, spsPercentOfEquity ); 
		break;
	case "EFV":
		SetPositionSize( OPT20, spsPercentOfEquity ); 
		break;
	case "EWJ":
		SetPositionSize( OPT21, spsPercentOfEquity ); 
		break;
	case "VGK":
		SetPositionSize( OPT22, spsPercentOfEquity ); 
		break;
	case "BWX":
		SetPositionSize( OPT23, spsPercentOfEquity ); 
		break;
	case "EMB":
		SetPositionSize( OPT24, spsPercentOfEquity ); 
		break;
	case "RWO":
		SetPositionSize( OPT25, spsPercentOfEquity ); 
		break;
	case "RWX":
		SetPositionSize( OPT26, spsPercentOfEquity ); 
		break;
	case "GLD":
		SetPositionSize( OPT27, spsPercentOfEquity ); 
		break;
	case "DBC":
		SetPositionSize( OPT28, spsPercentOfEquity ); 
		break;
	case "BNDX":
		SetPositionSize( OPT29, spsPercentOfEquity ); 
		break;	
}

Buy=openingtrade;
Sell=closingtrade;

To confirm, you just want to test 70% SPY + 30% in one other symbol? For that, you just need a single optimize command that runs from 0 to (# Symbols - 1) to allow you to select one symbol from the list. Something along these lines should work, although the code below is untested. Make sure that SPY is also in your watchlist. Obviously you could replace the 70 and 30 with parameters that could also be optimized.

symList = CategoryGetSymbols(categoryWatchlist, GetOption("FilterIncludeWatchlist"));
symCount = StrCount(symList, ",") + 1;
symIndex = Optimize("Symbol Index", 0, 0, symCount-1, 1);

secondSym =  StrExtract(symList, symIndex);

if (Name() == "SPY")
{
   SetPositionSize(70, spsPercentOfEquity);
}
else if (Name() == secondSym)
{
   SetPositionSize(30, spsPercentOfEquity);
}
6 Likes

Yes that's correct Matt, and I really appreciate your solution! Thank you very much for helping me.
Kindest Regards,
Tony

1 Like

This topic was automatically closed 100 days after the last reply. New replies are no longer allowed.