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

[amibroker] Re: Non Continuous StDev Calculation



PureBytes Links

Trading Reference Links

Ken,

Thanks for the code.

I have a use for StDev of noncontinuous data as part of "inline 
metrics" so I was following your thread and I also diverted to see 
what I could come up with.

It turns out your restatement of the StDev equation was just what I 
needed:

> A = (GainUpSq) / UpDays;
> B = (GainUpSum / UpDays)^2;
> SdUp = sqrt(A - B);


I was using StDev == SqRt (Sum variance^2/N) and having some 
challenges with it so you saved the day.

If you came up with that by yourself you must be quite handy a math - 
I doubt if I could have figured that one.

Thanks - nice work.

brian_z

 --- In amibroker@xxxxxxxxxxxxxxx, "Ken Close" <ken45140@xxx> wrote:
>
> Someone asked me to share the code I got running to calculate non-
continuous
> standard deviations.  You may recall that my application was to 
find the
> StDev of any month in which the total gain for the month was 
positive.
>  
> I made an extract of the code for your use and education, although 
I must
> warn that while it calculates the numbers correctly for the symbols 
and
> ranges I have tested it on, it exhibits some behavior that I am 
unable to
> explain. I am nervous about code with unexplained results, even if 
the
> calculations I am interested in are produced accurately.  I will 
describe
> this problem in a moment.
>  
> The code, copied below, will produce the correct calculations for 
daily
> symbols and will determine the StDev for days where the one day ROC 
is
> positive and the same for when it is negative.  I have left all of 
the
> intermediate calculation columns visible in the AA window for your
> inspection. You can obviously delete these or hide them and only 
display the
> data you want to see.  You can obviously change the non-continuous 
variable
> from the one day ROC.
>  
> The interesting and unexplained happening requires a look into the 
code.
> For those interested, if you look under the loop section for the 
negative
> ROC calculation, you will see a variable line like this:
> NumDn[FirstBar -1] = 0;
>  
> This (obviously) initializes the array NumDn.  However, NumDn is 
not used
> anywhere in any subsequent line of calculation.  But!!  If I delete 
this
> line or comment it out, then the calculation for GainDnSq 
(initialized in
> the very next line) disappears and its array becomes {Empty}.  
Reinstate the
> NumDn variable and the calculation for GainDnSq completes as it 
should.  I
> have not discovered the answer to this puzzle and those of you who 
see it,
> let me know if you figure it out.  It may have to do with cached 
values and
> variables in memory.
>  
> Anyway, here is the code:  It is a standalone code and should run 
(watch out
> for line breaks in your email window). Do a symtax check before 
trying to
> run it.
> Ken
>  
>  
> // NonContinuousStDev.afl KSC
> // Purpose: to calculate the StDev of non-continuous data such as 
all of the
> // positive daily ROC values
> // Establish a testing period
> StartDate = ParamDate("StartDate","12/31/2007");
> EndDate = ParamDate("EndDate","06/30/2008");
> BIR = IIf(Status("BarInRange") > 0, 1, 0);
> FirstBar = LastValue(ValueWhen(Status("FirstBarInRange") > 0, Cum
(1)));
> LastBar = LastValue(ValueWhen(Status("LastBarInRange") > 0, Cum
(1)));
> AllDates = DateNum();
> Per1 = BarsSince(AllDates == StartDate)+1;
> // Calculate the non-continuous data
> Gain = ROC(C,1);
> UpDays = Sum(IIf(Gain > 0, 1, 0),Per1);
> DnDays = Sum(IIf(Gain < 0, 1, 0),Per1);
> PCUp = UpDays / (UpDays + DnDays);
> // Routine to calculate StdDev of Positive Monthly Gains
> GainUpSq[FirstBar-1] = 0;
> GainUpSum[FirstBar-1] = 0;
> for (k=FirstBar-1; k < LastBar ; k++ )
>     { 
>         if (Gain[k] > 0) 
>         {
>             GainUpSum[k] = GainUpSum[k-1] + Gain[k];
>             GainUpSq[k] = GainUpSq[k-1] + (Gain[k])^2;
>         }
>         else 
>         {
>             GainUpSum[k] = GainUpSum[k-1]; 
>             GainUpSq[k] = GainUpSq[k-1];
>         }
>     }
> A = (GainUpSq) / UpDays;
> B = (GainUpSum / UpDays)^2;
> SdUp = sqrt(A - B);
> // Routine to calculate StdDev of Negative Monthly Gains
> // k = BarNo;
> NumDn[FirstBar-1] = 0;
> GainDnSq[FirstBar-1] = 0;
> GainDnSum[FirstBar-1] = 0;
> for (k=FirstBar-1; k < LastBar ; k++ )
>     { 
>         if (Gain[k] < 0) 
>             {
>                 GainDnSum[k] = GainDnSum[k-1] - Gain[k];
>                 GainDnSq[k] = GainDnSq[k-1] + (Gain[k])^2; 
>             }
>         else 
>             {
>                 GainDnSum[k] = GainDnSum[k-1];
>                 GainDnSq[k] = GainDnSq[k-1];
>             }
>     }
>  
>  
>  
> AD = Nz((GainDnSq) / DnDays);
> BD = Nz((GainDnSum / DnDays))^2;
> SdDn = sqrt(Nz(AD - BD));
>  
> PercentUpDays = 100 * (UpDays / (UpDays + DnDays));
>  
> Filter = Status("lastBarinRange");
> Filter = 1;
> Cd = colorDefault;
> AddColumn(C,"Price",1.2,Cd,Cd,80);
> AddColumn(Gain,"Gain",1.2,Cd,Cd,80);
> AddColumn(Per1,"TotalDays",1.0,Cd,Cd,90);
> AddColumn(UpDays,"UpDays",1.0,Cd,Cd,90);
> AddColumn(100 * PCUp,"PCentUpDays",1.2);
> AddColumn(GainUpSum,"GainUpSum",1.2,Cd,Cd,110);
> AddColumn(GainUpSq,"GainUpSq",1.2,Cd,Cd,110);
> AddColumn(A,"A",1.2,Cd,Cd,110);
> AddColumn(B,"B",1.2,Cd,Cd,110);
> AddColumn(SdUp,"Stndev Up Gains",1.2,Cd,Cd,120);
> AddColumn(DnDays,"DnDays",1.0,Cd,Cd,90);
> AddColumn(GainDnSum,"GainDnSum",1.2,Cd,Cd,110);
> AddColumn(GainDnSq,"GainDnSq",1.2,Cd,Cd,110);
> AddColumn(AD,"AD",1.2,Cd,Cd,110);
> AddColumn(BD,"BD",1.2,Cd,Cd,110);
> AddColumn(SdDn,"Stndev Down Gains",1.2,Cd,Cd,120);
>



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

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/