{"id":385,"date":"2018-05-30T21:03:40","date_gmt":"2018-05-30T19:03:40","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=385"},"modified":"2020-11-21T22:22:52","modified_gmt":"2020-11-21T21:22:52","slug":"investor-parameter-optimization","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/","title":{"rendered":"Investor &#8211; Parameter Optimization"},"content":{"rendered":"<h1>Parameter Optimization<\/h1>\n<p>This project provides an easy to use functionality to implement and evaluate automatic stock trading strategies. It is implemented in java and therefore can be used in any environment which builds on the JVM.<\/p>\n<p>It provides the following functionality:<br \/>\n&#8211; Simple access to stock data<br \/>\n&#8211; Declarative formulation of trading strategies<br \/>\n&#8211; Evaluation of trading strategies<br \/>\n&#8211; Optimization of trading strategies<br \/>\n&#8211; Support of portfolio of multiple stocks \/ trading strategies<\/p>\n<p>In this document we describe the functionality which helps us to optimize the parameters for trading strategies.<\/p>\n<h2>Setup<\/h2>\n<p>First you need to install the java libraries:<\/p>\n<pre><code class=\"Scala\">%classpath config resolver maven-public http:\/\/pschatzmann.ch:8081\/repository\/maven-public\/\n%classpath add mvn ch.pschatzmann:investor:0.9-SNAPSHOT\n%classpath add mvn ch.pschatzmann:jupyter-jdk-extensions:0.0.1-SNAPSHOT\n\n<\/code><\/pre>\n<pre><code>Added new repo: maven-public\n\n\n\n\nAdded jars: [httpclient-4.5.3.jar, jetty-util-9.2.20.v20161216.jar, sojo-1.0.5.jar, httpcore-4.4.6.jar, xercesImpl-2.11.0.jar, httpmime-4.5.2.jar, xml-apis-1.4.01.jar, commons-codec-1.10.jar, sevenzipjbinding-9.20-2.00beta.jar, serializer-2.7.2.jar, websocket-client-9.2.20.v20161216.jar, timeseries-forecast-1.1.1.jar, sac-1.3.jar, jetty-io-9.2.20.v20161216.jar, combinatoradix-0.8.2.jar, commons-jcs-core-2.0.jar, websocket-common-9.2.20.v20161216.jar, jfreechart-1.5.0.jar, ta4j-core-0.10.jar, commons-cli-1.3.1.jar, investor-0.9-SNAPSHOT.jar, commons-io-2.5.jar, cssparser-0.9.21.jar, htmlunit-2.24.jar, jackson-annotations-2.9.4.jar, jackson-databind-2.9.4.jar, commons-attributes-api-2.2.jar, YahooFinanceAPI-3.12.3.jar, log4j-1.2.17.jar, jcl-over-slf4j-1.7.25.jar, htmlunit-core-js-2.23.jar, jackson-core-2.9.4.jar, hamcrest-core-1.1.jar, commons-lang3-3.5.jar, sevenzipjbinding-all-platforms-9.20-2.00beta.jar, slf4j-api-1.7.25.jar, slf4j-log4j12-1.7.25.jar, ant-1.5.jar, junit-4.10.jar, websocket-api-9.2.20.v20161216.jar, xalan-2.7.2.jar, qdox-1.5.jar, neko-htmlunit-2.24.jar]\n\n\n\n\nAdded jars: [jcs-1.3.jar, commons-logging-1.1.jar, common-0.0.1-SNAPSHOT.jar, servlet-api-2.3.jar, logkit-1.0.1.jar, avalon-framework-4.1.3.jar, concurrent-1.3.4.jar, in-memory-stardb-0.0.1-SNAPSHOT.jar, jupyter-jdk-extensions-0.0.1-SNAPSHOT.jar]\n<\/code><\/pre>\n<h3>Imports<\/h3>\n<p>First we define all the imports which are used in this demo:<\/p>\n<pre><code class=\"Scala\">\/\/ our stock evaluation framwork\nimport ch.pschatzmann.dates._;\nimport ch.pschatzmann.stocks._;\nimport ch.pschatzmann.stocks.data.universe._;\nimport ch.pschatzmann.stocks.input._;\nimport ch.pschatzmann.stocks.accounting._;\nimport ch.pschatzmann.stocks.accounting.kpi._;\nimport ch.pschatzmann.stocks.execution._;\nimport ch.pschatzmann.stocks.execution.fees._;\nimport ch.pschatzmann.stocks.execution.price._;\nimport ch.pschatzmann.stocks.parameters._;\nimport ch.pschatzmann.stocks.strategy._;\nimport ch.pschatzmann.stocks.strategy.optimization._;\nimport ch.pschatzmann.stocks.strategy.allocation._;\nimport ch.pschatzmann.stocks.strategy.selection._;\nimport ch.pschatzmann.stocks.integration._;\nimport ch.pschatzmann.stocks.integration.ChartData.FieldName._;\nimport ch.pschatzmann.stocks.strategy.OptimizedStrategy.Schedule._;\n\n\/\/ java\nimport java.lang._;\nimport java.util.ArrayList\n\n\/\/ ta4j\nimport org.ta4j.core._;\nimport org.ta4j.core.analysis._;\nimport org.ta4j.core.analysis.criteria._;\nimport org.ta4j.core.indicators._;\nimport org.ta4j.core.indicators.helpers._;\nimport org.ta4j.core.trading.rules._;\n\n\/\/\/ jupyter custom displayer\nimport ch.pschatzmann.display.Displayers\n<\/code><\/pre>\n<pre><code>import ch.pschatzmann.dates._\nimport ch.pschatzmann.stocks._\nimport ch.pschatzmann.stocks.data.universe._\nimport ch.pschatzmann.stocks.input._\nimport ch.pschatzmann.stocks.accounting._\nimport ch.pschatzmann.stocks.accounting.kpi._\nimport ch.pschatzmann.stocks.execution._\nimport ch.pschatzmann.stocks.execution.fees._\nimport ch.pschatzmann.stocks.execution.price._\nimport ch.pschatzmann.stocks.parameters._\nimport ch.pschatzmann.stocks.strategy._\nimport ch.pschatzmann.stocks.strategy.optimization._\nimport ch.pschatzmann.stocks.strategy.allocation._\nimport ch.pschatzmann.stocks.strategy.selection._\nimport ch.pschatzmann.stocks.integration._\nimport ch.pschatzmann.stocks.integration.ChartData.FieldName._\nimport ch.pschatzmann.stocks.strategy.OptimizedStrategy.Schedule._\nimport java.lang._\nimpo...\n<\/code><\/pre>\n<h3>Logging \/ Caching<\/h3>\n<p>We are using JCS for caching the stock data. We deactivate this functionality in order to avoid the errors and warnings if the system is not set up properly.<br \/>\nThe framework is using log4j. For this demonstration session we deactivate the information messages and therfore define the log level for this session to display only Errors:<\/p>\n<pre><code class=\"Scala\">Displayers.setup(\"ERROR\")\n\nContext.setCachingActive(false);\nContext.isCachingActive();\n<\/code><\/pre>\n<pre><code>false\n<\/code><\/pre>\n<h2>Trading Strategy Parameter Optimization<\/h2>\n<p>Each trading strategy can have some build-in parameters. The Optimizer is used to optimize<br \/>\nthe parameter values of the trading strategy to give the best indicated KPI value. In the example below<br \/>\nwe maximize the AbsoluteReturn.<\/p>\n<p>We currently provide the following implementations for Optimizers:<br \/>\n&#8211; BinarySearchOptimizer<br \/>\n&#8211; PermutatedBinarySearchOptimizer<br \/>\n&#8211; SequenceOptimizer<br \/>\n&#8211; BruteForceOptimizer<br \/>\n&#8211; SimmulatedAnnealingOptimizer<br \/>\n&#8211; GeneticOptimizer<\/p>\n<p>The BinarySearchOptimizer is using on the parameter sequence which is defined in the trading strategy to<br \/>\noptimize the target. In order to avoid local minima &#8211; in the case if parameters are dependent on each other &#8211; we have implemented the PermutatedBinarySearchOptimizer which is using the result of the best sequence combination.<\/p>\n<pre><code class=\"Scala\"><br \/>val target =  KPI.AbsoluteReturn;\nvar account = new Account(\"Simulation\",\"USD\", 100000.00, Context.date(\"2015-01-01\"), new PerTradeFees(10.0));\nvar stockdata = new StockData(new StockID(\"AAPL\", \"NASDAQ\"), new MarketArchiveHttpReader());\nvar trader = new PaperTrader(account);\nvar optimizer = new BinarySearchOptimizer(new Fitness(trader), KPI.AbsoluteReturn);\nvar result = optimizer.optimize(new RSI2Strategy(stockdata),account.getDateRange());\n\n\/\/ print one parameter\nprintln(\"Absolute Return: \"+result.result().getValue(target));\n\n\/\/ print all parameters\nDisplayers.display(result.getMap());\n<\/code><\/pre>\n<pre><code>Absolute Return: 91268.0\n<\/code><\/pre>\n<table >\n<tr>\n<th>Key<\/th>\n<th>Value<\/th>\n<\/tr>\n<tr>\n<td>PurchasedValue<\/td>\n<td>112923<\/td>\n<\/tr>\n<tr>\n<td>SharpeRatio<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>RealizedGains<\/td>\n<td>12973<\/td>\n<\/tr>\n<tr>\n<td>UnrealizedGains<\/td>\n<td>78345<\/td>\n<\/tr>\n<tr>\n<td>LongSMAPeriod<\/td>\n<td>250<\/td>\n<\/tr>\n<tr>\n<td>Cash<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td>MaxDrawDownLowValue<\/td>\n<td>106823<\/td>\n<\/tr>\n<tr>\n<td>NumberOfTrades<\/td>\n<td>5<\/td>\n<\/tr>\n<tr>\n<td>NumberOfTradedStocks<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>EntryLimit<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>RSIPeriod<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>NumberOfCashTransfers<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>AbsoluteReturnAvaragePerDay<\/td>\n<td>119<\/td>\n<\/tr>\n<tr>\n<td>NumberOfSells<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>MaxDrawDownHighValue<\/td>\n<td>125054<\/td>\n<\/tr>\n<tr>\n<td>ShortSMAPeriod<\/td>\n<td>9<\/td>\n<\/tr>\n<tr>\n<td>ReturnPercentAnualized<\/td>\n<td>30<\/td>\n<\/tr>\n<tr>\n<td>AbsoluteReturnStdDev<\/td>\n<td>1383<\/td>\n<\/tr>\n<tr>\n<td>ExitLimit<\/td>\n<td>94<\/td>\n<\/tr>\n<tr>\n<td>AbsoluteReturn<\/td>\n<td>91268<\/td>\n<\/tr>\n<tr>\n<td>NumberOfBuys<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>ReturnPercent<\/td>\n<td>91<\/td>\n<\/tr>\n<tr>\n<td>TotalFees<\/td>\n<td>50<\/td>\n<\/tr>\n<tr>\n<td>MaxDrawDownNumberOfDays<\/td>\n<td>410<\/td>\n<\/tr>\n<tr>\n<td>ActualValue<\/td>\n<td>191268<\/td>\n<\/tr>\n<tr>\n<td>MaxDrawDownPercent<\/td>\n<td>18231<\/td>\n<\/tr>\n<tr>\n<td>ReturnPurcentStdDev<\/td>\n<td>0<\/td>\n<\/tr>\n<\/table>\n<h3>Avoid Look Ahead Bias: OptimizedStrategy<\/h3>\n<p>The example above has a big problem: It suffers from look ahead bias!. This is bias created by the use of information or data that would not have been known or available during the period being analyzed. This will  lead to unrealistic results.<\/p>\n<p>Therefore we need to make sure that when we create the optimization, we only use the data backward in time.<br \/>\nWe have created the OptimizedStrategy class to help us with this.<\/p>\n<p>Here is the example that only uses the historic data up to the &#8220;2014-12-31&#8221; to optimize the strategy parameters:<\/p>\n<pre><code class=\"Scala\">var periods = Context.getDateRanges(\"2014-01-01\",\"2015-01-01\");\nvar account = new Account(\"Simulation\",\"USD\", 100000.00, periods.get(0).getStart(), new PerTradeFees(10.0));\nvar stockdata = new StockData(new StockID(\"AAPL\", \"NASDAQ\"), new MarketArchiveHttpReader());\nvar strategy = new RSI2Strategy(stockdata);\nvar trader = new PaperTrader(account);\nvar optimizer = new BinarySearchOptimizer(new SimulatedFitness(account), KPI.AbsoluteReturn);\nvar optimizedStrategy = new OptimizedStrategy(strategy, optimizer, periods.get(0));                                             \nvar state = new Fitness(trader).getFitness(optimizedStrategy, periods.get(1));\n\n\"Return: \" + state.result().getValue(KPI.AbsoluteReturn);\n\n<\/code><\/pre>\n<pre><code>Return: 78946.0\n<\/code><\/pre>\n<p>We also support a more dynamic approach where we run the optimization while we execute the strategy.<br \/>\nIn the following example we run the optimization every month on past data:<\/p>\n<pre><code class=\"Scala\">import ch.pschatzmann.stocks.strategy.OptimizedStrategy.Schedule._;\n\nvar periods = Context.getDateRanges(\"2014-01-01\",\"2015-01-01\");\nvar account = new Account(\"Simulation\",\"USD\", 100000.00, periods.get(0).getStart(), new PerTradeFees(10.0));\nvar stockdata = new StockData(new StockID(\"AAPL\", \"NASDAQ\"), new MarketArchiveHttpReader());\nvar strategy = new RSI2Strategy(stockdata);\nvar trader = new PaperTrader(account);\nvar optimizer = new BinarySearchOptimizer(new SimulatedFitness(account),KPI.AbsoluteReturn);\nvar optimizedStrategy = new OptimizedStrategy(strategy, optimizer, MONTH);                                             \nvar state = new Fitness(trader).getFitness(optimizedStrategy, periods.get(1));\n\n\"Return: \" + state.result().getValue(KPI.AbsoluteReturn);\n\n<\/code><\/pre>\n<pre><code>Return: 54414.0\n<\/code><\/pre>\n<h3>Performance of Optimizers<\/h3>\n<p>Finally we compare the result of the different Optimizers. First we run them with the standard settings:<\/p>\n<pre><code class=\"Scala\"><br \/>def evaluateNoOptimization() = {\n    val rec = new java.util.TreeMap[String,Any]();\n    val start = System.currentTimeMillis()\n    account.reset();\n    val strategy = new RSI2Strategy(stockdata);\n    var state = new SimulatedFitness(account).getFitness(strategy,account.getDateRange());\n    val end = System.currentTimeMillis()\n    rec.put(\"Strategy\", \"Not optimized\");\n    rec.put(target.name(), state.result.getValue(target));\n    rec.put(\"Runtime (sec)\", (end - start) \/ 1000.0);\n    result.add(rec);\n}\n\ndef evaluateOptimizer(optimizer : IOptimizer, name:String) = {\n    println(\"processing \"+name)\n    val rec = new java.util.TreeMap[String,Any]()\n    val start = System.currentTimeMillis()\n    account.reset();\n\n    var resultOfOptimization = optimizer.optimize(new RSI2Strategy(stockdata),account.getDateRange());\n    val end = System.currentTimeMillis()\n    rec.put(\"Strategy\", name);\n    rec.put(target.name(), resultOfOptimization.result().getValue(target));\n    rec.put(\"Runtime (sec)\", (end - start) \/ 1000.0);\n    result.add(rec);\n}\n\nval result = new ArrayList[java.util.Map[String,_]]();\nval target =  KPI.AbsoluteReturn;\nval stockdata = new StockData(new StockID(\"AAPL\", \"NASDAQ\"), new MarketArchiveHttpReader());\nvar account = new Account(\"Simulation\",\"USD\", 100000.00, Context.date(\"2015-01-01\"), new PerTradeFees(10.0));\nvar fitness = new SimulatedFitness(account);\n\nevaluateNoOptimization();\nevaluateOptimizer(new BinarySearchOptimizer(fitness, target),\"BinarySearchOptimizer\");\nevaluateOptimizer(new SequenceOptimizer(fitness, target),\"SequenceOptimizer\");\nevaluateOptimizer(new SimulatedAnnealingOptimizer(fitness, target),\"SimmulatedAnnealingOptimizer\");\nevaluateOptimizer(new GeneticOptimizer(fitness, target),\"GeneticOptimizer\");\n\/\/ this is very slow\n\/\/evaluateOptimizer(new PermutatedBinarySearchOptimizer(fitness,target),\"PermutatedBinarySearchOptimizer\");\n\nDisplayers.display(result);\n<\/code><\/pre>\n<pre><code>processing BinarySearchOptimizer\nprocessing SequenceOptimizer\nprocessing SimmulatedAnnealingOptimizer\nprocessing GeneticOptimizer\n<\/code><\/pre>\n<table>\n<tr>\n<th>AbsoluteReturn<\/th>\n<th>Runtime (sec)<\/th>\n<th>Strategy<\/th>\n<\/tr>\n<tr>\n<td>56741<\/td>\n<td>0.274<\/td>\n<td>Not optimized<\/td>\n<\/tr>\n<tr>\n<td>91268<\/td>\n<td>5.593<\/td>\n<td>BinarySearchOptimizer<\/td>\n<\/tr>\n<tr>\n<td>84676<\/td>\n<td>39.602<\/td>\n<td>SequenceOptimizer<\/td>\n<\/tr>\n<tr>\n<td>94325<\/td>\n<td>32.512<\/td>\n<td>SimmulatedAnnealingOptimizer<\/td>\n<\/tr>\n<tr>\n<td>96840<\/td>\n<td>86.355<\/td>\n<td>GeneticOptimizer<\/td>\n<\/tr>\n<\/table>\n<p>We can also influence the performance of the optimizers by setting their specific parameters:<\/p>\n<pre><code class=\"Scala\">result.clear()\n\nvar optimizer = new SimulatedAnnealingOptimizer(fitness,target);\noptimizer.setCount(20)\nevaluateOptimizer(optimizer,\"SimulatedAnnealingOptimizer\")\n\nDisplayers.display(result)\n<\/code><\/pre>\n<pre><code>processing SimulatedAnnealingOptimizer\n<\/code><\/pre>\n<table>\n<tr>\n<th>AbsoluteReturn<\/th>\n<th>Runtime (sec)<\/th>\n<th>Strategy<\/th>\n<\/tr>\n<tr>\n<td>92251<\/td>\n<td>7.08<\/td>\n<td>SimulatedAnnealingOptimizer<\/td>\n<\/tr>\n<\/table>\n<pre><code class=\"Scala\">result.clear()\n\nvar optimizer = new GeneticOptimizer(fitness, target);\noptimizer.setGenerations(20)\nevaluateOptimizer(optimizer,\"GeneticOptimizer\")\n\nDisplayers.display(result)\n<\/code><\/pre>\n<pre><code>processing GeneticOptimizer\n<\/code><\/pre>\n<table>\n<tr>\n<th>AbsoluteReturn<\/th>\n<th>Runtime (sec)<\/th>\n<th>Strategy<\/th>\n<\/tr>\n<tr>\n<td>113990<\/td>\n<td>168.922<\/td>\n<td>GeneticOptimizer<\/td>\n<\/tr>\n<\/table>\n<p>The BinarySearchOptimizer gives the quickest results.<br \/>\nThe other optimizers are slow but potentilly give better results.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Parameter Optimization This project provides an easy to use functionality to implement and evaluate automatic stock trading strategies. It is implemented in java and therefore can be used in any environment which builds on the JVM. It provides the following functionality: &#8211; Simple access to stock data &#8211; Declarative formulation [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[13],"tags":[],"class_list":["post-385","post","type-post","status-publish","format-standard","hentry","category-quantitative-trading"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Investor - Parameter Optimization - Phil Schatzmann<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Investor - Parameter Optimization - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"Parameter Optimization This project provides an easy to use functionality to implement and evaluate automatic stock trading strategies. It is implemented in java and therefore can be used in any environment which builds on the JVM. It provides the following functionality: &#8211; Simple access to stock data &#8211; Declarative formulation [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2018-05-30T19:03:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-11-21T21:22:52+00:00\" \/>\n<meta name=\"author\" content=\"pschatzmann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"pschatzmann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2018\\\/05\\\/30\\\/investor-parameter-optimization\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2018\\\/05\\\/30\\\/investor-parameter-optimization\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"Investor &#8211; Parameter Optimization\",\"datePublished\":\"2018-05-30T19:03:40+00:00\",\"dateModified\":\"2020-11-21T21:22:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2018\\\/05\\\/30\\\/investor-parameter-optimization\\\/\"},\"wordCount\":514,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"articleSection\":[\"Quantitative Trading\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2018\\\/05\\\/30\\\/investor-parameter-optimization\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2018\\\/05\\\/30\\\/investor-parameter-optimization\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2018\\\/05\\\/30\\\/investor-parameter-optimization\\\/\",\"name\":\"Investor - Parameter Optimization - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"datePublished\":\"2018-05-30T19:03:40+00:00\",\"dateModified\":\"2020-11-21T21:22:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2018\\\/05\\\/30\\\/investor-parameter-optimization\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2018\\\/05\\\/30\\\/investor-parameter-optimization\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2018\\\/05\\\/30\\\/investor-parameter-optimization\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Investor &#8211; Parameter Optimization\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\",\"name\":\"Phil Schatzmann Consulting\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\",\"name\":\"pschatzmann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"width\":305,\"height\":305,\"caption\":\"pschatzmann\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Investor - Parameter Optimization - Phil Schatzmann","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/","og_locale":"en_US","og_type":"article","og_title":"Investor - Parameter Optimization - Phil Schatzmann","og_description":"Parameter Optimization This project provides an easy to use functionality to implement and evaluate automatic stock trading strategies. It is implemented in java and therefore can be used in any environment which builds on the JVM. It provides the following functionality: &#8211; Simple access to stock data &#8211; Declarative formulation [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/","og_site_name":"Phil Schatzmann","article_published_time":"2018-05-30T19:03:40+00:00","article_modified_time":"2020-11-21T21:22:52+00:00","author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"Investor &#8211; Parameter Optimization","datePublished":"2018-05-30T19:03:40+00:00","dateModified":"2020-11-21T21:22:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/"},"wordCount":514,"commentCount":0,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"articleSection":["Quantitative Trading"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/","url":"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/","name":"Investor - Parameter Optimization - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"datePublished":"2018-05-30T19:03:40+00:00","dateModified":"2020-11-21T21:22:52+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2018\/05\/30\/investor-parameter-optimization\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"Investor &#8211; Parameter Optimization"}]},{"@type":"WebSite","@id":"https:\/\/www.pschatzmann.ch\/home\/#website","url":"https:\/\/www.pschatzmann.ch\/home\/","name":"Phil Schatzmann Consulting","description":"","publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pschatzmann.ch\/home\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1","name":"pschatzmann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","width":305,"height":305,"caption":"pschatzmann"},"logo":{"@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/385","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/comments?post=385"}],"version-history":[{"count":1,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/385\/revisions"}],"predecessor-version":[{"id":2230,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/385\/revisions\/2230"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=385"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=385"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}