PureBytes Links
Trading Reference Links
|
SYSTEM PERFORMANCE INDICATORS
//P_System Performance IndicatorsI_v4
/*
v4 Renames the formulas to System Performance Indicators from
InlineMetrics,
Adds multiple systems - with system EquityFactors combined into a
PortfolioEquityFactor,
Portfolio Emulation uses rebalancing......the system equity and the
individual trades are rebalanced on a bar by bar basis........capital
is divided equally between the number of systems and then between the
number of stocks, that have open trades, in each system.
Note: rebalancing needs the trade series arrays to be generated by
code that accounts for open equity i.e. records the trade,as %, on a
bar by bar basis, from the time a buy is made up until it is sold.
The rebalanced Portfolio emulation used is nominal - it is a personal
choice whether it reflects a real world trading portfolio or not.
The code used to generate and record the trade factor arrays is
immature. It is used for demonstration purposes only and will not
stand up to real world trading e.g. it doesn't allow for stops etc or
situations where the next sell that comes along is a match for a buy
that occurred 2 or 3 trades ago.
To change to more robust signals OR signals that perform another
function e.g. calculates Open Equity......as a starting point, change
from the B,S code up to, AND including the ConfirmedBuy (CB) AND
ConfirmedSell(CS) i.e. as long as CB AND CS have integrity the rest
of the code, as written, should still work.
NOMENCLATURE
B = Buy
S = Sell
BP = BuyPrice
SP = SellPrice
M to F = Monday to Friday
TF = TradeFactor == win OR loss as % (expressed as GrowthFactor in
this example)
TFZ = tradesNot, and it's matheamtical derivatives, are recorded as
zero to prevent propogation of Null values.
GF = GrowthFactor e.g. 3% win == 1.03
EF = EquityFactor = progressive product of bar by bar GF (array)
PEF = PortfolioEquityFactor = matrix (arrays) of individual stock EF
OR system EF mathematically conditioned to emulate different
Portfolios that use MM methods
PTF = PortfolioTradeFactor
MM - MoneyManagement
BE = BreakEven trade (commissions excluded)
CB = ConfirmedBuy
CS = ConfirmedSell
SEF = System Equity Factor
STFSum = SystemTradeFactorSum
STFZ = SystemTradeFactor - zero format
*/
//PART IA - TRADE SERIES MODULE - CLOSED TRADE EQUITY - (ONLY ONE
TRADE PER SYMBOL OPEN AT A TIME)
Filter = 1;
STFSum = 0;
Count = 0;
STFSum1 = 0;
Count1 = 0;
list = CategoryGetSymbols( categoryWatchlist, 0 );
for( i = 0; ( symbol = StrExtract(list, i ) ) != ""; i++ )
{
SetForeign(symbol);
B = Cross( C,MA(C,10));
S = Cross( MA(C,10),C);
B = Flip(B,S);
BP = SP = C;
CS = B == 0 AND Ref(B,-1) == 1;
CB = B == 1 AND Ref(B,-1) == 0;
TF = IIf(CS,SP/ValueWhen(CB, BP,1),1);
TFZ = IIf(CS,SP/ValueWhen(CB, BP,1),0);//reconfigure tradeNOTs to zero
TFFlag = IIf(CS,1,0);
STFSum = STFSum + TFZ;
Count = Count + TFFlag;
Plot(TF,"TradeFactor" + "-" + symbol,i + 1,1);
AddColumn(TFZ,"TFZ" + "-" + symbol,1.9);
///////////////////////////////////
//Duplicate Code with a different trading system
M = DayOfWeek() == 1;
F = DayOfWeek() == 5;
BI = BarIndex()== 0;
B1 = M;
S1 = F OR BI;
B1 = Flip(B1,S1);
BP1 = SP1 = C;
CS1 = B1 == 0 AND Ref(B1,-1) == 1;
CB1 = B1 == 1 AND Ref(B1,-1) == 0;
TF1 = IIf(CS1,SP1/ValueWhen(CB1, BP1,1),1);
TFZ1 = IIf(CS1,SP1/ValueWhen(CB1, BP1,1),0);
TFFlag1 = IIf(CS1,1,0);
STFSum1 = STFSum1 + TFZ1;
Count1 = Count1 + TFFlag1;
Plot(TF1,"TradeFactor1" + "-" + symbol,i + 1,1);
AddColumn(TFZ1,"TFZ1" + "-" + symbol,1.9);
////////////////////////////////////
RestorePriceArrays();
}
STFZ = IIf(Count == 0,1,STFSum/Count);
STFZ1 = IIf(Count1 == 0,1,STFSum1/Count1);
noSystems = 2;//the number of systems in the Portfolio being traded
simultaneously - manual input required,
PTF = (STFZ + STFZ1)/2;
//non-looping EF calculation
PEF = 1;
PEF = exp(Cum(log(PTF)));
//Plot(PEF,"PortfolioEF",5,1);
Plot(PTF,"PorfolioTF",colorBlue,1);
//Plot(Count,"Count",colorBlue,1);
AddColumn(STFSum,"SystemTFSum",1.9);
AddColumn(Count,"Count",1.2);
AddColumn(STFZ,"SystemTFZ",1.9);
AddColumn(STFSum1,"SystemTFSum1",1.9);
AddColumn(Count1,"Count1",1.2);
AddColumn(STFZ1,"SystemTFZ1",1.9);
AddColumn(PEF,"PorfolioEF",1.9);
--- In amibroker@xxxxxxxxxxxxxxx, "brian_z111" <brian_z111@xxx> wrote:
>
> Another version with an example of Portfolio Emulation that uses
> rebalancing.
>
> The signals used are not significant and are only there to produce
a
> trade factor matrix to test the later code.
>
> For practical use, with rebalancing, the trade factor series would
> need to be changed to include open equity.
>
> The example is just to show that, potentially, inline Portfolio
> Emulation can model portfolio's without needing a lot of code.
>
> I probably won't demo any more Portfolio Emulation examples because
I
> am going down a different track and also there would be so many
> different opinions about what type of emulation is needed to model
> a 'real' portfolio.
>
> It is still limited to one trade at a time per symbol - the only
> significant affect this has on the end result is that it uses up
more
> data to obtain a statistically valid dataset.
>
> Multiplying the intitial equity by the PortfolioEquityFactor
produces
> the Portfolio Equity Curve for a portfolio with bar by bar
> rebalancing.
>
> I don't know anything about code prettification/conventions OR
> measuring if the code is efficient with processor time... it does
> work.
>
> //P_InLineMetricsI_v3.1
>
> /*
>
> v3 Adds referencing of multiple symbols from a watchlist
> Portfolio emulation uses bar by bar rebalancing
> Changes EquityFactor from looping to log
> Example signal changed to a more realistic version
>
> note from AB User's Guide:
> Use StrExtract function to extract individual symbols from the
list.
> if given watch list contains lots of symbols
> performance may be poor
> AVOID SUCH CODES IN REAL-TIME MODE !
>
>
> NOMENCLATURE
>
> B = Buy
> S = Sell
> BP = BuyPrice
> SP = SellPrice
> TF = TradeFactor == win OR loss as % (expressed as GrowthFactor)
> TFO = TradeFactor array reconfigured for tradeNot = zero
> GF = GrowthFactor e.g. 3% win == 1.03
> EF = EquityFactor = progressive product of bar by bar GF (array)
> PEF = PortfolioEquityFactor = matrix (arrays) of individual stock
EF
> OR system EF mathematically conditioned to emulate different
> Portfolios that use MM methods
> PTF = PortfolioTradeFactor
> CB = ConfirmedBuy
> CS = ConfirmedSell
>
> */
>
>
> //PART IA - TRADE SERIES MODULE - CLOSED TRADE EQUITY - (ONLY ONE
> TRADE PER SYMBOL OPEN AT A TIME)
>
> Filter = 1;//allows to run as an Exploration
>
> PTFSum = 0;
> Count = 0;//counts symbols in watchlist
>
> list = CategoryGetSymbols( categoryWatchlist, 0 );
>
> for( i = 0; ( symbol = StrExtract(list, i ) ) != ""; i++ )
>
> {
>
> SetForeign(symbol);
>
> B = Cross( C,MA(C,10));
> S = Cross( MA(C,10),C);
> B = Flip(B,S);//not essential with the above signals - kept in to
> maintain continuity with previous code,
>
> BP = SP = C;
> CS = B == 0 AND Ref(B,-1) == 1;
> CB = B == 1 AND Ref(B,-1) == 0;
>
>
> TF = IIf(CS,SP/ValueWhen(CB, BP,1),0);//reconfigure trade series to
> zero,
>
> TFFlag = IIf(CS,1,0);
>
> PTFSum = PTFSum + TF;
> Count = Count + TFFlag;
>
> Plot(TF,"TradeFactor" + "-" + symbol,i + 1,1);
> AddColumn(TF,"TradeFactor" + "-" + symbol,1.9);
>
> RestorePriceArrays();
>
> }
>
>
> interimPTF = PTFSum/Count;
>
> PTF = IIf(Count == 0,1,interimPTF);
>
> //non-looping EF calculation
>
> PEF = 1;
>
> PEF = exp(Cum(log(PTF)));
> //Plot(PEF,"PortfolioEF",5,1);
>
>
> Plot(PTF,"PorfolioTF",colorBlue,1);
>
> //Plot(Count,"Count",colorBlue,1);
>
> AddColumn(Count,"Count",1.2);
> AddColumn(PTFSum,"PorfolioTFSum",1.9);
> AddColumn(PTF,"PorfolioTF",1.9);
> AddColumn(PEF,"PorfolioEF",1.9);
>
>
>
>
>
> --- In amibroker@xxxxxxxxxxxxxxx, "brian_z111" <brian_z111@> wrote:
> >
> > Here is an elective period StDevP for a non-continuous dataset
> >
> > //PART 1B - Elective Period StandardDeviation Of The Trade Series
> >
> >
> > Trades = IIf(CS,TSFactor,0);//reconfigures trade series so that
> > tradesNOT == 0,
> >
> > TradeFlag = IIf(CS,1,0);//returns 1 for every trade
> >
> > Period = Param("Periods",20,1,100,1);
> >
> > ST = Sum(Trades,Period);//Sums Trades
> > STS = Sum(Trades^2,Period);//Sums the TradesSquared
> > CT = Sum(TradeFlag,Period);//Counts the Trades
> >
> > StandardDevP = sqrt( STS/CT - (ST/CT)^2 );//uses Ken Closes
> > restated StDev equation,
> >
> >
> >
> > --- In amibroker@xxxxxxxxxxxxxxx, "brian_z111" <brian_z111@>
wrote:
> > >
> > > I added progressive StDevP,of the trade series, to the code.
> > >
> > > //P_InLineMetricsI_v2
> > >
> > > /*
> > >
> > > v2 renames some variables (to clarify nomenclature and prepare
> for
> > > later code),
> > >
> > > confirms Buy/Sell signals to allow trade counting AND
accounting
> > for
> > > BreakEven trades,
> > >
> > > adds cumulative Standard Deviation of the trade series.
> > >
> > > Monday is used as the Buy example because it is unambiguous.
> > > Typically most markets have Mon OR Fri public holidays so it
> allows
> > > for checking code response to non-paireds buys AND sells
(Signal
> > > errors).
> > > BarIndex() == 0 is added as an initial Buy condition to
> workaround
> > > the propogating of {empty} values that can arise in the first
few
> > > bars.
> > > A Buy latch is used so that only one trade can be entered at a
> time
> > > AND every Sell must have a corresponding Buy.
> > > Plots the TradeSeriesFactor, as GrowthFactor, which is
equivalent
> > to
> > > % (tradesNOT are recorded as GF == 1).
> > > Since commissions aren't considered the Equity outcome for
break
> > even
> > > trades (GF also == 1) is correct.
> > > The progressive product of the GF is equivalent to the
compounded
> > > Equity Curve for an initial fixed capital investment
> > > (this assumes the trades are sequential).
> > > If the Initial Equity is 1 the EqCurve is the standardised
Equity
> > > Factor (EF),
> > > (this assumes that no capital addition or rebalancing occurs
> after
> > > the initial allocation).
> > > Equity == Initial Equity * EF
> > >
> > >
> > > */
> > >
> > >
> > > //PART IA TRADE SERIES MODULE (CLOSED TRADE EQUITY - ONLY ONE
> TRADE
> > > PER SYMBOL OPEN AT A TIME)
> > >
> > > Filter = 1;//allows code to run as an exploration for code
testing
> > >
> > > M = DayOfWeek() == 1;
> > > F = DayOfWeek() == 5;
> > > BI = BarIndex()== 0;
> > >
> > >
> > > B = M;//Buy on Monday
> > > S = F OR BI;//first bar set to sell and then sell on Friday's
> > > thereafter
> > >
> > > B = Flip(B,S);//latches the Buy signal to prevent concurrent
buys
> > >
> > > BP = SP = C;//BuyPrice, SellPrice
> > >
> > > CS = B == 0 AND Ref(B,-1) == 1;//Confirms the sell (it has
exited
> > > from a latched buy)
> > > CB = B == 1 AND Ref(B,-1) == 0;//Confirms buy (it enters a
> latched
> > > buy)
> > >
> > >
> > > //Plot(B,"Buy",5,1);
> > > //Plot(S,"Sell",2,1);
> > >
> > > //Plot(CB,"Buy",5,1);
> > > //Plot(CS,"Sell",2,1);
> > >
> > >
> > > //Plot(BP,"BuyPrice",5,1);
> > > //Plot(SP,"SellPrice",2,1);
> > >
> > > TSFactor = IIf(CS,SP/ValueWhen(CB, BP,1),1);//TradeSeriesFactor
> as
> > > GrowthFactor
> > >
> > > // next section to be changed to log/antilog to avoid need for
> > looping
> > >
> > > EF = 1;//initialises EquityFactor to 1
> > >
> > > for (i = 1; i < BarCount; i++)
> > > {
> > > EF[i] = EF[i-1] * TSFactor[i];
> > > }
> > >
> > > //Plot(EF,"EquityFactor",5,1);
> > >
> > >
> > >
> > > //PART 1B - Progressive StandardDeviation Of The Trade Series
> > >
> > >
> > > Trades = IIf(CS,TSFactor,0);//reconfigures trade series so that
> > > tradesNOT == 0,
> > >
> > > TradeFlag = IIf(CS,1,0);//returns 1 for every trade
> > > ST = Cum(Trades);//Sums Trades
> > > STS = Cum(Trades^2);//Sums the TradesSquared
> > > CT = Cum(TradeFlag);//Counts the Trades
> > >
> > > StandardDevP = sqrt( STS/CT - (ST/CT)^2 );//uses Ken Closes
> > > restated StDev equation,
> > >
> > > //Plot(,"",1,1); plot template for copy and paste
> > >
> > > //Plot(Trades,"Trades",1,1);
> > > //Plot(TradeFlag,"TradeFlag",1,1);
> > > //Plot(ST,"SumTrades",2,1);
> > > //Plot(CT,"CountTrades",3,1);
> > > //Plot(STS,"SumTradesSquared",2,1);
> > >
> > > Plot(StandardDevP,"Cumulative StDevP",6,1);
> > >
> > >
> > > //Exploration report columns for code testing via manual export
> to
> > > spreadhsheet,
> > >
> > > // tested OK with a sample of 48 closed trades (3 were
breakeven
> > > trades) - StDevP agreed with Excel StDevP calculations to 4 or
5
> > > decimal places
> > >
> > >
> > > AddColumn(Trades,"Trades",1.9);
> > > AddColumn(ST,"SumTrades",1.9);
> > > AddColumn(CT,"TradesCount",1.0);
> > > AddColumn(STS,"SumTradesSquared",1.9);
> > >
> > > AddColumn(StandardDevP,"StandardDevTrades",1.9);
> > >
> > >
> > >
> > >
> > > --- In amibroker@xxxxxxxxxxxxxxx, "brian_z111" <brian_z111@>
> wrote:
> > > >
> > > > Herman and Al,
> > > >
> > > > I took the scissors to my first effort.
> > > >
> > > > It isn't an inline backtester, rather an inline
> RootCauseMetrics
> > > > indicator (possibly it could be used for calculating the
common
> > > > Performance Metrics 'on the fly', including with lookback
> > periods).
> > > >
> > > >
> > > >
> > > > This is the basic starting module.
> > > >
> > > > It should be possible to modify it to allow for concurrent
> > signals,
> > > > open trade interest, although it gets a bit harder from here
> for
> > me
> > > > (maybe not for others).
> > > >
> > > > I have checked it over a few charts and so far it stands up
O.K
> > > > I haven't used in the line of fire though.
> > > >
> > > > Any potential in it for you guys?
> > > >
> > > >
> > > >
> > > > FTR
> > > >
> > > > This is a continuation of discussion at topic:
> > > >
> > > > "How To Save Metrics In Composite For Indidual BT's"
> > > >
> > > > A little background discussion about the idea behind the code
> is
> > at
> > > >
> > > > message # 127383 and # 127420 in the above thread.
> > > >
> > > > //P_InLineMetrics
> > > >
> > > > //Monday is used as the example because it is an unambiguous
Buy
> > > > //Typically most markets have Mon or Fri public holidays so
it
> > > allows
> > > > for checking code response to duplicate buys and sells
(signal
> > > errors)
> > > > //BarIndex() is added as a buy condition to workaround the
> > > > propogating of {empty} values that can arise in the first few
> bars
> > > > //A latch is used so that only one trade can be entered at a
> time
> > > and
> > > > every Sell must have a corresponding Buy
> > > > //Plots the trade series, as GrowthFactor, which is
equivalent
> to
> > %
> > > > //No trades are accounted for and recorded as GF 1
> > > > //The code doesn't identify break even trades i.e. GF == 1
but
> it
> > > can
> > > > be modified to do so
> > > > //since commissions aren't considered the Eq outcome for
break
> > even
> > > > trades is correct
> > > > //the progressive product of the GF is equivalent to the
Equity
> > > Curve
> > > > for a fixed capital investment
> > > > //if the intitial Equity is 1 the EQ is the standardised
Equity
> > > Factor
> > > > //Equity == Initial Equity * EF
> > > > //the product of individual GF's, sumbol by symbol, is the
> > > Portfolio
> > > > Growth Factor the progessive product of which produces the
> > > Portfolio
> > > > Equity Factor
> > > > //same bar entry/exits are not allowed but the code can be
> > modified
> > > > for that if required
> > > >
> > > >
> > > >
> > > >
> > > > //PART IA TRADE SERIES MODULE (CLOSED TRADES - ONLY ONE TRADE
> PER
> > > > SYMBOL OPEN AT A TIME)
> > > >
> > > > M = DayOfWeek() == 1;
> > > > F = DayOfWeek() == 5;
> > > > BI = BarIndex()== 0;
> > > >
> > > >
> > > > B = M;//Buy on Monday
> > > > S = F OR BI;//first bar set to sell and then sell on Friday's
> > > > thereafter
> > > >
> > > > B = Flip(B,S);//latches the Buy signal to prevent concurrent
> buys
> > > >
> > > > BP = SP = C;//BuyPrice, SellPrice
> > > >
> > > >
> > > > //Plot(B,"Buy",5,1);//FFP - fault finding plot used when
> writing
> > > the
> > > > code
> > > > //Plot(S,"Sell",2,1);//FFP
> > > >
> > > > //Plot(BP,"BuyPrice",5,1);//FFP
> > > > //Plot(SP,"SellPrice",2,1);//FFP
> > > >
> > > > TradeSeries = IIf(S ==1 AND Ref(B,-1) == 1,SP/ValueWhen(B ==
1
> > AND
> > > Ref
> > > > (B,-1) == 0, BP,1),1);//
> > > >
> > > > Plot(TradeSeries,"TradeSeries",1,1);//as GrowthFactor
> > > >
> > > >
> > > > EF = 1;//initialises EquityFactor to 1
> > > >
> > > > for (i = 1; i < BarCount; i++)
> > > > {
> > > > EF[i] = EF[i-1] * TradeSeries[i];
> > > > }
> > > >
> > > > Plot(EF,"EquityFactor",5,1);
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > --- In amibroker@xxxxxxxxxxxxxxx, "brian_z111" <brian_z111@>
> > wrote:
> > > > >
> > > > > Herman,
> > > > >
> > > > > IBM PartI
> > > > >
> > > > > I am not sure if this is along the lines that you are
> > > investigating.
> > > > > It might be a starting point.
> > > > > Sophisticated functions can be built from the concept.
> > > > >
> > > > > Example of using single symbol equity function to back
> > calculate
> > > > the
> > > > > trade series.
> > > > >
> > > > > I used buy Tues(C) and sell Thurs(C) with one month of data
> to
> > > test
> > > > > the code as I went along (this gave me unambiguous signals
> with
> > > > only
> > > > > one signal at a time - I believe you can use an eq flag to
> dump
> > > > dual
> > > > > signals for real life use).
> > > > >
> > > > > Note: some weeks don't have Mons or Fris so I wanted to
avoid
> > no
> > > > > signals, caused by short weeks, during testing
> > > > >
> > > > > I used barindex() > 4 to cut out the first week in the
month
> so
> > > > that
> > > > > I started with no signals for a few bars before the first
buy.
> > > > >
> > > > > I left the plot code in there but commented out (I plotted
> each
> > > > line
> > > > > to test the veracity of the code).
> > > > >
> > > > > Note that when the trade series is used to recreate the eq
> > curve
> > > > (as
> > > > > a cross check) it only matches on the exit bars for each
> trade.
> > > > > I tried it on 10 years of Yahoo data and the final eqs
> matched
> > to
> > > 2
> > > > > decimal places (rounded off).
> > > > >
> > > > > //P_InLineEquity
> > > > > //code to reverse engineer the trade series from the equity
> > curve
> > > > > //it is reversed at the end to check the accuracy of the
> method
> > > > >
> > > > > InitialEq = 10000;//input required
> > > > >
> > > > > SetOption("InitialEquity", InitialEq );
> > > > >
> > > > > Buy = BarIndex() > 4 AND DayOfWeek() == 2;//use your own
> > > > > Sell = BarIndex() > 4 AND DayOfWeek() == 4;//use your own
> > > > >
> > > > > BuyPrice = C;//use your own
> > > > > SellPrice = C;//use your own
> > > > >
> > > > > Plot(Equity(),"Equity",5,1);
> > > > >
> > > > > Entry = IIf(Equity() == Ref(Equity(),-1) AND Equity() != Ref
> > > (Equity
> > > > > (),1),1,0);
> > > > >
> > > > > //Plot(Entry,"Entry",1,1);
> > > > >
> > > > > Exit = IIf(Equity() != Ref(Equity(),-1) AND Equity() == Ref
> > (Equity
> > > > > (),1),1,0);
> > > > >
> > > > > //Plot(Exit,"Exit",2,1);
> > > > >
> > > > > TradeSeries = IIf(Exit ==1,ValueWhen(Exit == 1,
> > > > SellPrice,1)/ValueWhen
> > > > > (Entry == 1, BuyPrice,1),1);
> > > > >
> > > > > //Plot(TradeSeries,"TradeSeries",1,1);
> > > > >
> > > > > GF = 1;//GrowthFactor
> > > > >
> > > > > for (i = 1; i < BarCount; i++)
> > > > > {
> > > > > GF[i] = GF[i-1] * TradeSeries[i];
> > > > > }
> > > > >
> > > > > //codesters might be able to make the above loop
> > better/prettier?
> > > > > //Plot(GF,"GrowthFactor",5,1);
> > > > >
> > > > >
> > > > > Plot(InitialEq * GF,"CalculatedEquity",1,1);
> > > > >
> > > >
> > >
> >
>
------------------------------------
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/
|