I should probably add that the challenge now is not calculating the SD but how 
to load up an array with only monthly returns...



--- In [email protected], "bh.hicks" <bh.hi...@...> wrote:
>
> 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" <sfclimbers@> 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
> > > >
> > >
> >
>


Reply via email to