Wednesday, 7 March 2012

Robust Repeated Median

Following on from a quick post to this Trading Blox forum thread I provide the C++ .oct function code for my implementation of the Robust Repeated Median in the code box below. Due to formatting issues the headers are not shown; they should be:-
#include octave/oct.h
#include octave/dColVector.h
#include octave/parse.h // necessary for the call to feval
#include octave/ov.h // necessary for conversion to double
enclosed within a header brace e.g. "<>"
DEFUN_DLD (my_rep_median, args, , "Input is a column vector of values, output is a repeated median straight line fit of these values.")
{
    octave_value_list retval_list;

    if ( args(0).length () < 3 )
    {
        error ( "Invalid arguments. Input is a column vector of values" );
        return retval_list;
    }
    
    if ( error_state )
    {
        error ( "Invalid arguments. Input is a column vector of values" );
        return retval_list;
    }
    
    ColumnVector rep_median_compile_input = args(0).column_vector_value (); // input vector
    ColumnVector rep_median_compile_output = rep_median_compile_input; // copy of input vector to hold repeated median straight line fit

    octave_value_list median_calc_return; // declare an octave value to hold output of feval call to Octave median function
    double slope; // declare a double value to hold final value of slope
    double intercept; // declare a double value to hold final value of intercept
    ColumnVector i_slopes ( args(0).length () - 1 ); // array to hold individual point-to-point slopes
    ColumnVector i_intercepts ( args(0).length () - 1 ); // array to hold individual point-to-point intercepts
    ColumnVector slope_medians ( args(0).length () ); // array to hold medians of non-matched point-to-point slopes
    ColumnVector intercept_medians ( args(0).length () ); // array to hold medians of non-matched point-to-point intercepts
    int jj_tmp_count; // non-matched point-to-point count for filling above arrays (necessary because of jj != ii loop condition)

    for (octave_idx_type ii (0); ii < args(0).length (); ii++) 
    {

      jj_tmp_count = 0; // initialise to 0 for each separate ii loop

        for (octave_idx_type jj (0); jj < args(0).length (); jj++)
        {
             if (jj != ii) // condition avoids matching a point to itself!
             {
                i_slopes(jj_tmp_count) = ( rep_median_compile_input(jj) - rep_median_compile_input(ii) ) / ( (jj) - (ii) ); // slope between distinct points

                i_intercepts(jj_tmp_count) =  rep_median_compile_input(jj) - ( i_slopes(jj_tmp_count) * jj ); // calc intercept b = y - mx

                jj_tmp_count = jj_tmp_count + 1; // increment counter only when condition avoids matching a point to itself!
             }
        }                
 
                median_calc_return = feval ( "median", octave_value (i_slopes) );
                slope_medians(ii) = median_calc_return(0).double_value ();

                median_calc_return = feval ( "median", octave_value (i_intercepts) );
                intercept_medians(ii) = median_calc_return(0).double_value ();

    }    

        median_calc_return = feval ( "median", octave_value (slope_medians) );
        slope = median_calc_return(0).double_value (); 

        median_calc_return = feval ( "median", octave_value (intercept_medians) );
        intercept = median_calc_return(0).double_value (); 

    for (octave_idx_type ii (0); ii < args(0).length (); ii++) // loop to fill output column_vector with repeated_median line fit values
    {
        rep_median_compile_output(ii) = slope * ii + intercept;
    }

    retval_list(2) = intercept;
    retval_list(1) = slope;
    retval_list(0) = rep_median_compile_output;

    return retval_list;
}
For more information about the Robust Repeated Median, interested readers are referred to this webpage and this pdf file. Taking the example given in this linked pdf, the above function gives this plot
where it can be seen that the regression line is completely unaffected by the two outliers. As always, if readers see any errors in my code or can suggest improvements, please let me know.

Tuesday, 28 February 2012

Interesting Blog Post

I have just read an interesting blog post here which could be seen as a possible confirming factor for my prediction (my previous post) of a retracement in the S&P and consequent run-up or volatility in gold.

Monday, 27 February 2012

Gold Delta Solution

I'm not going to make a habit of posting all solutions as I complete the coding and deployment of them, but I thought readers might be interested in the Delta solution for gold (gc) shown below.
It's interesting because, according to Delta, gold is now in its inversion window on the MTD time frame, shown on the above chart as the two solid red vertical lines. By my count the first MTD red line marks a low, the green MTD a high point 1, followed by a possible in-between-point (IBP), which if it holds means higher prices are indicated for the high MTD point 2 in about 2 to 4 weeks time. However, at that time the ITD time frame will be in its inversion window too. Delta theory says that big moves can be expected around point 1 (in the inversion time window) and here we have two inversion time windows coinciding! Gold may very well experience some big move or increased volatility in the next few weeks, maybe as a result of a flight to safety from the unusual recent run-up in the S&P (see the chart in my previous post) and its impending correction. I look forward to seeing how this interpretation based on Delta pans out.

Sunday, 26 February 2012

Testing Delta, Conclusion

This post will be the last in this series that tests the Delta Phenomenon, and acts as a summary of the previous posts. Part 1 talks about the "breakthrough" R coding that made the series of tests possible, part 2 was a general discussion about the subjectiveness of Delta, part 3 introduced the methodology of my statistical tests of Delta, with R code of the test routine, parts 4 & 5 present the results of the tests on the S&P 500 MTD solution, and part 6 the results of the ITD solution. The final results in posts 4, 5 & 6 mean that the null hypothesis of no predictive ability for Delta can be rejected, and thus the alternative hypothesis of Delta having predictive ability is accepted.

One should be cautioned, however, that statistical significance is not necessarily of practical significance, and perhaps one should ask why the Delta Phenomenon should work at all? A lot of the criticism I have read on forums etc. obviously relates to the difficulty of actually using Delta in trading. Another theme of criticism relates to the supposed "astrological" aspect of Delta and therefore some rather dismissive comments relegating Delta to the realm of crystal-ball gazing, mumbo-jumbo. I think this second form of criticism is ill-founded and rather ignorant. If you think about it, the interaction of the Sun and Earth, the phases of the moon etc. are just another way of saying "seasonality" and I think it is pretty well accepted that there is seasonality in, for example, agricultural commodity futures, oil futures etc. This seasonality may well be reflected in the share prices/indices by the linkage of large commercial interests in these areas, and various knock-on effects in trade, currency movements etc. My take on Delta is that it can be regarded as a sophisticated form of seasonal analysis, and all the normal caveats that would apply to trading seasonal tendencies should also apply to Delta.

Accepting that there could be some reasonable fundamental justification for Delta and that it has been shown to be statistically significant in terms of its accuracy as described by the methodology, how does one actually trade it? Some guidelines might be gleaned from these sample reports from a Delta timing service. Reading these sample reports shows how a knowledge of Delta can be used to draw inferences from current market action and to perhaps formulate a suitable trading strategy. Of course, analysis such as this is not a 100% mechanical approach, but it may very well add real value to the bottom line.

Given this, I have decided to deploy all the other Delta solutions I have to create Delta Charts that look like this
where the solid vertical lines are the MTD solution and the dashed the ITD solution. Doing this across the 30 or so commodities I regularly track will probably take me a few weeks. Once done, I will think about how to combine Delta with the other indicators I have mentioned in previous posts and test a trading system based on them. More in due course.

Sunday, 19 February 2012

Testing the Delta Phenomenon, Part 6

I have now finished the testing of the Intermediate Term solution for the S&P 500 and summary results are shown below, giving the test period for each separate test conducted (15 in total) along with the test statistic of the actual data and the p-value percentage, which should be read as the percentage of random permutations (500,000 in total for each test) that were as good as or better than the actual test statistic in question for that period. The period for each test covers the time span for one complete cycle of the solution, i.e. from point 1 to point 12 of the solution. The entire test period more or less corresponds with the period for the earlier Medium Term solution tests, and as in those previous tests, the data for the period is out of sample data, i.e. not "seen" by the solution prior to the tests being conducted.

5th March 2007 (4445) to 25th June 2007 (4557)
[1] 3.5
[1] 0.3668 %

3rd July 2007 (4565) to 22nd Oct 2007 (4676)
[1] 4.75
[1] 3.3826 %

30th Oct 2007 (4684) to 17th Feb 2008 (4794)
[1] 4.583333
[1] 2.8366 %

25th Feb 2008 (4802) to 14th June 2008 (4912)
[1] 3.916667
[1] 0.9496 %

17th June 2008 (4915) to 10th Oct 2008 (5030)
[1] 3.333333
[1] 0.2472 %

18th Oct 2008 (5038) to 5th Feb 2008 (5148)
[1] 3.333333
[1] 0.2524 %

9th Feb 2009 (5152) to 4th June 2009 (5267)
[1] 5.083333
[1] 4.7866 %

5th June 2009 (5268) to 2nd Oct 2009 (5387)
[1] 5.333333
[1] 5.477 %

9th Oct 2009 (5394) to 29th Jan 2010 (5506)
[1] 4.25
[1] 1.9232 %

2nd Feb 2010 (5510) to 4th June 2010 (5632)
[1] 4.230769
[1] 1.306 %

31st May 2010 (5628) to 21st Sept 2010 (5741)
[1] 3.583333
[1] 0.4506 %

23rd Sept 2010 (5743) to 28th Jan 2011 (5870)
[1] 3.538462
[1] 0.2902 %

31st Jan 2011 (5873) to 21st May 2011 (5983)
[1] 4.083333
[1] 1.5542 %

31st May 2011 (5993) to 8th Sept 2011 (6093)
[1] 4.272727
[1] 3.2184 %

16th Sept 2011 (6101) to 2nd Feb 2012 (6240)
[1] 3.928571
[1] 0.2982 %

As can be seen, if 5 % is taken as the level of statistical significance only one test fails to reject the null hypothesis, and 7 out of the remaining 14 are statistically significant at the 1 % level. I also repeated the test several times over the entire data period, encompassing a total of 182 separate turning points with a test statistic of 4.10989 for these 182 points. In these repeated tests (for a total of a few million permutations) not a single permutation was as good as or better than the given test statistic! These results are much better than I had anticipated and I therefore consider Delta to have passed these tests as well. For readers' interest a plot of the period in which the null hypothesis is not rejected is shown below,

where the yellow lines are my identification of the actual turning points and the white, red and green lines are the turning points projected by the solution.

Now that this series of tests is complete, and Delta has passed them, what does it all mean? This will be the subject of my next post.

I've Missed the Delta Training :'-(

I'm not quite sure how it happened, but I've missed the opportunity to take part in the Delta training sessions that I mentioned in my previous post. I installed an IRC client and went to the forex #training channel and was able to download the course materials from a linked Skydrive account, but on the day the training began I couldn't access the #training channel. In hindsight it may have been due to my unfamiliarity with the IRC client (this was the first time I'd ever used IRC) and some confusion on my part with the various log messages. I contacted the #help channel and I was told that access to the training is now closed and there is no information about any repeat of the course. All in all, very disappointing.

Perhaps the anonymous reader who alerted me to the course in the first place has more information? I would be grateful to hear from you again.

Wednesday, 15 February 2012

Delta Training Starts Tomorrow!

As a comment to my earlier post "Anonymous" left this information

...there is a Delta Phenomenon multi-week training session via IRC by a group of DP experts!.. The classes are Monday, Wednesday and Friday 2-5pm EST starting on February 16th. irc server irc.forex.com #training

I shall try to attend these training sessions, and look forward to them.