Mike,
You are the man! Thank you! I have posted the code I ended up with to the
bottom of this email in hopes it will help someone else someday but please be
aware I am the worst "programmer" on the planet before using.
Now onto StdDev of monthly returns. Traders Studio has an object that stores
monthly returns that I access like this...
NOTE: NOT AMIBROKER CODE
objReport = thisSession.MonthlyReport
ReDim(Mreturn,objReport.ItemCount)
For i = 0 To objReport.ItemCount - 1
objPeriod = objReport.Period(i)
Mreturn[i]=objPeriod.PercentReturn
Next
AvgMreturn=Average(Mreturn,i,0)
StDevMreturn=StdDevS(Mreturn,i,0)
Msharpe=(AvgMreturn-.0025)/StDevMreturn
I haven't been able to find something similar in AB. Does it exist or is there
another method I need to use to get at this data? Thanks again for any bones
that can be thrown my way. I will do my best to leave the results behind for
the next newbie who follows me.
--------------------------------------------------------------------
MY AB Code to calculate Standard Deviation of Trades and use it to calculate
T-score.
SetCustomBacktestProc("");
if( Status("action") == actionPortfolio )
{
bo = GetBacktesterObject();
bo.Backtest();
st = bo.GetPerformanceStats(0);
//Get Variables
AvgTrade=st.GetValue("AllAvgProfitLossPercent");
// iterate through closed trades
X = 0;
N = 0;
SumX = 0;
SumX2 = 0;
for( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() )
{
X[N] = trade.GetPercentProfit();
SumX=SumX+X[N];
SumX2=SumX2+(X[N]^2);
N++;
}
// Custom Metric Caluclations
TradeStdDev=sqrt((SumX2-((SumX)*(SumX)/N))/(N-1));
TScore=sqrt(N)*AvgTrade/TradeStdDev;
// Here we add custom metric to backtest report
bo.AddCustomMetric( "TradeStdDev",TradeStdDev);
bo.AddCustomMetric( "T-Score",TScore);
}
--- In [email protected], "Mike" <sfclimb...@...> wrote:
>
> I haven't verified any of this, but...
>
> When you create your own arrays (e.g. TradeReturn[]), I believe that they get
> aligned with the market data of the current symbol (~~~Equity in this case).
> Assuming that you had a total of 20 trades over 1000 bars, you would have an
> array with values for the first 20 elements and zeroes (or Nulls?) for the
> remaining 980 bars. Your StDev call is operating on the last 3 bars, all of
> which will be zero, giving zero.
>
> I believe that the answer would be for you to manually calculate the std.
> deviation of the trades yourself.
>
> Then again, the problem might just be related to trying to add an array as
> custom metric as opposed to a scaler, in which case LastValue(TradeStdDev)
> would be the way to go. Experiment and see what you come up with.
>
> Mike
>
> P.S. Great start for someone new to AmiBroker!
>
>
> --- In [email protected], "bh.hicks" <bh.hicks@> wrote:
> >
> > Ok, I am making progress on this but getting hung up on the standard
> > deviation calculations. I have been through most of all 800+ posts that
> > mention standard deviation but haven't been able to figure this out. If
> > anyone can offer some insight into why my TradeStDev is coming back empty,
> > I would very much appreciate it as I barely have any hair left.
> >
> >
> > SetCustomBacktestProc("");
> >
> > if( Status("action") == actionPortfolio )
> > {
> > bo = GetBacktesterObject();
> > bo.Backtest();
> > st = bo.GetPerformanceStats(0);
> >
> > //Get Variables
> > WLratio=st.GetValue("PayoffRatio");
> > WinPercent=st.GetValue("WinnersPercent")/100;
> > PF=st.GetValue("ProfitFactor");
> > NetProfit=st.GetValue("NetProfit");
> > MaxDD=st.GetValue("MaxSystemDrawdown");
> > TestYears=(EndValue( BarIndex() ) - BeginValue( BarIndex() ))/252;
> > AvgTrade=st.GetValue("AllAvgProfitLossPercent");
> >
> > // iterate through closed trades
> > TradeReturn = 0;
> > NumTrades = 0;
> >
> > for( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() )
> > {
> > TradeReturn[NumTrades] = trade.GetPercentProfit();
> > NumTrades++;
> > }
> >
> > // Metrics
> > Fscore=(((WLratio+1)*WinPercent)-1)/WLratio;
> > MyF=Fscore*PF;
> > DDR=(NetProfit/-MaxDD)*(TestYears/20);
> > TradeStdDev=StDev(TradeReturn,3);
> >
> > // Here we add custom metric to backtest report
> > bo.AddCustomMetric( "W/L Ratio",WLratio);
> > bo.AddCustomMetric( "Win %",WinPercent);
> > bo.AddCustomMetric( "ProfitFactor",PF);
> > bo.AddCustomMetric( "F-Score",Fscore);
> > bo.AddCustomMetric( "MyF",MyF);
> > bo.AddCustomMetric( "DDR",DDR);
> > bo.AddCustomMetric( "AvgTrade%",AvgTrade);
> > bo.AddCustomMetric( "Test0",TradeReturn[0]);
> > bo.AddCustomMetric( "Test1",TradeReturn[NumTrades-1]);
> > bo.AddCustomMetric( "TradeStDev",TradeStdDev);
> > }
> >
> >
> > --- In [email protected], "bh.hicks" <bh.hicks@> wrote:
> > >
> > > I have been a long time Traders Studio user and am beginning the process
> > > of migrating everything over to AmiBroker. One of the more useful pieces
> > > of code I wrote for Traders Studio was a custom optimization metric that
> > > I would like to reproduce in AmiBroker. I am a little overwhelmed at all
> > > the information available and would very much appreciate it if someone
> > > could point me towards some sources of info that will allow me to
> > > accomplish this.
> > >
> > > The ranking metric does the following:
> > >
> > > Msharpe=(AvgMreturn-.0025)/StDevMreturn (m refers to monthly)
> > > Tscore=Sqr(TradeCount)* AvgTrade/TradeStdDev (std dev. is of % returns of
> > > each trade)
> > > Fscore=(((WLratio+1)*WinPercent)-1)/WLratio (WLratio is W/L ratio)
> > > MyF=Fscore*ProfitFactor
> > > DDR=(NetProfit/MaxDD)*(YearsTested/20)
> > >
> > > CustomScore=Msharpe*MyF*Tscore*DDR
> > >
> > > This did a pretty good job allowing me to quickly rank optimization runs
> > > on the criteria that is important to me.
> > >
> > > So although new to AmiBroker, I can work my myself around some moderately
> > > difficult code and Trader Studio's object-oriented back end but I really
> > > just don't know where to start to dig up how to access this data during
> > > backtests an optimization runs.
> > >
> > > Thanks for any help.
> > > B
> > >
> >
>