package com.activequant.timeseries; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TimeZone; import java.util.Map.Entry; import org.springframework.context.support.ClassPathXmlApplicationContext; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import com.activequant.domainmodel.TimeFrame; import com.activequant.domainmodel.TimeStamp; import com.activequant.interfaces.utils.IEventListener; import com.activequant.utils.CsvMapReader; public class TSContainerMethodsTest extends TestCase { TSContainer2 timeSeries; String[] headers = new String[] { "Ask", "Bid", "High", "Low" }; TSContainer2 tsc = null; /* * Create the test case * * @param testName name of the test case */ public TSContainerMethodsTest(String testName) { super(testName); } @Override protected void setUp() throws Exception { super.setUp(); List<TypedColumn> columns = new ArrayList<TypedColumn>(); columns.add(new DoubleColumn()); columns.add(new DoubleColumn()); columns.add(new DoubleColumn()); columns.add(new DoubleColumn()); timeSeries = new TSContainer2(TSContainerTest.class.getName(), Arrays.asList(headers), columns); timeSeries.setRow(new TimeStamp(new Date(1336305521100L)), new Double[] { 2.0, 2.1, 2.2, 2.3 }); timeSeries.setRow(new TimeStamp(new Date(1336305521300L)), new Double[] { 4.0, 4.1, 4.2, 4.3 }); timeSeries.setRow(new TimeStamp(new Date(1336305521000L)), new Double[] { 1.0, 1.1, 1.2, 1.3 }); timeSeries.setRow(new TimeStamp(new Date(1336305521200L)), new Double[] { 3.0, 3.1, 3.2, 3.3 }); } /** * @return the suite of tests being tested */ public static Test suite() { return new TestSuite(TSContainerMethodsTest.class); } public void test() { TSContainer2 in = new TSContainer2("Test", Arrays.asList(new String[] { "A" }), Arrays.asList(new TypedColumn[] { new DoubleColumn() })); in.setRow(new TimeStamp(5L), 1.0); in.setRow(new TimeStamp(10L), 2.0); in.setRow(new TimeStamp(15L), 3.0); in.setRow(new TimeStamp(20L), 4.0); in.setRow(new TimeStamp(25L), 5.0); in.setRow(new TimeStamp(30L), 6.0); assertEquals(1.0, in.getRow(new TimeStamp(5L))[0]); assertEquals(2.0, in.getRow(new TimeStamp(10L))[0]); TSContainerMethods tcm = new TSContainerMethods(); TSContainer2 resampled1 = tcm.resample(in, 1L); assertEquals(in.getNumRows(), resampled1.getNumRows()); } public void testReturns() { TSContainerMethods tcm = new TSContainerMethods(); TSContainer2 tsc = tcm.returns(timeSeries); assertNull(tsc.getColumn("Ask").get(0)); assertEquals((2.0 - 1.0) / 1.0, tsc.getColumn("Ask").get(1)); assertEquals((3.0 - 2.0) / 2.0, tsc.getColumn("Ask").get(2)); assertEquals((3.1 - 2.1) / 2.1, tsc.getColumn("Bid").get(2)); assertEquals((4.2 - 3.2) / 3.2, tsc.getColumn("High").get(3)); assertEquals((4.3 - 3.3) / 3.3, tsc.getColumn("Low").get(3)); } public void testMean() { TSContainerMethods tcm = new TSContainerMethods(); Double[] mean = tcm.mean(timeSeries); assertEquals( ((2.0 - 1.0) / 1.0 + (3.0 - 2.0) / 2.0 + (4.0 - 3.0) / 3.0) / 3, mean[0]); assertEquals( ((2.3 - 1.3) / 1.3 + (3.3 - 2.3) / 2.3 + (4.3 - 3.3) / 3.3) / 3, mean[3]); } public void testStd() { TSContainerMethods tcm = new TSContainerMethods(); Double[] std = tcm.std(timeSeries); assertEquals(0.283278862, std[0], 0.000000001); } @SuppressWarnings("rawtypes") public void testMaxDrawdown() { List<TypedColumn> columns = new ArrayList<TypedColumn>(); columns.add(new DoubleColumn()); columns.add(new DoubleColumn()); columns.add(new DoubleColumn()); columns.add(new DoubleColumn()); TSContainer2 tsc = new TSContainer2(TSContainerTest.class.getName(), Arrays.asList(headers), columns); DoubleColumn testData = new DoubleColumn(); // this test data is taken from matlab // http://www.mathworks.com/help/toolbox/finance/bqxcira-1.html#bqxcira-3 testData.clear(); testData.add(1.00000); testData.add(1.01680); testData.add(1.00600); testData.add(1.00940); testData.add(0.99060); testData.add(0.95165); testData.add(0.95500); testData.add(0.98522); testData.add(0.99530); testData.add(0.99127); testData.add(0.99060); testData.add(1.01280); testData.add(0.99396); testData.add(0.99328); testData.add(0.95097); testData.add(0.89993); testData.add(0.90934); testData.add(0.84822); testData.add(0.88784); testData.add(0.92881); testData.add(0.90463); testData.add(0.89053); testData.add(0.88046); testData.add(0.87777); testData.add(0.92478); testData.add(0.97045); testData.add(0.97985); testData.add(0.97246); testData.add(0.98187); testData.add(0.98522); testData.add(1.01280); testData.add(1.02150); testData.add(1.06180); testData.add(1.07450); testData.add(1.09200); testData.add(1.08870); testData.add(1.06380); testData.add(1.06510); testData.add(1.08260); testData.add(1.06720); testData.add(1.07920); testData.add(1.08530); testData.add(1.09740); testData.add(1.12290); testData.add(1.15040); testData.add(1.14040); testData.add(1.15780); testData.add(1.14370); testData.add(1.13230); testData.add(1.15580); testData.add(1.16520); testData.add(1.18330); testData.add(1.18400); testData.add(1.18600); testData.add(1.16320); testData.add(1.19070); testData.add(1.19680); testData.add(1.21630); testData.add(1.22230); testData.add(1.22430); testData.add(1.23440); List<TypedColumn> l = new ArrayList<TypedColumn>(); l.add((DoubleColumn) testData.clone()); l.add((DoubleColumn) testData.clone()); l.add((DoubleColumn) testData.clone()); l.add((DoubleColumn) testData.clone()); tsc.setColumns(l); TSContainerMethods tcm = new TSContainerMethods(); Double[] drawdown = tcm.maxDrawdown(tsc); for(int i=0; i<tsc.getNumColumns(); i++) { assertEquals(0.1658, drawdown[i], 0.00001); } } public void testMaxRecovery() { TSContainer2 in = new TSContainer2("Test", Arrays.asList(new String[] { "A" }), Arrays.asList(new TypedColumn[] { new DoubleColumn() })); in.setRow(new TimeStamp(5L), 6.0); in.setRow(new TimeStamp(10L), 5.0); in.setRow(new TimeStamp(15L), 4.0); in.setRow(new TimeStamp(20L), 3.0); in.setRow(new TimeStamp(25L), 2.0); in.setRow(new TimeStamp(30L), 1.0); TSContainerMethods tcm = new TSContainerMethods(); assertEquals((Integer)5, tcm.maxRecoveryTime(in)[0]); } public void testAverageProfitPerSlot() throws Exception { final TimeStamp from = null; List<TypedColumn> columns = new ArrayList<TypedColumn>(); columns.add(new DoubleColumn()); columns.add(new DoubleColumn()); columns.add(new DoubleColumn()); columns.add(new DoubleColumn()); columns.add(new DoubleColumn()); String[] headers = new String[] { "VOLUME", "OPEN", "CLOSE", "MIN", "MAX" }; tsc = new TSContainer2(TSContainerTest.class.getName(), Arrays.asList(headers), columns); final SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); final CsvMapReader cmr = new CsvMapReader(); IEventListener el = new IEventListener<Map<String, String>>() { @SuppressWarnings("unchecked") @Override public void eventFired(Map<String, String> event) { final String date = event.get("DATE"); String time = event.get("TIME"); if(time==null)time = "00:00:00.000"; final String dateTime = date + " " + time; final Iterator<Entry<String, String>> it = event.entrySet() .iterator(); TimeStamp ts; try { if(dateTime.indexOf("-")!=-1) ts = new TimeStamp(sdf.parse(dateTime)); else ts = new TimeStamp(sdf.parse(dateTime)); while (it.hasNext()) { Entry<String, String> entry = it.next(); String key = entry.getKey().toUpperCase(); if (key.equals("DATE")) continue; if (key.equals("TIME")) continue; tsc.setValue(key, ts, Double.parseDouble(entry.getValue())); } } catch (ParseException e1) { e1.printStackTrace(); } } }; cmr.read(el, new FileInputStream("./src/test/resources/sampledata/Q62_60_2000.csv")); assertEquals(2000,tsc.getNumRows()); TSContainerMethods tcm = new TSContainerMethods(); // assertEquals((Double)51.6333, tcm.averageProfitPerSlot(tsc, new TimeStamp(1336760881000000000L), TimeFrame.MINUTES_5)[0], 0.0001); } }