[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: MaxRisk (was Optimizing Max Open Positions)



PureBytes Links

Trading Reference Links

Practitioners of "financial engineering" methods measure risks, using 
the tool of past history as an indication of the future.  They call 
themselves scientists but do not show an inch of critical thinking, 
or self-doubt, which is the hallmark of science.  The mere 
possibility of the distributions not being stationary makes the 
entire concept seem like a costly (perhaps very costly) mistake.  
This demarcation between science and charlatanism is apparent when we 
examine financial engineering and the applications of modern 
financial theory to risk management.

If I know that there may be rare events in history, then I cannot 
infer anything about the properties of the data, quality of the 
trader or the strategy under consideration, solely from past returns.

If I do believe that there cannot be rare events, then I can probably 
start making a judgement on the asset, the trader, or the strategy.  
I can then listen to the ever so friendly econometrician who 
volunteer theories about managing risk.

Accordingly, we need to accept this assymetry in knowledge:  if a 
rare event can bankrupt my business, then I can accept its quality.

But there are situations in which statistics and econometrics can be 
useful.  I wouldn't bet my life on it.  Like Pascal and Karl Popper, 
If the science of statistics can benefit me in anything, I will use 
it.  If it poses a threat, then I will not.  Accordingly, I will use 
statistics and inductive methods to make bets, but I will not use 
them to manage my risks.  All the surviving traders seem to have done 
the same.  They trade on ideas bases on some observation (that 
includes past history), but they manage their risks with the stop 
loss.  This is exactly opposite of what many financial institutions 
seem to do...

rgs, Pal

rgds, Pal
--- In amibroker@xxxxxxxxxxxxxxx, "palsanand" <palsanand@xxxx> wrote:
> More code:
> 
> MS1=100;MS2=300;
> //MinShares = Optimize("MinShares",100,MS1,MS2,100);
> MinShares = Param("MinShares",100,MS1,MS2,100);
> SetOption("MinShares", MinShares);
> //MarginDeposit = 100;
> eq = Foreign("~~~EQUITY", "C");
> cash = Foreign("~~~EQUITY", "L");
> //dr = eq - Highest(eq);
> e_max = Highest(eq); // peak equity so far
> MDD = Highest(e_max - eq); //max drawdown so far
> LB1=5;LB2=16;
> MaxOpenPos= LB = Optimize("MaxOpenPos",6,LB1,LB2,1);
> //MaxOpenPos= LB = Param("MaxOpenPos",6,LB1,LB2,1);
> SetOption("MaxOpenPositions", MaxOpenPos );
> //X = Optimize("X",100,50,100,10);
> X = Param("X",100,50,100,10);
> PositionSize = -X/MaxOpenPos;
> MaxRisk = PositionSize * (-MDD)/eq;
> 
> rgds, Pal
> --- In amibroker@xxxxxxxxxxxxxxx, "palsanand" <palsanand@xxxx> 
wrote:
> > Came out with the following solution:
> > 
> > equity_lookback_bars = 0;
> > equity_lookback_smoothing = 30;
> > equity_drawdown_discount_pct = 90;  //not sure what this should be
> > function PerformanceScore() { // returns score for current trade 
> > signals;
> > //Highest score is used
> > e = Equity(0, 0);
> > if(equity_lookback_bars == 0) { // test all performance to date
> > e_ref = e[0];
> > } else { // test performance back spec'd number of bars
> > e_ref = Ref(e, -equity_lookback_bars);
> > }
> > perf_score = (e - e_ref) / e_ref; // growth over lookback period
> > perf_score = MA(perf_score, equity_lookback_smoothing) * 100; // 
> > smoothed pct
> > perf_score = perf_score * 100 / IIf(equity_lookback_bars == 0, Cum
> (1),
> > equity_lookback_bars); // per 100 bars
> > e_max = Highest(e); // peak equity so far
> > mdd = Highest(e_max - e); // max drawdown so far
> > mdd_fraction = Highest(mdd / e_max); // fraction max drawdown is 
of 
> > peak equity
> > perf_score = perf_score - (perf_score * mdd_fraction *
> > (equity_drawdown_discount_pct/100)); // reduce score by mdd 
> fraction 
> > scaled
> > //by drawdown discount
> > return perf_score;
> > }
> > PositionScore = PerformanceScore();
> > 
> > Any Feedback appreciated.
> > 
> > rgds, Pal
> > --- In amibroker@xxxxxxxxxxxxxxx, "palsanand" <palsanand@xxxx> 
> wrote:
> > > Previously I forgot that I read the following in the ReadMe 
file 
> of 
> > > the latest beta of AB:
> > > 
> > > in regular backtest mode now it is possible to specify the 
score 
> of 
> > > the symbol (on bar-by-bar basis) via PositionScore variable. In 
> > this 
> > > mode the score is used only at trade ENTRY to decide which 
> > securities 
> > > should be traded in case when there are more simultaneous entry 
> > > signals than max. allowable positions or available funds. 
> AmiBroker 
> > > will 'prefer' securities with higher absolute value of the 
score. 
> > If 
> > > PositionScore is not used then it is assumed to be 1 for all 
> > > securities.
> > > 
> > > You can use new PositionScore variable to decide which trades 
> > should 
> > > be entered if there are more entry signals on different 
> securities 
> > > than maximum allowable number of open positions or available 
> funds. 
> > > In such case AmiBroker will use the absolute value of 
> PositionScore 
> > > variable to decide which trades are preferred. See the code 
> below. 
> > It 
> > > implements simple MA crossover system, but with additional 
> flavour 
> > of 
> > > preferring entering trades on symbols that have low RSI value. 
If 
> > > more buy signals occur than available cash/max. positions then 
> the 
> > > stock with lower RSI will be preferred. You can watch selection 
> > > process if you backtest with "Detailed log" report mode turned 
on.
> > > 
> > > // now additional score 
> > > // that is used to rank equities 
> > > // when there are more ENTRY signals that available
> > > // positions/cash
> > > PositionScore = 100-RSI(); // prefer stocks that have low RSI;
> > > 
> > > This would now solve the problem of issue selection.  Now I 
have 
> 7 
> > > Max open positions, but naturally some "underlying instrument" 
> > issues 
> > > are different than before I used PositionScore, depending on 
the 
> > > PositionScore, which I hope AB uses to select low RSI for Long 
> and 
> > > high RSI for Short positions which is the rule I use for 
> > reversals.  
> > > If not then I would not use PositionScore and let it to default 
> to 
> > > the value of 1.  RSI doesn't matter for some trades like 
> > continuation 
> > > signals.    How would I handle these 2 trading situations?  
Could 
> > > somebody clarify what AB does here with this PositionScore?
> > > 
> > > rgds, Pal
> > > --- In amibroker@xxxxxxxxxxxxxxx, "palsanand" <palsanand@xxxx> 
> > wrote:
> > > > I modified the AA code as follows:
> > > > 
> > > > in_trade_long = Flip( Buy, Sell );
> > > > in_trade_short = Flip( Short, Cover);
> > > > 
> > > > AddToComposite( in_trade_long, "~OpenLongPosCount", "V" );
> > > > AddToComposite( in_trade_short, "~OpenShortPosCount", "V" );
> > > > 
> > > > /* We use "~OpenPosLongCount" and "~OpenPosShortCount" 
> artificial 
> > > > ticker to store the results. Again we should run just Scan of 
> the 
> > > > formula AND these tickers would become available. 
> > > > 
> > > > Use */ 
> > > > 
> > > > Graph1 = Foreign( "~OpenLongPosCount", "V"); 
> > > > Graph2 = Foreign( "~OpenShortPosCount", "V"); 
> > > > 
> > > > /* in Indicator Builder after running the back-test to see 
the 
> > > chart 
> > > > of the number of Open long and short positions of your 
system. 
> */
> > > > 
> > > > Modified Indicator code as follows:
> > > > 
> > > > Graph1 = Foreign( "~OpenLongPosCount", "V"); 
> > > > Plot(Graph1,"OpenLongPosCount",1,style=1,0,20);
> > > > Graph2 = Foreign( "~OpenShortPosCount", "V"); 
> > > > Plot(Graph2,"OpenShortPosCount",2,style=1,0,20);
> > > > Plot(7,"My line",colorRed);
> > > > 
> > > > Now, I show both open long (12) and short positions (5), but 
> > since 
> > > > the MaxOpenPos has been optimized/set to 7, the trades list 
has 
> > > only 
> > > > 7 open positions ( 5 long and 2 short).  I have no idea yet 
> what 
> > > the 
> > > > issue selection criteria is for long and short trades, 
though.  
> > Can 
> > > > anybody take a guess?
> > > > 
> > > > rgds, Pal
> > > > --- In amibroker@xxxxxxxxxxxxxxx, "palsanand" 
<palsanand@xxxx> 
> > > wrote:
> > > > > I came out with the following results adding more code:
> > > > > 
> > > > > eq = Foreign("~~~EQUITY", "C");
> > > > > cash = Foreign("~~~EQUITY", "L");
> > > > > dr = eq - Highest(eq);
> > > > > MR1 = 0.1;  
> > > > > MR2 = 0.5;
> > > > > MaxRisk = Optimize("MaxRisk",0.10,MR1,MR2,0.05);
> > > > > Pd1=3;Pd2=12;LB1=1;LB2=17;
> > > > > MaxOpenPos= LB = Optimize("MaxOpenPos",7,LB1,LB2,1);
> > > > > //MaxOpenPos= LB = Param("MaxOpenPos",7,LB1,LB2,1);
> > > > > GPS = (MaxRisk * eq)/dr;
> > > > > PositionSize = GPS = -100/MaxOpenPos;
> > > > > MaxOpenPos = 
> > > > > SetOption("MaxOpenPositions", MaxOpenPos );
> > > > > Period = Pd = Param("Period", 3, Pd1, Pd2, 1 );
> > > > > //Period = Pd = Optimize("Period", 3, Pd1, Pd2, 1 );
> > > > > OptStart = (Pd = 3) AND (LB = 1) AND (MR1 = 0.1);
> > > > > 
> > > > > It was interesting to find that there were a range of 
values 
> > for 
> > > > > MaxRisk and the same MaxOpenPos for the highest CAR/MDD and 
> > UPI, 
> > > > but 
> > > > > all the values in the optimization were the same for this 
> > range.  
> > > > > Since, I want to minimize the Max% of the closed equity to 
> > > > > risk/trade, I guess I need to use the minimum in this 
range, 
> > > which 
> > > > is 
> > > > > 0.10 (10% Max risked/trade).  
> > > > > 
> > > > > Also, concidentally or optimally, the MaxOpenPos came out 
to 
> be 
> > > 7, 
> > > > > which is also the same value I originally chose as part of 
> the 
> > > > trader-
> > > > > defined criteria.  Still the discrepancy with the 
MaxOpenPos 
> > and 
> > > > the 
> > > > > Composite ~OpenPosCount through which I got 12 positions 
open 
> > > now, 
> > > > > (where I plot it in a indicator window), still exists.
> > > > > 
> > > > > rgds, Pal
> > > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > --- In amibroker@xxxxxxxxxxxxxxx, "palsanand" 
> <palsanand@xxxx> 
> > > > wrote:
> > > > > > Thanks.  I optimized the Max Open Positions to 8.
> > > > > > 
> > > > > > Maxpos=Optimize("maxpos",8,1,20,1);
> > > > > > PositionSize = -100/Maxpos;
> > > > > > SetOption("MaxOpenPositions", Maxpos );
> > > > > > 
> > > > > > I am getting 8 positions open in the Results window:
> > > > > > 
> > > > > > 12/4/03						
> 	
> > > > > 	
> > > > > > 			
> > > > > > 	Entry signals(score):GU-9967=short(-1)	 UC-9967=buy
> > (1)	 
> > > > > > 							
> > 	
> > > > > > 	Exit signals:GU-9967=sell	 UC-9967=cover	 
> > 	
> > > > > > 							
> > > > > > 	Enter Short	 GU-9967	 Price: 1.7278	 
> > Shares: 250
> > > > > > 	 Commission: 0	 Rank: -1	 Equity 3712.71	
> > 	
> > > > > > 		
> > > > > > 	Enter Long	 UC-9967	 Price: 1.3007	 
> > Shares: 350
> > > > > > 	 Commission: 0	 Rank: 1	 Equity 3712.71	
> > 	
> > > > > > 		
> > > > > > 	8 Open Positions:$C-9967	 $E-9967	 AU-
> > 9967
> > > > > > 	 AC-9967	 E$-9967	 EA-9967	 GU-
> > 9967
> > > > > > 	 UC-9967	 Equity: 3718.23	 Cash: 317.445
> > 	
> > > > > > 
> > > > > > But I find a discrepancy with the Open position count 
using 
> > the 
> > > > > > following code, where I got 11 positions open, when I 
plot 
> it 
> > > in 
> > > > a 
> > > > > > indicator window using 
> > > > > > 
> > > > > > Graph1 = Foreign( "~OpenPosCount", "V"); 
> > > > > > Plot(Graph1,"OpenPosCount",1,style=1,0,100);
> > > > > > 
> > > > > > The following is in Automatic Analysis:
> > > > > > 
> > > > > > /* the following line uses Flip function to get "1" after 
> the 
> > > buy 
> > > > > > signal and reset it back to "0" after sell appears. */
> > > > > > 
> > > > > > in_trade = Flip( Buy, Sell );
> > > > > > 
> > > > > > AddToComposite( in_trade, "~OpenPosCount", "V" );
> > > > > > 
> > > > > > /* We use "~OpenPosCount" artificial ticker to store the 
> > > results. 
> > > > > > Again we should run just Scan of the formula AND 
> > > > > the "~OpenPosCount" 
> > > > > > ticker would become available. 
> > > > > > 
> > > > > > Use */ 
> > > > > > 
> > > > > > Graph0 = Foreign( "~OpenPosCount", "V"); 
> > > > > > 
> > > > > > /* in Indicator Builder after running the back-test to 
see 
> > the 
> > > > > chart 
> > > > > > of the number of Open positions of your system. */
> > > > > > 
> > > > > > Can somebody tell me why this discrepancy occurs.  TIA.
> > > > > > 
> > > > > > rgds, Pal
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > --- In amibroker@xxxxxxxxxxxxxxx, "bvandyke" 
> <bvandyke@xxxx> 
> > > > wrote:
> > > > > > > Pal,
> > > > > > > 
> > > > > > > Try the following example and modify the # of positions 
> as 
> > > > needed:
> > > > > > > 
> > > > > > > Maxpos=Optimize("maxpos",2,1,4,1);
> > > > > > > PositionSize = -100/Maxpos;
> > > > > > > SetOption("MaxOpenPositions", Maxpos );
> > > > > > > 
> > > > > > > Bill
> > > > > > > 
> > > > > > > --- In amibroker@xxxxxxxxxxxxxxx, "palsanand" 
> > > <palsanand@xxxx> 
> > > > > > wrote:
> > > > > > > > Hi All,
> > > > > > > > 
> > > > > > > > Does anybody has the code for Optimizing Max Open 
> > > Positions.  
> > > > I 
> > > > > > > > remember seeing it somewhere in AFL guides.  I can't 
> seem 
> > > to 
> > > > > find 
> > > > > > > it 
> > > > > > > > now or remember how to do it.
> > > > > > > > 
> > > > > > > > TIA
> > > > > > > > 
> > > > > > > > rgds, Pal


------------------------ Yahoo! Groups Sponsor ---------------------~-->
Buy Ink Cartridges or Refill Kits for your HP, Epson, Canon or Lexmark
Printer at MyInks.com. Free s/h on orders $50 or more to the US & Canada.
http://www.c1tracking.com/l.asp?cid=5511
http://us.click.yahoo.com/mOAaAA/3exGAA/qnsNAA/GHeqlB/TM
---------------------------------------------------------------------~->

Send BUG REPORTS to bugs@xxxxxxxxxxxxx
Send SUGGESTIONS to suggest@xxxxxxxxxxxxx
-----------------------------------------
Post AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx 
(Web page: http://groups.yahoo.com/group/amiquote/messages/)
--------------------------------------------
Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.html 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/