Thanks for the quick reply. Some questions : a) Any idea if there exists AFL code for GARCH etc. ? b) Do you really think that there is a solution preventing AB or whatever ( Excel etc. ) environment to slow down the PC when doing this kind of calculations for more than 100 items ? I did some testing with your code on iShares ETF's - having a total of 27 ETF's in the WL - but the only real problem I get is the Param Window. When trying to modify the CorrLB value the slider hangs and it rather difficult to make the modification. But when running thru the ETF's with Bar Replay things work fine for me. Fast enough ...
Regards, Ton. ----- Original Message ----- From: vlanschot To: [email protected] Sent: Tuesday, May 29, 2007 1:39 PM Subject: [amibroker] Re: Corr Matrix via Gfx functions Ton, Pleasure. For all clarity, I'm using matrices mostly from a portfolio (risk) management pov, with var-covar as starting point. Iow, I hardly look at correlations in isolation since they don't tell anything about causality (regressions, for example, are better suited for that.) Re convergence of global correlations, there are all kinds of economic/fundamental explanations for that, e.g. compression in multiples. Re randomness, one gets indeed quickly into the broader debate of normal distribution, law of large numbers, fractals, and black swans. Clearly one's time frame is relevant, e.g. lower frequency returns have higher autocorrelations. One's choice of asset is important, e.g. volatility is clustering, as Engel (GARCH) has shown. Etc, etc. To a certain extent, this is indeed "academic", since in the final analysis (as Grinold & Kahn argued), unless you're an indexer: active management/trading = forecasting = assuming non-randomness (with = you can read "implies"). Finally, as you may have noticed with this matrix-application, AB slows down once the number of symbols becomes large, say > 100. I've created similar functions for Explore and CBT by using VarSet to calculate each "cell-array". In general, AB slows down a lot once you start calculations on a cross-sectional basis. This is why I've asked Thomasz to think about creating native matrix-afl functions. Vote for it in the feedback centre. PS --- In [email protected], "Ton Sieverding" <[EMAIL PROTECTED]> wrote: > > Really great stuff and thanks. Did you walk thru the iShares country ETF's with the Bar Replay Tool already ? No better way to show how the world is becoming more and more correlated ... BTW did you ever try to create an AFL showing the degree of randomness for a stock ? My problem here is the logical part of the story. How to calculate the degree of randomness. I want to be able to separate random from 'non' random time series and got stuck in the scientific background ... > > Regards and thanks again, Ton. > > > ----- Original Message ----- > From: vlanschot > To: [email protected] > Sent: Monday, May 28, 2007 1:46 PM > Subject: [amibroker] Corr Matrix via Gfx functions > > > Thought I'd share the following code. > > PS > > //Simple application of the new Gfx functions, basically calculating > //the correlation matrix of any WL of choice. You can easily adjust > //this code to move to Var-Covar matrix, etc. > // PS 28/05/07 > > GfxSetOverlayMode(2); // Show Only Matrix > > function NrSecs(ListType,ListNr) > { > global NrPosPrices; > > if(ListType==1) ExtrList = CategoryGetSymbols > (categoryGroup,ListNr); > else if(ListType==2)ExtrList = CategoryGetSymbols > (categoryWatchlist,ListNr); > else if(ListType==3)ExtrList = CategoryGetSymbols > (categoryIndustry,ListNr); > > NrSecurs=0; > NrPosPrices=0; > > for( n=0; (Ticker=StrExtract( ExtrList, n))!= ""; n++) > { > NrSecurs=NrSecurs+1; > SetForeign(Ticker); > Prijs=C; > RestorePriceArrays(); > NrPosPrices=NrPosPrices+IIf(Prijs!=Null AND > Prijs>0,1,0); > } > return NrSecurs; > } > > function PrintTxtInCell( Str, row, Col, CellWidth, CellHeight, > HorzAdj, VertAdj, Formaat ) > { > GfxDrawText( Str, Col * CellWidth + HorzAdj, row * CellHeight + > VertAdj, (Col + 1 ) * CellWidth, (row + 1 ) * CellHeight, Formaat); > } > > function PrintInCell( val, row, Col, CellWidth, CellHeight, HorzAdj, > VertAdj ) > { > GfxDrawText( NumToStr(val), Col * CellWidth + HorzAdj, row * > CellHeight + VertAdj, (Col + 1 ) * CellWidth, (row + 1 ) * > CellHeight, 1|32|4); > } > > //CH = Param("CellH",20,10,100,5); > //CW = Param("CellW",100,10,300,5); > HA=0; > VA=0; > > String = "" ; > for ( x = 0 ; x < 200 ; x++ ) > { > WList = CategoryGetName( categoryWatchlist, x ); > if (WList != "" ) > { > String = String + WList +"," ; > // Creates a list of WatchLists, NOT symbols !!! > } > } > WatchList = ParamList ( "Watch List", String ); > > WLnr=CategoryFind(WatchList,categoryWatchlist); > WLSymbols = CategoryGetSymbols(categoryWatchlist,WLnr); > > NrSymbs = NrSecs(2,WLNr); > > CW= Status("pxwidth")/(NrSymbs+1);// In order to allow Rowheadings > CH = Status("pxheight")/(NrSymbs+1);//Colheadings > > //GfxSetTextAlign(6 | 24); > > RetLB = Param("RetLB",1,1,100); > CorrLB = Param("CorrLB",30,5,256); > > Start = BarCount-RetLB; > > ActBar = Min(BarCount-1,LastValue(SelectedValue(BarIndex()))); > ActD = LastValue(SelectedValue(DateTime())); > > GfxSelectFont( "MS Serif", CH/4,800); > PrintTxtInCell( "CorrM @:\n"+NumToStr(ActD,formatDateTime), 0, 0,CW, > CH, HA, VA, 1); > > for ( x = 0 ; (Ticker = StrExtract ( WLSymbols, x ))!="" ; x++ ) > { > SetForeign(Ticker); > RetTick = ROC(C,RetLB); > FN = FullName(); > RestorePriceArrays(); > > GfxSelectFont( "MS Serif", CH/4,800); > PrintTxtInCell( Ticker, 0, x+1 ,CW, CH, HA, VA,1|32|4 ); > > GfxSelectPen( colorBlue ); > > for( i = 0; (Ticker2 = StrExtract ( WLSymbols, i))!="" ; i++ ) > { > SetForeign(Ticker2); > RetTick2 = ROC(C,RetLB); > FN2 = FullName(); > RestorePriceArrays(); > > if (Ticker2 == Ticker) Corr=1; > else Corr = Correlation(RetTick, RetTick2, CorrLB); > > GfxSelectFont( "MS Serif", CH/4,800); > PrintTxtInCell( Ticker2, i+1, 0, CW, CH, HA, > VA,1|32|4); > GfxSelectFont( "MS Serif", CH/4); > Kleur = IIf(Corr[ActBar]>=0, colorGreen,colorRed); > GfxSetTextColor(Kleur); > PrintInCell( Corr[ ActBar ], i+1, x+1, CW, CH, HA, > VA); > //PrintInCell( Corr[ ActBar ] , i+1, x+1); > GfxSetTextColor(colorBlack); > > GfxMoveTo( 0, (i+1) * CH); > GfxLineTo( (x+2) * CW, (i+1) * CH );// Columns > } > > GfxMoveTo( 0, (x+1)*CH); // Move to end of last column > //GfxLineTo( 6 * CW, i * CH ); > } > > for( Col = 1; Col < NrSymbs+2; Col++ ) > { > GfxMoveTo( Col * CW, 0); > GfxLineTo( Col * CW, (NrSymbs+1) * CH ); > } > > > Title=""; >
