PureBytes Links
Trading Reference Links
|
Hello Herman,
> Since the Equity curve is based on system performance it makes
>common sense
> that performance metrics will lead on the Equity.
I agree 100% that the collective wisdom in the past has been pretty
dumb on this score - the core metrics are where it all starts and
ends (W/L, PayOff Ratio, ave time in trade). I look at Eq curves as
the dance of the seven veils - "Please - just get it off quickly. I'm
in a hurry".
> Most performance metrics
> can't be extracted from the equity curve; they are lost at that
> summary-stage.
I didn't pay 100% attention to the thread but I thought Freds code,
for extracting PM's from the eq curve, that he posted a while ago was
pretty good.
There is no doubt the programmers can make AB sit up and beg but I
have to admit I am in an arm wrestle with myself when it comes
to 'programming solutions' and losing - my style is at the opposite
end of the spectrum (KISS - focus - trade) focus being the keyword.
IMO the more dials we try to watch the worse we fly - which is why I
prefer core metrics to eq curves.
Eq curves are what we look at when we are swaggering in the bar after
the days work is over.
Cheers,
brian_z
--- In amibroker@xxxxxxxxxxxxxxx, "Herman" <psytek@xxx> wrote:
>
> Hello Fred,
>
> Putting technical problems and limitations aside it is clear to me
that
> having access to period-based performance metrics is critical in
trading.
> Since the Equity curve is based on system performance it makes
common sense
> that performance metrics will lead on the Equity. Most performance
metrics
> can't be extracted from the equity curve; they are lost at that
> summary-stage. For example, DrawDown is the result of advanced
system
> failure; it might very well have been possible to detect the
upcoming
> failure (DD) by looking at some very basic metrics. Simply looking
at the
> number of winning trades or profit/trade, might have alerted us.
Using more
> sophisticated metrics, like a period based UPI Indicator, we might
have seen
> a very clear and gradual system failure. All this is especialy true
for
> faster trading systems where metrics become very smooth indicators.
>
> To look at metrics for the entire duration of the backtest may come
in handy
> during development however during real trading it is useless. It is
simply
> due to a reluctance to break with tradition (a problem for most
traders)
> that we don't have period-based performance indicators today. They
are long
> overdue. Sure, they they are 'doable' in AmiBroker, but how many
users would
> be able to write such code? In my opinion not more that 1%. To
develop
> systems efficiently we need basic afl tools; no one wants to spend
two
> months learning OLE only to find out that it doesn't fill the
requirement or
> is to complicated for the user. Same for the CBT, who wants to
spend two
> months learning it just to test and idea that may or may not work?
Time is
> precious...we want to trade, not become professional programmers.
>
> A few common applications for metric indicators are:
>
> 1) When trading a number of different systems one wants to know
early when a
> system starts to fail. How else can one make a timely switch? Just
like you
> may want to trade funds with a rotational system you want to rotate
the
> trading systems themselves.
> 2) It is very common for trading systems to fade in and out of
performance.
> To detect when a trading system fails and to switch to another
system
> requires, again, monitoring system performance metrics. imo, There
is just
> no other way around it.
> 3) And of course we want to know when a ticker loses its character
and stops
> working. Here again performance metrics might be the best way to
detect
> ticker failure.
>
> A function like getPerformanceMetric ( MetricName, LookBackPeriod)
would
> find wide application. Most people think right away of portfolio
trading
> however performance metrics should be calculated for individual
stocks, they
> will lose their meaning if derived from portfolio results.
>
> I am not saying that it is easy to design such indicators, perhaps
it is
> extremely difficult. But that doesn't remove the need for them.
>
> Just my two cents worth :-)
> Best regards,
> herman
> -----Original Message-----
> From: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx]
On
> Behalf Of Fred Tonetti
> Sent: July 28, 2008 12:44 PM
> To: amibroker@xxxxxxxxxxxxxxx
> Subject: [SPAM]RE: [amibroker] Re: How to save Metrics in
Composites for
> Individual BTs
>
>
> Al,
>
>
>
> What you are looking for in AB is I believe a little more
difficult then
> or at least as time consuming as you think it is .
>
>
>
> Share ? . Code ?
>
>
>
> LOL . I thought I did in that post .
>
>
>
> Ok . Kidding aside . Assuming that
>
>
>
> - AB is running
>
> - AA has the AFL you want to run ( This doesn't mean the
formula
> editor as the FE and AA aren't coupled )
>
> - AA Settings for ApplyTo / Range etc are as you want
then
>
>
>
> This VBS code would run a BackTest and export the Trade List to a
File
>
>
>
> Dim oAB
>
> Dim oAA
>
>
>
> Set oAB = CreateObject("Broker.Application")
>
> Set oAA = oAB.Analysis
>
>
>
> oAA.Backtest(0)
>
> oAA.Export("Dummy.csv")
>
>
>
> The code above should be saved in a .vbs filetype ( name of your
> choosing ) and then simply double clicking it will produce the file.
>
>
>
> This could easily be changed to running an optimize which will
produce all
> the performance metrics in the AA results which could then be
exported by
> changing .
>
>
>
> oAA.Backtest(0)
>
>
>
> to .
>
>
>
> oAA.Optimize(0)
>
>
>
> Ideally the optimize above would be a one step optimize if you
will just
> to produce the performance metrics related to the backtest .
>
>
>
> With a little more work i.e. a loop to set the beginning and
ending dates
> one could get performance metrics externally for whatever lookback
length
> one wanted one after the other .
>
>
>
>
>
>
> --------------------------------------------------------------------
--------
> --
>
> From: amibroker@xxxxxxxxxxxxxxx
[mailto:amibroker@xxxxxxxxxxxxxxx] On
> Behalf Of Al Venosa`
> Sent: Monday, July 28, 2008 12:17 PM
> To: amibroker@xxxxxxxxxxxxxxx
> Subject: Re: [amibroker] Re: How to save Metrics in Composites for
> Individual BTs
>
>
>
> 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`
>
> 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, "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
[mailto:amibroker@xxxxxxxxxxxxxxx]On
> Behalf
> > Of Tomasz Janeczko
> > Sent: July 25, 2008 5:49 AM
> > To: amibroker@xxxxxxxxxxxxxxx
> > 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
> > 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
[mailto:amibroker@xxxxxxxxxxxxxxx]On
> Behalf
> > Of Tomasz Janeczko
> > Sent: July 25, 2008 4:08 AM
> > To: amibroker@xxxxxxxxxxxxxxx
> > 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
> > 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
[mailto:amibroker@xxxxxxxxxxxxxxx]
> On Behalf
> > Of Herman
> > Sent: Friday, 25 July 2008 9:31 AM
> > To: amibroker@xxxxxxxxxxxxxxx
> > 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
[mailto:amibroker@xxxxxxxxxxxxxxx]On
> Behalf
> > Of Tomasz Janeczko
> > Sent: July 24, 2008 3:00 PM
> > To: amibroker@xxxxxxxxxxxxxxx
> > 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 for free now!
>
>
>
>
>
>
>
>
>
> --------------------------------------------------------------------
--------
> --
> 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 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/
|