public static void GoMulti() { var data = DataRetriever.GetData(indexStart_: "ES", suffix_: "Index", contractIndex_: 1); var listOfEvals = new List<ReturnsEval.DataSeriesEvaluator>(); foreach (var firstWindow in new[] {5, 10, 15, 20, 25, 50, }) { var indic = new SI.Research.Technicals.MACross(firstWindow, firstWindow * 2); var signals = indic.GenerateWeightSeries(data, null); for (int i = 0; i < signals.Length; ++i) signals.Data[i] = signals.Data[i] < 0d ? -1d : 1d; signals = CollapseToChanges(signals); if (false) { var con = new ConstructGen<double>(new[] { "Signal", "CleanPrice" }); con.SetColumnValues(0, signals); foreach (var date in con.Dates) con.SetValue(date, 1, data.ValueOnExactDate(date)); con.DisplayInGrid("changes with price levels"); } //signals.DisplayInGrid("changes"); var pnl = GeneratePnl(data, signals); var eval = new ReturnsEval.DataSeriesEvaluator(pnl.Dates, pnl.Data, string.Format("ES_{0}", firstWindow), ReturnsEval.DataSeriesType.Returns); listOfEvals.Add(eval); } listOfEvals.Display("blah"); }
public static void Go() { // var is like 'dim' // make an array of size 10 - each initalized to the default double value i.e. 0d var arr = new double[10]; // I could 'initialise' the values of this array in one call: arr = new double[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // an expanding construct is a list // make a list that I can only put doubles into var list = new List<double>(); list.Add(1); list.Add(2); list.Add(3); // this is exactly the same as using an intializer: list = new List<double> {1, 2, 3}; // I can use in built stuff to convert this to an array really easily double[] arr2 = list.ToArray(); // dictionaries are lookups or hashmaps with types var birthdays = new Dictionary<string, DateTime>(); birthdays.Add("Ben", new DateTime(1979, 12, 11)); //or birthdays["Jess"] = new DateTime(1985, 1, 19); // note, the first method (.Add) will throw an exception if the item already exists, the second method will just overwrite // might be better to: if (birthdays.ContainsKey("Ben")) birthdays.Add("Ben", new DateTime(1979, 12, 11)); // as we're dealing with time series a lot, I have created some classes that make it easier to work with dates and associated values // first of these is DatedDataCollection<T> where T is normally 'double'. // these are created with an array of Dates, and an array of 'Ts', which obviously must be of the same length, as the values correspond // NOTE: creating array on 1st, 3rd, 5th var dtsArray = new DateTime[] {new DateTime(2001, 1, 1), new DateTime(2001, 1, 3), new DateTime(2001, 1, 5)}; var valuesArray = new double[] {1.21, 1.45, 1.65}; var ddc = new DatedDataCollectionGen<double>(dtsArray, valuesArray); // obviously you wouldn't put normally create ddc like this - it normally gets populated from calls the the database or bbg initially, but we'll // look at that later var date4th = new DateTime(2001, 1, 4); var value = ddc.ValueOnExactDate(date4th); // this will fail as I'm insisting on the date being exact and there's nothing for 4th var value2 = ddc.ValueOnDate(date4th); // this will give me a value equal to that on the 3rd, since that is value for max date that is before 4th var value3 = ddc.ValueOnExactDate_Zero(date4th); // this won't fail but will pass back zero if there isn't an exact date // I've extended the classes to make it really easy to plot and see stuff ddc.DisplayColumnChart("Values in column chart"); ddc.DisplayInGrid("values in grid"); ddc.DisplayLineChart("Line chart"); // this might be a bit of a leap, but I could very quickly extract EUR values from bloomberg in the following way, and display in a graph BbgTalk.HistoryRequester.GetHistory(new DateTime(2001, 1, 1),"EUR Curncy","PX_CLOSE",true) .DisplayLineChart("EUR from bbg from 2001"); // what's this done? // BbgTalk.HistoryRequest knows how to connect to bloomberg and pulls out the series as a DatedDataCollection (so long as you're logged into bloomberg) DatedDataCollectionGen<double> euroSeries = BbgTalk.HistoryRequester.GetHistory(new DateTime(2001, 1, 1), "EUR Curncy", "PX_CLOSE", true); // then we displayed in a line chart: euroSeries.DisplayLineChart("EUR"); // what else could we do with this euro series? // convert to returns: var euroReturns = euroSeries.ToReturns(); var cumulative = euroReturns.ToCumulative(); var stdFromMean = euroSeries.ToStdevFromMean(meanWindowLength_: 21, sdWindowLength_: 126); // I've also done a load of stuff to transform this series, take a look at HelperMethods. // often, we don't deal with individual price series, though we need inline data // for this I have made something called ConstructGen<T>, where again, T is normally a double var firstConstruct = new ConstructGen<double>(9); // this has made a construct that is set up to store dated values for 9 different variables // it's good to set the columnHeadings on the construct so you know what they refer to var headings = new string[] {"AUD", "CAD", "CHF", "EUR", "GBP", "JPY", "NOK", "NZD", "SEK"}; firstConstruct.ColumnHeadings = headings; // (I'll show you how to do this more easily in a bit... // let's look at what we can do with construct and how we use it DateTime conDate = new DateTime(2014, 1, 1); firstConstruct.SetValue(conDate, 0, 100.2); // this has set the value for the first column (AUD) on the given Date // we get it out by: var v1 = firstConstruct.GetValue(conDate, 0); // set the second value: firstConstruct.SetValue(conDate, 1, 45.6); // this has set the value for the given date for 'CAD' // we could set all values at once using SetValues rather than SetValue firstConstruct.SetValues(conDate, new double[] {1, 2, 3, 4, 5, 6, 7, 8, 9}); // and we could get them out using: double[] allValuesOnDate = firstConstruct.GetValues(conDate); // there are lots of methods on Construct<T> to make our life easier when dealing with data // we can fill it up randomly using the SetValues, and then just call SortKeys() to ensure teh dates are in order firstConstruct.SortKeys(); // this means that we will be iterate over the dates in order when we go through it // e.g. foreach (DateTime date in firstConstruct.Dates) { var datesVAlues = firstConstruct.GetValues(date); // here we could process them... } // there are methods on ConstructGen<T> to make it easy to see what's in it. e.g. firstConstruct.DisplayInGrid("Grid of construct values"); firstConstruct.DisplayInDataCollectionDisplay("Display each column as a line in a chart"); // there is also a useful method to get the column of values as a DatedDataCollection<T> DatedDataCollectionGen<double> firstColumn = firstConstruct.GetColumnValuesAsDDC(0); // this is an expensive operation FYI, so you wouldn't use this iterating over the dates within the ConstructGen<T> , but it is useful // ok, now, as we have a set universe of ccys, in the way I extract data from the database (prices / weights / carry / etc) I tend to pull // out in a standard way, making a ConstructGen<double> with a column for every currency in the universe // so, for example, if I wanted the spots from the database from 2013 onwards, I would call this SI.Data.FXSpots spotsProvider = new FXSpots(); ConstructGen<double> spots = spotsProvider.GetData(new DateTime(2013, 1, 1), DateTime.Today); // this returns me a ConstructGen<double> with 27 columns, with each row being a date // I can then use the spots values as I wish // similarly SI.Data.FXForwards1Wk fwdProvider = new FXForwards1Wk(); ConstructGen<double> fwds = fwdProvider.GetData(new DateTime(2013, 1, 1), DateTime.Today); // within these classes, the data is cached, so that I don't call the database again if I don't need to // so if I call for the second time: var spots2 = spotsProvider.GetData(new DateTime(2013, 1, 1), DateTime.Today); // ... this won't have hit the database again, but will get from the cached data // but you'll notice that i have to have a reference to spotsProvider to benefit from the cached data. // if I was to make the same request from another point in my code, I would have to create a new FXSpots() instance and then call the method on it to get the data // it can be useful in this instance to make use of what's known as the 'Singleton' pattern. // This basically provides a means of referring to the same instance every time, in this case so that we make use of cached data // I have a Singleton<T> wrapper that wraps up a single instance of T so that I know I'm calling methods on the same instance every time // so I would usually get spots from the database wrapping FXSpots in this. like: spots = Singleton<FXSpots>.Instance.GetData(new DateTime(2013, 1, 1), DateTime.Today); // now I could call the method on Singleton<FXSpots>.Instance from anywhere in my code and I would benefit from the caching // I do tend to use most of the classes that retrive from the database Within SI.Data wrapped in a Singleton // another example is the class that pulls information about signals var signals = Singleton<Signals>.Instance; // this is just a list of SI.Data.Signal classes }
public static void Go_multiMA3Complex_MR(string futureStart_, string suffix_, int contractIndex_) { //var data = DataRetriever.GetData("ES", "Index", contractIndex_); var data = DataRetriever.GetData(futureStart_, suffix_, contractIndex_); DataRetriever.ChartData(futureStart_, suffix_, contractIndex_); //data = Singleton<SI.Data.FXSpots>.Instance.GetData(new DateTime(2003, 1, 1), DateTime.Today).GetColumnValuesAsDDC(SI.Data.Currency.TWD.ArrayIndex); //data = BbgTalk.HistoryRequester.GetHistory(new DateTime(2009, 1, 1), "ES1 Index", "PX_LAST", true); var listOfEvals = new List<ReturnsEval.DataSeriesEvaluator>(); var mas = new int[] {5, 10, 15, 20, 25, 30, 35, 40, 45, 50}; mas = new int[] {15}; foreach (var firstWindow in mas ) { var args = new SI.Research.Technicals.MA3ComplexArgs() { MA1Win = firstWindow, MA2Win = firstWindow*2, MA3Win = firstWindow*4, Long = -1d, Long_1MA = -0.5d, Long_2MA = 0.5d, Short = 1d, Short_1MA = 0.5d, Short_2MA = -0.5d }; var indic = new SI.Research.Technicals.MA3ComplexIndicator(args); var signals = indic.GenerateWeightSeries(data, null); signals = CollapseToChanges(signals); if (true) { var con = new ConstructGen<double>(new[] { "Signal", "CleanPrice" }); con.SetColumnValues(0, signals); foreach (var date in con.Dates) con.SetValue(date, 1, data.ValueOnExactDate(date)); con.DisplayInGrid("changes with price levels"); } //signals.DisplayInGrid("changes"); var pnl = GeneratePnl(data, signals); var eval = new ReturnsEval.DataSeriesEvaluator(pnl.Dates, pnl.Data, string.Format("{2}_{0}_{1}", contractIndex_, args.ToString(),futureStart_), ReturnsEval.DataSeriesType.Returns); listOfEvals.Add(eval); //eval.Display(eval.Name); //pnl.ToCumulative().DisplayLineChart("ES"); } listOfEvals.Display("blah"); }
public static void Compare(string indexStart_, string suffix_) { var closePrices = GetData(indexStart_, suffix_); var closePrices2 = GetData2(indexStart_, suffix_); var con = new ConstructGen<double>(new string[] { "First", "Second" }); con.SetColumnValues(0, closePrices); con.SetColumnValues(1, closePrices2); if (con.NeedsToSortKeys()) con.SortKeys(); con.DisplayInGrid("Compare"); }