[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [amibroker] Re: Simulating the Leveraged ETFs



PureBytes Links

Trading Reference Links

Grant, this may help.  I wrote this to create simulated QLD & QID (regular & 
inverse) 2x ETFs for QQQQ.
As noted in the comments, the current prices of the composites aren't 
anywhere near the current ETF prices because they
have different starting points in the underlying symbol, but the price 
movement matches well.

Unfortunately the real ETFs only approximate the 2x leverage.  The real ETFs 
are close to 2x, but backtesting results
using the 2x composites the code builds need to be treated with a little 
caution.  For charting they could be just fine.

I don't think you'll need to do much besides changing the date in the 
dtnum[k] condition (for SPY I think it's 930129) and
changing "qld" & "qid" to the appropriate values for SPY ETFs.

Regards,

Bob

// MyQID_QLD_Composites.afl
// simulate 'perfect' 2X QQQQ ETFs, QLD & the Inverse ETF, QID
// Run using 'current symbol' with current symbol set to QQQQ
// Note: since this has much different starting point than the real ETFs, 
the current prices
// are very different than the real ETFs, but comparing the charts 
side-by-side, the
// relative price movement is very close.

SetBarsRequired(99999,99999);
Buy=0;
Sell=0;

Ochng=(O - Ref(C,-1))/Ref(C,-1);
Hchng=(H - Ref(C,-1))/Ref(C,-1);
Lchng=(L - Ref(C,-1))/Ref(C,-1);
Cchng=(C - Ref(C,-1))/Ref(C,-1);

qldOchng=2 * Ochng;
qldHchng=2 * Hchng;
qldLchng=2 * Lchng;
qldCchng=2 * Cchng;

// Reverse Hi/Lo for QID
qidOchng=-2 * Ochng;
qidHchng=-2 * Lchng;
qidLchng=-2 * Hchng;
qidCchng=-2 * Cchng;

qld0=0;
qldh=0;
qldl=0;
qldc=0;
qid0=0;
qidh=0;
qidl=0;
qidc=0;
dtnum=DateNum();
baridx=BarIndex();

/*
I use datastart() to find the barindex of the beginning of my QQQQ data.
AddToComposite() apparently builds the arrays beginning with the earliest
date in the database, not the earliest date of the symbol being used. That
makes sense since ATC is designed for building multi-symbol composites.
But.. in a case like this that's a problem because my QuotesPlus data
'rolls' forward. Today my database goes back to 2/28/90. Tomorrow it
will only go back to 3/1/90. QQQQ started on 3/10/99 so I have to find
that BarIndex dynamically.
Once the composite is built, you'll still need to use Quotes Editor if
you want to delete all the empty elements in the composites prior to the
start of the data.
*/

function datastart()
{
    start=0;
    for ( k = 0; k < BarCount ; k++ )
   {
        if ( dtnum[k] == 990310 )
       {
            start=baridx[k];
            break;
       }
    }

   return start;
}
dstart=datastart();
QLDO[dstart]=O[dstart];
QLDH[dstart]=H[dstart];
QLDL[dstart]=L[dstart];
QLDC[dstart]=C[dstart];

// Reverse Hi/Lo for QID & reposition initial O,C for the inverse ETF

QIDO[dstart]=L[dstart]+(H[dstart]-O[dstart]);
QIDH[dstart]=L[dstart];
QIDL[dstart]=H[dstart];
QIDC[dstart]=H[dstart]-(C[dstart]-L[dstart]);

// Start the composites 1 bar past the underlying symbol
for ( i = dstart+1; i < BarCount ; i++ ) {
       qldO[i]=qldC[i-1]*(1+qldOchng[i]);
       qldC[i]=qldC[i-1]*(1+qldCchng[i]);
       qldH[i]=qldC[i-1]*(1+qldHchng[i]);
       qldL[i]=qldC[i-1]*(1+qldLchng[i]);
       qidO[i]=qidC[i-1]*(1+qidOchng[i]);
       qidC[i]=qidC[i-1]*(1+qidCchng[i]);
       qidH[i]=qidC[i-1]*(1+qidHchng[i]);
       qidL[i]=qidC[i-1]*(1+qidLchng[i]);
}

AddToComposite(qldO,"~QLD","O",atcFlagDefaults);
AddToComposite(qldH,"~QLD","H",atcFlagDefaults);
AddToComposite(qldL,"~QLD","L",atcFlagDefaults);
AddToComposite(qldC,"~QLD","C",atcFlagDefaults);
AddToComposite(V,"~QLD","V",atcFlagDefaults);
AddToComposite(qidO,"~QID","O",atcFlagDefaults);
AddToComposite(qidH,"~QID","H",atcFlagDefaults);
AddToComposite(qidL,"~QID","L",atcFlagDefaults);
AddToComposite(qidC,"~QID","C",atcFlagDefaults);


----- Original Message ----- 
From: "longarm61" <norm1@xxxxxxxxxxx>
To: <amibroker@xxxxxxxxxxxxxxx>
Sent: Tuesday, April 28, 2009 3:23 PM
Subject: [amibroker] Re: Simulating the Leveraged ETFs


> Thanks for the replies, Brian.  I'm very much inept when it comes to AFL 
> so I'll have to try to make sense of it all.  In answer to your previous 
> post, my plan was to use it for charting, but backtesting capability might 
> come in handy too. Charting would be the priority though.
>
> Thanks again,
>
> Grant
>
>
> --- In amibroker@xxxxxxxxxxxxxxx, "brian_z111" <brian_z111@xxx> wrote:
>>
>> Grant,
>>
>> I found your idea interesting so I did a little bit more.
>>
>> > 1) make separate arrays for ROC(X,1) where X = O,H,L,C,Ave etc (as 
>> >  >required)
>> >
>> > factorO = ROC(O,1);//as GrowthFactor e.g. 2% = 1.02, -2% = 0.98
>> > etc
>>
>> I missed a couple of steps out ... you probably figured that already but 
>> just in case here is an excel file that demos the logic ... I show two 
>> methods to produce a simulated leveraged price series from a base price 
>> series; log/antilog and relativeGeometricMean.
>>
>> Scroll down to section 2 Miscellaneous Files >> LeveragedPriceSeries.xls
>>
>> http://zboard.wordpress.com/downloads/
>>
>>
>>
>>
>>
>>
>>
>> --- In amibroker@xxxxxxxxxxxxxxx, "brian_z111" <brian_z111@> wrote:
>> >
>> > To toggle your thinking:
>> >
>> > (I am just imagining a chart to start with ... not sure what your final 
>> > objective is ... if PLOTOHLC helps you could work it towards a 
>> > backtesting array version ... versions might be different depending on 
>> > whether you want it for chart reading, backtesting or both)
>> >
>> > 1) make separate arrays for ROC(X,1) where X = O,H,L,C,Ave etc (as 
>> > required)
>> >
>> > factorO = ROC(O,1);//as GrothFactor e.g. 2% = 1.02, -2% = 0.98
>> > etc
>> >
>> > 2) substitute factorO, factorH etc in PLOTOHLC example
>> > - when you want to go back to 'Price', instead of leveraged Price, use 
>> > factor == 1, which is ROC neutral.
>> >
>> > 3) if you get something going there and you like it maybe ParamToggle 
>> > will let you switch from Price to Leveraged Price in live chart mode
>> >
>> >     - ParamToggle is boolean so toggle P or LP yes or no?
>> >     - conditional statement (if toggle is yes use leveraged price 
>> > array)
>> >
>> > There would be other ways so comeback if you want options.
>> >
>> > I think ATC can store conditioned arrays so you could also use that and 
>> > save leveraged Price arrays as pseudo tickers (if you aren't up to 
>> > speed on ATC reference Hermans PDF tutorial at the UKB).
>> >
>> >
>> >
>> > --- In amibroker@xxxxxxxxxxxxxxx, "longarm61" <norm1@> wrote:
>> > >
>> > > Thanks much, Brian, I will look into that.
>> > >
>> > > Grant
>> > >
>> > > --- In amibroker@xxxxxxxxxxxxxxx, "brian_z111" <brian_z111@> wrote:
>> > > >
>> > > > What about  211. (indexed from AFL by name) PLOTOHLC (Exploration / 
>> > > > Indicators) - plot custom OHLC chart (AFL 2.2)
>> > > >
>> > > > Will that do the job?
>> > > >
>> > > >
>> > > > --- In amibroker@xxxxxxxxxxxxxxx, "longarm61" <norm1@> wrote:
>> > > > >
>> > > > > Hi, I'm guessing that this is a simple thing, but of course, it's 
>> > > > > not for me. I'm trying to simulate the performance of leveraged 
>> > > > > ETFs going back farther than they go back themselves, hence the 
>> > > > > following:
>> > > > >
>> > > > > I would like to plot a line which moves 2x percentage-wise the 
>> > > > > gain/loss of a particular stock PER DAY (bar).  E.g., if I have 
>> > > > > SPY up, and SPY moves up 1% on Monday, the line moves up 2%.  If 
>> > > > > SPY moves down .5% on Tuesday, the line moves down 1%.  And so 
>> > > > > on.  It'd be nice to have an option to switch between PRICE and 
>> > > > > PERCENTAGE on the current value (from the first bar showing to 
>> > > > > the last), but if it's a choice between one or the other, I'd 
>> > > > > prefer price.
>> > > > >
>> > > > > Thanks so much for any assistance on this.
>> > > > >
>> > > > > Grant
>> > > > >
>> > > >
>> > >
>> >
>>
>
>
>
>
> ------------------------------------
>
> **** IMPORTANT PLEASE READ ****
> This group is for the discussion between users only.
> This is *NOT* technical support channel.
>
> TO GET TECHNICAL SUPPORT send an e-mail directly to
> SUPPORT {at} amibroker.com
>
> TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
> http://www.amibroker.com/feedback/
> (submissions sent via other channels won't be considered)
>
> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> http://www.amibroker.com/devlog/
>
> Yahoo! Groups Links
>
>
>



------------------------------------

**** IMPORTANT PLEASE READ ****
This group is for the discussion between users only.
This is *NOT* technical support channel.

TO GET TECHNICAL SUPPORT send an e-mail directly to 
SUPPORT {at} amibroker.com

TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
http://www.amibroker.com/feedback/
(submissions sent via other channels won't be considered)

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

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/