PureBytes Links
Trading Reference Links
|
Practitioners of "financial engineering" methods measure risks, using
the tool of past history as an indication of the future. They call
themselves scientists but do not show an inch of critical thinking,
or self-doubt, which is the hallmark of science. The mere
possibility of the distributions not being stationary makes the
entire concept seem like a costly (perhaps very costly) mistake.
This demarcation between science and charlatanism is apparent when we
examine financial engineering and the applications of modern
financial theory to risk management.
If I know that there may be rare events in history, then I cannot
infer anything about the properties of the data, quality of the
trader or the strategy under consideration, solely from past returns.
If I do believe that there cannot be rare events, then I can probably
start making a judgement on the asset, the trader, or the strategy.
I can then listen to the ever so friendly econometrician who
volunteer theories about managing risk.
Accordingly, we need to accept this assymetry in knowledge: if a
rare event can bankrupt my business, then I can accept its quality.
But there are situations in which statistics and econometrics can be
useful. I wouldn't bet my life on it. Like Pascal and Karl Popper,
If the science of statistics can benefit me in anything, I will use
it. If it poses a threat, then I will not. Accordingly, I will use
statistics and inductive methods to make bets, but I will not use
them to manage my risks. All the surviving traders seem to have done
the same. They trade on ideas bases on some observation (that
includes past history), but they manage their risks with the stop
loss. This is exactly opposite of what many financial institutions
seem to do...
rgs, Pal
rgds, Pal
--- In amibroker@xxxxxxxxxxxxxxx, "palsanand" <palsanand@xxxx> wrote:
> More code:
>
> MS1=100;MS2=300;
> //MinShares = Optimize("MinShares",100,MS1,MS2,100);
> MinShares = Param("MinShares",100,MS1,MS2,100);
> SetOption("MinShares", MinShares);
> //MarginDeposit = 100;
> eq = Foreign("~~~EQUITY", "C");
> cash = Foreign("~~~EQUITY", "L");
> //dr = eq - Highest(eq);
> e_max = Highest(eq); // peak equity so far
> MDD = Highest(e_max - eq); //max drawdown so far
> LB1=5;LB2=16;
> MaxOpenPos= LB = Optimize("MaxOpenPos",6,LB1,LB2,1);
> //MaxOpenPos= LB = Param("MaxOpenPos",6,LB1,LB2,1);
> SetOption("MaxOpenPositions", MaxOpenPos );
> //X = Optimize("X",100,50,100,10);
> X = Param("X",100,50,100,10);
> PositionSize = -X/MaxOpenPos;
> MaxRisk = PositionSize * (-MDD)/eq;
>
> rgds, Pal
> --- In amibroker@xxxxxxxxxxxxxxx, "palsanand" <palsanand@xxxx>
wrote:
> > Came out with the following solution:
> >
> > equity_lookback_bars = 0;
> > equity_lookback_smoothing = 30;
> > equity_drawdown_discount_pct = 90; //not sure what this should be
> > function PerformanceScore() { // returns score for current trade
> > signals;
> > //Highest score is used
> > e = Equity(0, 0);
> > if(equity_lookback_bars == 0) { // test all performance to date
> > e_ref = e[0];
> > } else { // test performance back spec'd number of bars
> > e_ref = Ref(e, -equity_lookback_bars);
> > }
> > perf_score = (e - e_ref) / e_ref; // growth over lookback period
> > perf_score = MA(perf_score, equity_lookback_smoothing) * 100; //
> > smoothed pct
> > perf_score = perf_score * 100 / IIf(equity_lookback_bars == 0, Cum
> (1),
> > equity_lookback_bars); // per 100 bars
> > e_max = Highest(e); // peak equity so far
> > mdd = Highest(e_max - e); // max drawdown so far
> > mdd_fraction = Highest(mdd / e_max); // fraction max drawdown is
of
> > peak equity
> > perf_score = perf_score - (perf_score * mdd_fraction *
> > (equity_drawdown_discount_pct/100)); // reduce score by mdd
> fraction
> > scaled
> > //by drawdown discount
> > return perf_score;
> > }
> > PositionScore = PerformanceScore();
> >
> > Any Feedback appreciated.
> >
> > rgds, Pal
> > --- In amibroker@xxxxxxxxxxxxxxx, "palsanand" <palsanand@xxxx>
> wrote:
> > > Previously I forgot that I read the following in the ReadMe
file
> of
> > > the latest beta of AB:
> > >
> > > in regular backtest mode now it is possible to specify the
score
> of
> > > the symbol (on bar-by-bar basis) via PositionScore variable. In
> > this
> > > mode the score is used only at trade ENTRY to decide which
> > securities
> > > should be traded in case when there are more simultaneous entry
> > > signals than max. allowable positions or available funds.
> AmiBroker
> > > will 'prefer' securities with higher absolute value of the
score.
> > If
> > > PositionScore is not used then it is assumed to be 1 for all
> > > securities.
> > >
> > > You can use new PositionScore variable to decide which trades
> > should
> > > be entered if there are more entry signals on different
> securities
> > > than maximum allowable number of open positions or available
> funds.
> > > In such case AmiBroker will use the absolute value of
> PositionScore
> > > variable to decide which trades are preferred. See the code
> below.
> > It
> > > implements simple MA crossover system, but with additional
> flavour
> > of
> > > preferring entering trades on symbols that have low RSI value.
If
> > > more buy signals occur than available cash/max. positions then
> the
> > > stock with lower RSI will be preferred. You can watch selection
> > > process if you backtest with "Detailed log" report mode turned
on.
> > >
> > > // now additional score
> > > // that is used to rank equities
> > > // when there are more ENTRY signals that available
> > > // positions/cash
> > > PositionScore = 100-RSI(); // prefer stocks that have low RSI;
> > >
> > > This would now solve the problem of issue selection. Now I
have
> 7
> > > Max open positions, but naturally some "underlying instrument"
> > issues
> > > are different than before I used PositionScore, depending on
the
> > > PositionScore, which I hope AB uses to select low RSI for Long
> and
> > > high RSI for Short positions which is the rule I use for
> > reversals.
> > > If not then I would not use PositionScore and let it to default
> to
> > > the value of 1. RSI doesn't matter for some trades like
> > continuation
> > > signals. How would I handle these 2 trading situations?
Could
> > > somebody clarify what AB does here with this PositionScore?
> > >
> > > rgds, Pal
> > > --- In amibroker@xxxxxxxxxxxxxxx, "palsanand" <palsanand@xxxx>
> > wrote:
> > > > I modified the AA code as follows:
> > > >
> > > > in_trade_long = Flip( Buy, Sell );
> > > > in_trade_short = Flip( Short, Cover);
> > > >
> > > > AddToComposite( in_trade_long, "~OpenLongPosCount", "V" );
> > > > AddToComposite( in_trade_short, "~OpenShortPosCount", "V" );
> > > >
> > > > /* We use "~OpenPosLongCount" and "~OpenPosShortCount"
> artificial
> > > > ticker to store the results. Again we should run just Scan of
> the
> > > > formula AND these tickers would become available.
> > > >
> > > > Use */
> > > >
> > > > Graph1 = Foreign( "~OpenLongPosCount", "V");
> > > > Graph2 = Foreign( "~OpenShortPosCount", "V");
> > > >
> > > > /* in Indicator Builder after running the back-test to see
the
> > > chart
> > > > of the number of Open long and short positions of your
system.
> */
> > > >
> > > > Modified Indicator code as follows:
> > > >
> > > > Graph1 = Foreign( "~OpenLongPosCount", "V");
> > > > Plot(Graph1,"OpenLongPosCount",1,style=1,0,20);
> > > > Graph2 = Foreign( "~OpenShortPosCount", "V");
> > > > Plot(Graph2,"OpenShortPosCount",2,style=1,0,20);
> > > > Plot(7,"My line",colorRed);
> > > >
> > > > Now, I show both open long (12) and short positions (5), but
> > since
> > > > the MaxOpenPos has been optimized/set to 7, the trades list
has
> > > only
> > > > 7 open positions ( 5 long and 2 short). I have no idea yet
> what
> > > the
> > > > issue selection criteria is for long and short trades,
though.
> > Can
> > > > anybody take a guess?
> > > >
> > > > rgds, Pal
> > > > --- In amibroker@xxxxxxxxxxxxxxx, "palsanand"
<palsanand@xxxx>
> > > wrote:
> > > > > I came out with the following results adding more code:
> > > > >
> > > > > eq = Foreign("~~~EQUITY", "C");
> > > > > cash = Foreign("~~~EQUITY", "L");
> > > > > dr = eq - Highest(eq);
> > > > > MR1 = 0.1;
> > > > > MR2 = 0.5;
> > > > > MaxRisk = Optimize("MaxRisk",0.10,MR1,MR2,0.05);
> > > > > Pd1=3;Pd2=12;LB1=1;LB2=17;
> > > > > MaxOpenPos= LB = Optimize("MaxOpenPos",7,LB1,LB2,1);
> > > > > //MaxOpenPos= LB = Param("MaxOpenPos",7,LB1,LB2,1);
> > > > > GPS = (MaxRisk * eq)/dr;
> > > > > PositionSize = GPS = -100/MaxOpenPos;
> > > > > MaxOpenPos =
> > > > > SetOption("MaxOpenPositions", MaxOpenPos );
> > > > > Period = Pd = Param("Period", 3, Pd1, Pd2, 1 );
> > > > > //Period = Pd = Optimize("Period", 3, Pd1, Pd2, 1 );
> > > > > OptStart = (Pd = 3) AND (LB = 1) AND (MR1 = 0.1);
> > > > >
> > > > > It was interesting to find that there were a range of
values
> > for
> > > > > MaxRisk and the same MaxOpenPos for the highest CAR/MDD and
> > UPI,
> > > > but
> > > > > all the values in the optimization were the same for this
> > range.
> > > > > Since, I want to minimize the Max% of the closed equity to
> > > > > risk/trade, I guess I need to use the minimum in this
range,
> > > which
> > > > is
> > > > > 0.10 (10% Max risked/trade).
> > > > >
> > > > > Also, concidentally or optimally, the MaxOpenPos came out
to
> be
> > > 7,
> > > > > which is also the same value I originally chose as part of
> the
> > > > trader-
> > > > > defined criteria. Still the discrepancy with the
MaxOpenPos
> > and
> > > > the
> > > > > Composite ~OpenPosCount through which I got 12 positions
open
> > > now,
> > > > > (where I plot it in a indicator window), still exists.
> > > > >
> > > > > rgds, Pal
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > --- In amibroker@xxxxxxxxxxxxxxx, "palsanand"
> <palsanand@xxxx>
> > > > wrote:
> > > > > > Thanks. I optimized the Max Open Positions to 8.
> > > > > >
> > > > > > Maxpos=Optimize("maxpos",8,1,20,1);
> > > > > > PositionSize = -100/Maxpos;
> > > > > > SetOption("MaxOpenPositions", Maxpos );
> > > > > >
> > > > > > I am getting 8 positions open in the Results window:
> > > > > >
> > > > > > 12/4/03
>
> > > > >
> > > > > >
> > > > > > Entry signals(score):GU-9967=short(-1) UC-9967=buy
> > (1)
> > > > > >
> >
> > > > > > Exit signals:GU-9967=sell UC-9967=cover
> >
> > > > > >
> > > > > > Enter Short GU-9967 Price: 1.7278
> > Shares: 250
> > > > > > Commission: 0 Rank: -1 Equity 3712.71
> >
> > > > > >
> > > > > > Enter Long UC-9967 Price: 1.3007
> > Shares: 350
> > > > > > Commission: 0 Rank: 1 Equity 3712.71
> >
> > > > > >
> > > > > > 8 Open Positions:$C-9967 $E-9967 AU-
> > 9967
> > > > > > AC-9967 E$-9967 EA-9967 GU-
> > 9967
> > > > > > UC-9967 Equity: 3718.23 Cash: 317.445
> >
> > > > > >
> > > > > > But I find a discrepancy with the Open position count
using
> > the
> > > > > > following code, where I got 11 positions open, when I
plot
> it
> > > in
> > > > a
> > > > > > indicator window using
> > > > > >
> > > > > > Graph1 = Foreign( "~OpenPosCount", "V");
> > > > > > Plot(Graph1,"OpenPosCount",1,style=1,0,100);
> > > > > >
> > > > > > The following is in Automatic Analysis:
> > > > > >
> > > > > > /* the following line uses Flip function to get "1" after
> the
> > > buy
> > > > > > signal and reset it back to "0" after sell appears. */
> > > > > >
> > > > > > in_trade = Flip( Buy, Sell );
> > > > > >
> > > > > > AddToComposite( in_trade, "~OpenPosCount", "V" );
> > > > > >
> > > > > > /* We use "~OpenPosCount" artificial ticker to store the
> > > results.
> > > > > > Again we should run just Scan of the formula AND
> > > > > the "~OpenPosCount"
> > > > > > ticker would become available.
> > > > > >
> > > > > > Use */
> > > > > >
> > > > > > Graph0 = Foreign( "~OpenPosCount", "V");
> > > > > >
> > > > > > /* in Indicator Builder after running the back-test to
see
> > the
> > > > > chart
> > > > > > of the number of Open positions of your system. */
> > > > > >
> > > > > > Can somebody tell me why this discrepancy occurs. TIA.
> > > > > >
> > > > > > rgds, Pal
> > > > > >
> > > > > >
> > > > > >
> > > > > > --- In amibroker@xxxxxxxxxxxxxxx, "bvandyke"
> <bvandyke@xxxx>
> > > > wrote:
> > > > > > > Pal,
> > > > > > >
> > > > > > > Try the following example and modify the # of positions
> as
> > > > needed:
> > > > > > >
> > > > > > > Maxpos=Optimize("maxpos",2,1,4,1);
> > > > > > > PositionSize = -100/Maxpos;
> > > > > > > SetOption("MaxOpenPositions", Maxpos );
> > > > > > >
> > > > > > > Bill
> > > > > > >
> > > > > > > --- In amibroker@xxxxxxxxxxxxxxx, "palsanand"
> > > <palsanand@xxxx>
> > > > > > wrote:
> > > > > > > > Hi All,
> > > > > > > >
> > > > > > > > Does anybody has the code for Optimizing Max Open
> > > Positions.
> > > > I
> > > > > > > > remember seeing it somewhere in AFL guides. I can't
> seem
> > > to
> > > > > find
> > > > > > > it
> > > > > > > > now or remember how to do it.
> > > > > > > >
> > > > > > > > TIA
> > > > > > > >
> > > > > > > > rgds, Pal
------------------------ Yahoo! Groups Sponsor ---------------------~-->
Buy Ink Cartridges or Refill Kits for your HP, Epson, Canon or Lexmark
Printer at MyInks.com. Free s/h on orders $50 or more to the US & Canada.
http://www.c1tracking.com/l.asp?cid=5511
http://us.click.yahoo.com/mOAaAA/3exGAA/qnsNAA/GHeqlB/TM
---------------------------------------------------------------------~->
Send BUG REPORTS to bugs@xxxxxxxxxxxxx
Send SUGGESTIONS to suggest@xxxxxxxxxxxxx
-----------------------------------------
Post AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx
(Web page: http://groups.yahoo.com/group/amiquote/messages/)
--------------------------------------------
Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.html
Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
|