{"id":111599,"date":"2021-11-17T10:10:00","date_gmt":"2021-11-17T15:10:00","guid":{"rendered":"https:\/\/ibkrcampus.com\/?p=111599"},"modified":"2022-11-21T09:49:23","modified_gmt":"2022-11-21T14:49:23","slug":"optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii","status":"publish","type":"post","link":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/","title":{"rendered":"Optimising the rsims package for Fast Backtesting in R \u2013 Part III"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>See <a href=\"\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-i\/\">Part I<\/a> and <a href=\"\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-ii\/\">Part II<\/a> to get started<\/em>. <em>Visit <a href=\"https:\/\/robotwealth.com\/optimising-the-rsims-package-for-fast-backtesting-in-r\/\">Robot Wealth<\/a> to download the complete R script.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-how-does-rsims-scale\">How does&nbsp;<code>rsims<\/code>&nbsp;scale?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, let\u2019s see how&nbsp;<code>rsims<\/code>&nbsp;performs as we increase the number of time steps and the size of the universe. We\u2019ll benchmark the performance with universe sizes from 100 to 1,000, and time periods from 2,500 to 10,000 days (approximately 10 to 40 trading years):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>library(rsims)\nget_mean_time &lt;- function(days, universe, times = 5) {\n  dates &lt;- seq(as.numeric(as.Date(\"1980-01-01\")), as.numeric(as.Date(\"1980-01-01\"))+(days))\n  prices &lt;- cbind(dates, gbm_sim(nsim = universe, t = days, mu = 0.1, sigma = 0.1))\n  weights &lt;- cbind(dates, rbind(rep(0, universe), matrix(rnorm(days*universe), nrow = days)))\n  res &lt;- microbenchmark(\n    cash_backtest(\n      prices,\n      weights,\n      trade_buffer = 0.,\n      initial_cash = 1000,\n      commission_pct = 0.001,\n      capitalise_profits = FALSE\n    ),\n    times = times\n  )\n  mean(res$time)\/1e9\n}\nnum_assets &lt;- seq(100, 1000, 100)\nnum_days &lt;- c(10, 20, 30, 40)*252\nmeans &lt;- list()\nfor(universe in num_assets) {\n  print(glue::glue(\"Doing universe size {universe}\"))\n  for(days in num_days) {\n    print(glue::glue(\"Doing {days} days\"))\n    means &lt;- c(means, get_mean_time(days, universe, times = 10))\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Plotting the results:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df &lt;- as.data.frame(matrix(unlist(means), ncol = length(num_assets))) %&gt;%\n  mutate(days = num_days)\ncolnames(df) &lt;- c(num_assets, \"days\")\ndf %&gt;%\n  pivot_longer(cols = -days, names_to = \"universe_size\", values_to = \"mean_sim_time\") %&gt;%\n  mutate(universe_size = as.numeric(universe_size)) %&gt;%\n  ggplot(aes(x = universe_size, y = mean_sim_time, colour = factor(days))) +\n    geom_line() +\n    geom_point() +\n    labs(\n      x = \"Universe size\",\n      y = \"Mean simulation time, seconds\",\n      title = \"Mean simulation time from 10 iterations\",\n      colour = \"Time Steps\"\n    ) +\n    theme_bw()<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"849\" height=\"403\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2021\/11\/mean_sim_time-robot-wealth.png\" alt=\"Optimising the rsims package for Fast Backtesting in R\" class=\"wp-image-111730 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/11\/mean_sim_time-robot-wealth.png 849w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/11\/mean_sim_time-robot-wealth-700x332.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/11\/mean_sim_time-robot-wealth-300x142.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/11\/mean_sim_time-robot-wealth-768x365.png 768w\" data-sizes=\"(max-width: 849px) 100vw, 849px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 849px; aspect-ratio: 849\/403;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">We can see that&nbsp;<code>rsims<\/code>&nbsp;scales well in general. I suspect that there was a blow out for the universe sizes of 900 and 1,000 for the 40-year backtest due to memory constraints of my local setup (100 Chrome tabs anyone?).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Other ideas not implemented<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are some other tricks for speeding up R code that weren\u2019t applicable here, but that are worth knowing about.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Parallel processing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Parallel processing is a well-trodden path for doing computations in parallel on more than one processor. In R, the&nbsp;<code>parallel<\/code>&nbsp;package is the original parallel processing toolkit and is included in base R. It parallelises some standard R functions out of the box, such as the&nbsp;<code>apply<\/code>&nbsp;functions. There\u2019s also the&nbsp;<code>foreach<\/code>&nbsp;and&nbsp;<code>doParallel<\/code>&nbsp;packages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In our application, parallelisation won\u2019t work for the event loop because of path dependency \u2013 tomorrow\u2019s trades depend on yesterday\u2019s positions, so we can\u2019t do yesterday\u2019s and today\u2019s trades in parallel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We could potentially parallelise the position delta calculations for each asset&nbsp;<em>within<\/em>&nbsp;each loop iteration, as these aren\u2019t dependent on one another. This operation is already fast \u2013 on the order of microseconds \u2013 so we have little to gain in absolute terms, and I think the overhead of setting up and managing parallel processes would probably negate any speed gains anyway.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Intelligent application of logical operators<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A common inefficiency is using vectorised&nbsp;<code>AND<\/code>&nbsp;and&nbsp;<code>OR<\/code>&nbsp;operators (<code>&amp;<\/code>,&nbsp;<code>|<\/code>) in comparisons involving scalars. The vectorised versions always evaluate both sides of the logical operator, whereas the non-vectorised versions (<code>&amp;&amp;<\/code>,&nbsp;<code>||<\/code>) only execute the right-hand side (and subsequent comparisons) if necessary.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, the expression&nbsp;<code>(1 &gt; 4) &amp; (3 &lt; 5)<\/code>&nbsp;evaluates both sides of the&nbsp;<code>&amp;<\/code>, while&nbsp;<code>(1 &gt; 4) &amp;&amp; (3 &lt; 5)<\/code>&nbsp;only evaluates the first, because the expression is falsified by the first comparison.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Granted, this is a very minor inefficiency but can make a difference if you\u2019re doing a lot of such operations. Just be careful not to use scalar&nbsp;<code>&amp;&amp;<\/code>&nbsp;and&nbsp;<code>||<\/code>&nbsp;on vectors, as they will only evaluate the first element!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">By far the biggest efficiency gains came with converting data frames to matrixes. This is worth considering when speed is important, so long as the trade-offs around data consistency and convenience make sense for the application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Smaller but useful efficiency gains came from:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Preallocating data containers rather than growing them on the fly<\/li><li>Pushing data transformations that only need to happen once outside the function whose speed matters (for example, make the wide price and weights matrixes once, then run many fast backtests with different parameters)<\/li><li>Vectorising where possible<\/li><li>Using C++ via&nbsp;<code>Rcpp<\/code><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You might also want to consider parallel processing and careful usage of logical operators.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By far the biggest efficiency gains came with converting data frames to matrixes.<\/p>\n","protected":false},"author":271,"featured_media":80184,"comment_status":"closed","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[339,343,338,350,341,344,342],"tags":[854,10653,6138,10654,10652,487,10651,10561,6591,508],"contributors-categories":[13676],"class_list":["post-111599","post","type-post","status-publish","format-standard","has-post-thumbnail","category-data-science","category-programing-languages","category-ibkr-quant-news","category-quant-asia-pacific","category-quant-development","category-quant-regions","category-r-development","tag-cplusplus","tag-doparallel","tag-foreach","tag-parallel","tag-parallel-processing","tag-r","tag-rcpp","tag-rsims","tag-rstats","tag-rstudio","contributors-categories-robot-wealth"],"pp_statuses_selecting_workflow":false,"pp_workflow_action":"current","pp_status_selection":"publish","acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v28.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Optimising the rsims package for Fast Backtesting in R \u2013 Part III<\/title>\n<meta name=\"description\" content=\"By far the biggest efficiency gains came with converting data frames to matrixes.\" \/>\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.interactivebrokers.com\/campus\/wp-json\/wp\/v2\/posts\/111599\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Optimising the rsims package for Fast Backtesting in R \u2013 Part III | IBKR Quant Blog\" \/>\n<meta property=\"og:description\" content=\"By far the biggest efficiency gains came with converting data frames to matrixes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/\" \/>\n<meta property=\"og:site_name\" content=\"IBKR Campus US\" \/>\n<meta property=\"article:published_time\" content=\"2021-11-17T15:10:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-11-21T14:49:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/03\/R-programing.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"900\" \/>\n\t<meta property=\"og:image:height\" content=\"550\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kris Longmore\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kris Longmore\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\n\t    \"@context\": \"https:\\\/\\\/schema.org\",\n\t    \"@graph\": [\n\t        {\n\t            \"@type\": \"NewsArticle\",\n\t            \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\\\/#article\",\n\t            \"isPartOf\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\\\/\"\n\t            },\n\t            \"author\": {\n\t                \"name\": \"Kris Longmore\",\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/person\\\/79c2a2775a70a4da1accf0068d731933\"\n\t            },\n\t            \"headline\": \"Optimising the rsims package for Fast Backtesting in R \u2013 Part III\",\n\t            \"datePublished\": \"2021-11-17T15:10:00+00:00\",\n\t            \"dateModified\": \"2022-11-21T14:49:23+00:00\",\n\t            \"mainEntityOfPage\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\\\/\"\n\t            },\n\t            \"wordCount\": 531,\n\t            \"publisher\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\\\/#primaryimage\"\n\t            },\n\t            \"thumbnailUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2021\\\/03\\\/R-programing.jpg\",\n\t            \"keywords\": [\n\t                \"C++\",\n\t                \"doParallel\",\n\t                \"foreach\",\n\t                \"parallel\",\n\t                \"Parallel processing\",\n\t                \"R\",\n\t                \"Rcpp\",\n\t                \"rsims\",\n\t                \"rstats\",\n\t                \"RStudio\"\n\t            ],\n\t            \"articleSection\": [\n\t                \"Data Science\",\n\t                \"Programming Languages\",\n\t                \"Quant\",\n\t                \"Quant Asia Pacific\",\n\t                \"Quant Development\",\n\t                \"Quant Regions\",\n\t                \"R Development\"\n\t            ],\n\t            \"inLanguage\": \"en-US\"\n\t        },\n\t        {\n\t            \"@type\": \"WebPage\",\n\t            \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\\\/\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\\\/\",\n\t            \"name\": \"Optimising the rsims package for Fast Backtesting in R \u2013 Part III | IBKR Quant Blog\",\n\t            \"isPartOf\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#website\"\n\t            },\n\t            \"primaryImageOfPage\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\\\/#primaryimage\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\\\/#primaryimage\"\n\t            },\n\t            \"thumbnailUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2021\\\/03\\\/R-programing.jpg\",\n\t            \"datePublished\": \"2021-11-17T15:10:00+00:00\",\n\t            \"dateModified\": \"2022-11-21T14:49:23+00:00\",\n\t            \"description\": \"By far the biggest efficiency gains came with converting data frames to matrixes.\",\n\t            \"inLanguage\": \"en-US\",\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"ReadAction\",\n\t                    \"target\": [\n\t                        \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\\\/\"\n\t                    ]\n\t                }\n\t            ]\n\t        },\n\t        {\n\t            \"@type\": \"ImageObject\",\n\t            \"inLanguage\": \"en-US\",\n\t            \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/ibkr-quant-news\\\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\\\/#primaryimage\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2021\\\/03\\\/R-programing.jpg\",\n\t            \"contentUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2021\\\/03\\\/R-programing.jpg\",\n\t            \"width\": 900,\n\t            \"height\": 550,\n\t            \"caption\": \"R Programming\"\n\t        },\n\t        {\n\t            \"@type\": \"WebSite\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#website\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/\",\n\t            \"name\": \"IBKR Campus US\",\n\t            \"description\": \"Financial Education from Interactive Brokers\",\n\t            \"publisher\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\"\n\t            },\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"SearchAction\",\n\t                    \"target\": {\n\t                        \"@type\": \"EntryPoint\",\n\t                        \"urlTemplate\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/?s={search_term_string}\"\n\t                    },\n\t                    \"query-input\": {\n\t                        \"@type\": \"PropertyValueSpecification\",\n\t                        \"valueRequired\": true,\n\t                        \"valueName\": \"search_term_string\"\n\t                    }\n\t                }\n\t            ],\n\t            \"inLanguage\": \"en-US\"\n\t        },\n\t        {\n\t            \"@type\": \"Organization\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\",\n\t            \"name\": \"Interactive Brokers\",\n\t            \"alternateName\": \"IBKR\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/\",\n\t            \"logo\": {\n\t                \"@type\": \"ImageObject\",\n\t                \"inLanguage\": \"en-US\",\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/logo\\\/image\\\/\",\n\t                \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/05\\\/ibkr-campus-logo.jpg\",\n\t                \"contentUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/05\\\/ibkr-campus-logo.jpg\",\n\t                \"width\": 669,\n\t                \"height\": 669,\n\t                \"caption\": \"Interactive Brokers\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/logo\\\/image\\\/\"\n\t            },\n\t            \"publishingPrinciples\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/about-ibkr-campus\\\/\",\n\t            \"ethicsPolicy\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/cyber-security-notice\\\/\"\n\t        },\n\t        {\n\t            \"@type\": \"Person\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/person\\\/79c2a2775a70a4da1accf0068d731933\",\n\t            \"name\": \"Kris Longmore\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/author\\\/krislongmore\\\/\"\n\t        }\n\t    ]\n\t}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Optimising the rsims package for Fast Backtesting in R \u2013 Part III","description":"By far the biggest efficiency gains came with converting data frames to matrixes.","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.interactivebrokers.com\/campus\/wp-json\/wp\/v2\/posts\/111599\/","og_locale":"en_US","og_type":"article","og_title":"Optimising the rsims package for Fast Backtesting in R \u2013 Part III | IBKR Quant Blog","og_description":"By far the biggest efficiency gains came with converting data frames to matrixes.","og_url":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/","og_site_name":"IBKR Campus US","article_published_time":"2021-11-17T15:10:00+00:00","article_modified_time":"2022-11-21T14:49:23+00:00","og_image":[{"width":900,"height":550,"url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/03\/R-programing.jpg","type":"image\/jpeg"}],"author":"Kris Longmore","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Kris Longmore","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/#article","isPartOf":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/"},"author":{"name":"Kris Longmore","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/person\/79c2a2775a70a4da1accf0068d731933"},"headline":"Optimising the rsims package for Fast Backtesting in R \u2013 Part III","datePublished":"2021-11-17T15:10:00+00:00","dateModified":"2022-11-21T14:49:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/"},"wordCount":531,"publisher":{"@id":"https:\/\/ibkrcampus.com\/campus\/#organization"},"image":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/#primaryimage"},"thumbnailUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/03\/R-programing.jpg","keywords":["C++","doParallel","foreach","parallel","Parallel processing","R","Rcpp","rsims","rstats","RStudio"],"articleSection":["Data Science","Programming Languages","Quant","Quant Asia Pacific","Quant Development","Quant Regions","R Development"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/","url":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/","name":"Optimising the rsims package for Fast Backtesting in R \u2013 Part III | IBKR Quant Blog","isPartOf":{"@id":"https:\/\/ibkrcampus.com\/campus\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/#primaryimage"},"image":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/#primaryimage"},"thumbnailUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/03\/R-programing.jpg","datePublished":"2021-11-17T15:10:00+00:00","dateModified":"2022-11-21T14:49:23+00:00","description":"By far the biggest efficiency gains came with converting data frames to matrixes.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/optimising-the-rsims-package-for-fast-backtesting-in-r-part-iii\/#primaryimage","url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/03\/R-programing.jpg","contentUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/03\/R-programing.jpg","width":900,"height":550,"caption":"R Programming"},{"@type":"WebSite","@id":"https:\/\/ibkrcampus.com\/campus\/#website","url":"https:\/\/ibkrcampus.com\/campus\/","name":"IBKR Campus US","description":"Financial Education from Interactive Brokers","publisher":{"@id":"https:\/\/ibkrcampus.com\/campus\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ibkrcampus.com\/campus\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ibkrcampus.com\/campus\/#organization","name":"Interactive Brokers","alternateName":"IBKR","url":"https:\/\/ibkrcampus.com\/campus\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/logo\/image\/","url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/05\/ibkr-campus-logo.jpg","contentUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/05\/ibkr-campus-logo.jpg","width":669,"height":669,"caption":"Interactive Brokers"},"image":{"@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/logo\/image\/"},"publishingPrinciples":"https:\/\/www.interactivebrokers.com\/campus\/about-ibkr-campus\/","ethicsPolicy":"https:\/\/www.interactivebrokers.com\/campus\/cyber-security-notice\/"},{"@type":"Person","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/person\/79c2a2775a70a4da1accf0068d731933","name":"Kris Longmore","url":"https:\/\/www.interactivebrokers.com\/campus\/author\/krislongmore\/"}]}},"jetpack_featured_media_url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2021\/03\/R-programing.jpg","_links":{"self":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts\/111599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/users\/271"}],"replies":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/comments?post=111599"}],"version-history":[{"count":0,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts\/111599\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/media\/80184"}],"wp:attachment":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/media?parent=111599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/categories?post=111599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/tags?post=111599"},{"taxonomy":"contributors-categories","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/contributors-categories?post=111599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}