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

[amibroker] Re: How to save Metrics in Composites for Individual BTs



PureBytes Links

Trading Reference Links

You dont need to call a separate backtest for every bar, you only 
need to call backtest only with the custom backtester code. For the 
matrix concerned, all you need is to understand the relationship 
between its current value and its value "lookback" bars ago, you can 
then reconstruct the "lookback" matrix the way you want.
take UI for example,
 UI[Br] = SQRT[Sum(DR)from bars 1 to Br)/Br
and UI[Br - Lb} = SQRT(sum(Dr) from bars 1 to [Br - lb])/Br;

So function UIwithLookBack(Lb)
{
    Pr = barindex() * Foreign("~UI.....", "C");
    result = Pr ^ 2 - ref(Pr, -lb)^2;
    result = sqrt(result);
    result = result /lb;
    return result;
}
All you need to do is to understand the relationship between 
different bars of the matrix that you're interested. It is not 
particularly hard.
/Paul.

--- In amibroker@xxxxxxxxxxxxxxx, "Al Venosa`" <avcinci@xxx> wrote:
>
> Dear TJ and Fred:
> 
> Thank you for these suggestions. However, what I am asking for is a 
simple
> AFL function in which we can specify the lookback period for the 
metric in
> question, nothing more. To observe the difference, you can simply 
substitute
> an MA() for the required function, as shown below. When you view 
the graph,
> you will see, I think, what I am talking about.
> 
> Plot(C,"",1,128);
> Plot(MA(C,50),"FixedLookBack",colorRed,1); // the requested solution
> Plot(MA(C,BarIndex()),"ExistingNow",colorBlue,1); // TJ's and Fred's
> solution.
> 
> I believe what TJ has suggested, if I am interpreting it correctly, 
is that
> I would be running a backtest for each bar in a loop, which would 
be complex
> and very slow. Maybe I'm asking the same thing. If so, tell me, and 
I'll
> desist. An alternative solution is to use the Walk Forward 
Individual
> Backtester to implement a system that uses performance metrics as 
position
> score.
> 
> BTW, Fred, are you willing to share the complete working code for 
your
> 2-line export?
> 
> Thank you.
> 
> Al V.
> 
> 
> On 7/28/08, Tomasz Janeczko <groups@xxx> wrote:
> >
> >    Hello,
> >
> > It is doable with custom backtester and not so complicated.
> >
> > As described in detail here:
> > http://www.amibroker.com/guide/a_custommetrics.html
> >
> > You have direct access to ANY backtest performance metric using
> > GetPerformanceStats() function of backtester object.
> >
> > There is no obstacle in calling it every bar and storing the 
result in the
> > array if you wish.
> >
> > Let say you want UPI as array.
> >
> >
> > // your trading system here
> > Buy = ...
> > Sell = ...
> >
> > SetCustomBacktestProc("");
> >
> > /* Now custom-backtest procedure follows */
> >
> > *if*( Status("action") == *actionPortfolio* )
> > {
> >     UPI = 0;
> >     bo = GetBacktesterObject();
> >
> >     bo.PreProcess();
> >
> >     *for*( bar = 0; bar < *BarCount*; bar++ )
> >     {
> >       bo.ProcessTradeSignals( bar );
> >
> >       st = bo.GetPerformanceStats(0); // get stats for all trades
> >
> >       UPI[ bar ] = st.GetValue("UlcerPerformanceIndex");
> >    }
> >
> >     bo.PostProcess();
> >
> >     AddToComposite( UPI, "~~~UPI", "X", *atcFlagDefaults* | *
> > atcFlagEnableInPortfolio* );
> > }
> >
> >
> > Now ~~~UPI ticker will contain bar-by-bar values of Ulcer 
Performance
> > Index.
> >
> > As for "specifying lookback period" it is doable by creating Xth 
composites
> > (and X backtests) each containing values for specified
> > lookback period.
> >
> > As for Equity() - this is SINGLE security (OLD) backtest. It has 
no
> > comparision to portfolio level backtest that
> > must go through entire portfolio. The complexity of portfolio 
backtest is
> > Nth times the single security backtest
> > where N is number of symbols in portfolio. Therefore it is not 
feasible to
> > be calculated on-the-fly in real time like
> > single-security backtest (i.e. Equity()).
> >
> >
> > Best regards,
> > Tomasz Janeczko
> > amibroker.com
> >
> > ----- Original Message -----
> > *From:* Al Venosa` <avcinci@xxx>
> > *To:* amibroker@xxxxxxxxxxxxxxx
> > *Sent:* Monday, July 28, 2008 1:02 AM
> > *Subject:* Re: [amibroker] Re: How to save Metrics in Composites 
for
> > Individual BTs
> >
> > Thanks, Fred, but I haven't a clue how to do OLE/Automation, and 
I wonder
> > how many AB users out there really do. That's why I was calling 
for a
> > simple, non-painful, easy-to-use AFL function that would do this 
for the
> > non-techie/programmer, and if it existed, AB would be the only 
trading
> > software out there that would be able to do this. I bet It would 
be a profit
> > bonanza for TJ.
> >
> > Al V.
> >
> > On 7/27/08, Fred Tonetti <ftonetti@xxx> wrote:
> >>
> >>    I agree that this would be nice to have as directly as you 
have laid
> >> out ?
> >>
> >>
> >>
> >> However, while somewhat painful, one can with Equity() and a 
list of
> >> trades calculate all the performance metrics as of any given bar 
or if you
> >> prefer as arrays of values ?
> >>
> >>
> >>
> >> This could be fully automated with OLE/Automation
> >>
> >>
> >>  ------------------------------
> >>
> >> *From:* amibroker@xxxxxxxxxxxxxxx 
[mailto:amibroker@xxxxxxxxxxxxxxx] *On
> >> Behalf Of *Al Venosa
> >> *Sent:* Sunday, July 27, 2008 11:29 AM
> >> *To:* amibroker@xxxxxxxxxxxxxxx
> >> *Subject:* [amibroker] Re: How to save Metrics in Composites for
> >> Individual BTs
> >>
> >>
> >>
> >> Having read this interesting thread begun last week, I'd like to
> >> continue it with a follow-on question/comment that I think, if 
TJ were
> >> to implement it, would make Amibroker infinitely more useful to 
the
> >> actual trader. It would be awesome if we could have simple-to-
use AFL
> >> functions that read AFL backtest metrics directly. Adding a 
lookback
> >> period would make them immensely more useful as indicators. What 
I am
> >> suggesting is to have a function like:
> >>
> >> getEquityMetric ( MetricName,LookBackPeriod);
> >>
> >> The example code provided by TJ gives us only the cumulative 
value of
> >> each metric. What I'm suggesting is to go beyond this one 
cumulative
> >> output number and create metric arrays with a specified lookback
> >> period. Then, when we plot these metrics in an indicator, we can
> >> visually look for correlations with price charts. For example, 
one
> >> could plot winning trades/month and see if they change with 
trend. Or
> >> one could look at AverageWin or UPI and see how that changes with
> >> trend. These are all correlations that are best analyzed 
visually (in
> >> an Indicator) but can ONLY be analyzed if we have access to these
> >> metrics for variable lookback periods.
> >>
> >> Another use for these functions would be as a positionscore in a
> >> trading system. What better way is there to select 
tickers/systems to
> >> trade than the actual performance of those tickers or systems? 
The
> >> procedure may require a preliminary scan/exploration to create 
metric-
> >> composites that can be read by the trading system and used as a
> >> positionscore. Critical here is that the metric can be read for 
any
> >> specified lookback period, i.e. 10 bars, 100 bars, etc. So the
> >> function must have a period argument, which is the most important
> >> factor. We already have equity(). Why not expand this with the 
other
> >> backtest metrics?
> >>
> >> Undoubtedly, all this can be implemented using the custom 
backtester,
> >> but this solution probably excludes >95% of all AmiBroker users.
> >>
> >> TJ, would this be possible to implement?
> >>
> >> Al Venosa
> >>
> >> --- In amibroker@xxxxxxxxxxxxxxx <amibroker%
40yahoogroups.com>, "Herman"
> >> <psytek@> wrote:
> >> >
> >> > Thank you TJ :-) you saved the day once more !
> >> >
> >> > Great stuff.
> >> >
> >> > If someone is wondering why I wanted this program... You can 
design
> >> trading
> >> > systems and use performance metric arrays as powerful 
Indicators. It
> >> is
> >> > somewhat similar to trading the equity curve. Price arrays can 
have
> >> > qualities that can make your trading systems fail but that are
> >> undetectable
> >> > with traditional indicators.
> >> >
> >> > However, you can design small trading systems that target 
specific
> >> price
> >> > characteristics, like patterns, trends, volatility, cycles, 
etc.
> >> Using the
> >> > code below gives you statistical information about these
> >> characteristics in
> >> > a form that can be plotted, and be used in other trading 
systems.
> >> >
> >> > Thanks everyone for your help!
> >> > have a great trading day!
> >> > herman
> >> >
> >> > // Demo trading system
> >> > Short = Cover = 0;
> >> > Buy = Cross( MACD(), Signal() );
> >> > Sell = Cross( Signal(), MACD() );
> >> > // Using the CBT to retrieve/save metrics
> >> > if( Status("action") == actionBacktest ) StaticVarSetText
( "Symbol",
> >> > Name() );
> >> > SetOption( "UseCustomBacktestProc", True );
> >> > if ( Status( "action" ) == actionPortfolio )
> >> > {
> >> > bo = GetBacktesterObject();
> >> > bo.PreProcess();
> >> > MyHistStat1 = Null;
> >> > for ( bar = 0; bar < BarCount; bar++ )
> >> > {
> >> > bo.ProcessTradeSignals( bar );
> >> > stats = bo.GetPerformanceStats( 0 );
> >> > MyHistStat1[ bar ] = stats.GetValue( "UlcerIndex" ); // any 
metric
> >> can be
> >> > retrieved
> >> > }
> >> > bo.PostProcess();
> >> > AddToComposite( MyHistStat1, "~~~UI_" + StaticVarGetText
> >> ( "Symbol" ), "X",
> >> > atcFlagEnableInPortfolio | atcFlagDefaults );
> >> > }
> >> > PlotForeign( "~~~UI_"+Name(), "UlcerIndex Historical", 
colorRed,
> >> > styleLine );
> >> >
> >> > -----Original Message-----
> >> > From: amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com> 
[mailto:
> >> amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>]On
> >> Behalf
> >> > Of Tomasz Janeczko
> >> > Sent: July 25, 2008 5:49 AM
> >> > To: amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>
> >> > Subject: [SPAM]Re: [SPAM]Re: [amibroker] How to save Metrics in
> >> Composites
> >> > for Individual BTs
> >> >
> >> >
> >> > Herman,
> >> >
> >> > You forgot the CORRECTION I mentioned:
> >> >
> >> > StaticVarSetText( "Symbol", Name() ); must NOT be called
> >> unconditionally,
> >> > but THIS way:
> >> >
> >> > 
=====================================================================
> >> > if( Status("action") == actionBacktest ) StaticVarSetText
( "Symbol",
> >> > Name() );
> >> > ==============================================================
> >> >
> >> > Best regards,
> >> > Tomasz Janeczko
> >> > amibroker.com
> >> > ----- Original Message -----
> >> > From: Herman
> >> > To: amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>
> >> > Sent: Friday, July 25, 2008 11:36 AM
> >> > Subject: RE: [SPAM]Re: [amibroker] How to save Metrics in 
Composites
> >> for
> >> > Individual BTs
> >> >
> >> >
> >> > Still NO GO.
> >> > I am loading the code in the AA, select a watchlist, run an
> >> Individual
> >> > backtest, and Refresh the WorkSpace. I get the BT report with
> >> individual
> >> > results. I get two Composites in my Composites Group. One is 
named
> >> > ~~~EQUITY, the other ~~~UI_~~~EQUITY. The first makes sense 
but the
> >> second
> >> > indicates that the StaticVar does not return the ticker name.
> >> >
> >> > >> It appears that in this code the function Name() returns
> >> "~~~EQUITY" and
> >> > does not return the name for the ticker being tested, it 
behaves as
> >> if the
> >> > ~~~EQUITY composite is the ticker being tested.
> >> > Can anyone confirm this?
> >> >
> >> > Thanks again!
> >> > Herman
> >> >
> >> > // Demo trading system
> >> > Short = Cover = 0;
> >> > Buy = Cross( MACD(), Signal() );
> >> > Sell = Cross( Signal(), MACD() );
> >> > // Using the CBT to retrieve/save metrics
> >> > StaticVarSetText( "Symbol", Name() );
> >> > SetOption( "UseCustomBacktestProc", True );
> >> > if ( Status( "action" ) == actionPortfolio )
> >> > {
> >> > bo = GetBacktesterObject();
> >> > bo.PreProcess();
> >> > MyHistStat1 = Null;
> >> > for ( bar = 0; bar < BarCount; bar++ )
> >> > {
> >> > bo.ProcessTradeSignals( bar );
> >> > stats = bo.GetPerformanceStats( 0 );
> >> > MyHistStat1[ bar ] = stats.GetValue( "UlcerIndex" ); // any 
metric
> >> can be
> >> > retrieved
> >> > }
> >> > bo.PostProcess();
> >> > AddToComposite( MyHistStat1, "~~~UI_" + StaticVarGetText
> >> ( "Symbol" ), "X",
> >> > atcFlagEnableInPortfolio | atcFlagDefaults );
> >> > }
> >> > PlotForeign( "~~~UI_"+Name(), "UlcerIndex Historical", 
colorRed,
> >> > styleLine );
> >> >
> >> >
> >> >
> >> >
> >> > -----Original Message-----
> >> > From: amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com> 
[mailto:
> >> amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>]On
> >> Behalf
> >> > Of Tomasz Janeczko
> >> > Sent: July 25, 2008 4:08 AM
> >> > To: amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>
> >> > Subject: [SPAM]Re: [amibroker] How to save Metrics in 
Composites for
> >> > Individual BTs
> >> >
> >> >
> >> > It will work OK.
> >> > Individual backtest *is* portfolio backtest but just portfolio
> >> consisting of
> >> > one symbol at a time.
> >> >
> >> > Note that one should select "Individual Backtest" (not "OLD"
> >> backtest) from
> >> > AA->Backtest drop down.
> >> >
> >> > One correction though
> >> > StaticVarSetText( "Symbol", Name() );
> >> >
> >> > should be called only when NOT in portfolio mode
> >> >
> >> > so
> >> >
> >> > if( Status("action") == actionBacktest ) StaticVarSetText
( "Symbol",
> >> > Name() );
> >> >
> >> > // Demo trading system
> >> > Short = Cover = 0;
> >> > Buy = Cross( MACD(), Signal() );
> >> > Sell = Cross( Signal(), MACD() );
> >> >
> >> > // Using the CBT to retrieve/save metrics
> >> > SetOption( "UseCustomBacktestProc", True );
> >> > if ( Status( "action" ) == actionPortfolio )
> >> > {
> >> > bo = GetBacktesterObject();
> >> > bo.PreProcess();
> >> > MyHistStat1 = Null;
> >> > for ( bar = 0; bar < BarCount; bar++ )
> >> > {
> >> > bo.ProcessTradeSignals( bar );
> >> > stats = bo.GetPerformanceStats( 0 );
> >> > MyHistStat1[ bar ] = stats.GetValue( "UlcerIndex" ); // any 
metric
> >> can be
> >> > retrieved
> >> > }
> >> > bo.PostProcess();
> >> > AddToComposite( MyHistStat1, "~~~UI_" + StaticVarGetText
( "Symbol" )
> >> +
> >> > "_HISTORICAL", "X", atcFlagEnableInPortfolio | 
atcFlagDefaults );
> >> > }
> >> >
> >> > ----- Original Message -----
> >> > From: Paul Ho
> >> > To: amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>
> >> > Sent: Friday, July 25, 2008 4:45 AM
> >> > Subject: RE: [amibroker] How to save Metrics in Composites for
> >> Individual
> >> > BTs
> >> >
> >> >
> >> > First of all. You use Status{"action") == actionPortfolio,
> >> individual
> >> > backtest wont go through there.
> >> >
> >> >
> >> >
> >> > From: amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com> 
[mailto:
> >> amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>]
> >> On Behalf
> >> > Of Herman
> >> > Sent: Friday, 25 July 2008 9:31 AM
> >> > To: amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>
> >> > Subject: Re: [amibroker] How to save Metrics in Composites for
> >> Individual
> >> > BTs
> >> >
> >> >
> >> > Thank you Tomasz, but this code still does not work. I changed 
the
> >> StaticVar
> >> > to the Text type.
> >> >
> >> > Can you help some more ... ? or does anyone else see the 
problem?
> >> >
> >> > TIA,
> >> > Herman
> >> >
> >> > StaticVarSetText( "Symbol", Name() );
> >> > // Demo trading system
> >> > Short = Cover = 0;
> >> > Buy = Cross( MACD(), Signal() );
> >> > Sell = Cross( Signal(), MACD() );
> >> >
> >> > // Using the CBT to retrieve/save metrics
> >> > SetOption( "UseCustomBacktestProc", True );
> >> > if ( Status( "action" ) == actionPortfolio )
> >> > {
> >> > bo = GetBacktesterObject();
> >> > bo.PreProcess();
> >> > MyHistStat1 = Null;
> >> > for ( bar = 0; bar < BarCount; bar++ )
> >> > {
> >> > bo.ProcessTradeSignals( bar );
> >> > stats = bo.GetPerformanceStats( 0 );
> >> > MyHistStat1[ bar ] = stats.GetValue( "UlcerIndex" ); // any 
metric
> >> can be
> >> > retrieved
> >> > }
> >> > bo.PostProcess();
> >> > AddToComposite( MyHistStat1, "~~~UI_" + StaticVarGetText
( "Symbol" )
> >> +
> >> > "_HISTORICAL", "X", atcFlagEnableInPortfolio | 
atcFlagDefaults );
> >> > }
> >> > PlotForeign( "~~~UI_HISTORICAL", "UlcerIndex Historical", 
colorRed,
> >> > styleLine );
> >> >
> >> > -----Original Message-----
> >> > From: amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com> 
[mailto:
> >> amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>]On
> >> Behalf
> >> > Of Tomasz Janeczko
> >> > Sent: July 24, 2008 3:00 PM
> >> > To: amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>
> >> > Subject: [SPAM]Re: [amibroker] How to save Metrics in 
Composites for
> >> > Individual BTs
> >> >
> >> >
> >> > The same code. The only distinction is that you need to run
> >> INDIVIDUAL
> >> > backtest
> >> > and use Static variable to save name
> >> >
> >> > StaticVarSet Text ("Symbol", Name() );
> >> > // Demo trading system
> >> > Short = Cover = 0;
> >> > Buy=Cross( MACD(), Signal() );
> >> > Sell=Cross( Signal(), MACD() );
> >> >
> >> > // Using the CBT to retrieve/save metrics
> >> > SetOption("UseCustomBacktestProc", True );
> >> > if( Status("action") == actionPortfolio )
> >> > {
> >> > bo = GetBacktesterObject();
> >> > bo.PreProcess();
> >> > MyHistStat1 = Null;
> >> >
> >> > for(bar=0; bar < BarCount; bar++)
> >> > {
> >> > bo.ProcessTradeSignals( bar );
> >> > stats = bo.GetPerformanceStats( 0 );
> >> > MyHistStat1[ bar ] = stats.GetValue("UlcerIndex"); // any 
metric
> >> can be
> >> > retrieved
> >> > }
> >> >
> >> > bo.PostProcess();
> >> > AddToComposite( MyHistStat1, "~~~UI_" + StaticVarGet Text
> >> ("Symbol") +
> >> > "_HISTORICAL", "X", atcFlagEnableInPortfolio | 
atcFlagDefaults );
> >> > }
> >> >
> >> > PlotForeign("~~~UI_HISTORICAL", "UlcerIndex Historical", 
colorRed,
> >> > styleLine );
> >> >
> >>
> >> ------------------------------
> >> I am using the free version of SPAMfighter for private users.
> >> It has removed 512 spam emails to date.
> >> Paying users do not have this message in their emails.
> >> Try SPAMfighter <http://www.spamfighter.com/len> for free now!
> >>
> >
> >  
> >
>



------------------------------------

Please note that this group is for discussion between users only.

To get support from AmiBroker please send an e-mail directly to 
SUPPORT {at} amibroker.com

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

For other support material please check also:
http://www.amibroker.com/support.html
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

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