mirror of
https://github.com/wilsonfreitas/awesome-quant.git
synced 2026-08-17 05:48:06 +00:00
new structure
This commit is contained in:
@@ -0,0 +1 @@
|
||||
/.quarto/
|
||||
@@ -0,0 +1,134 @@
|
||||
---
|
||||
title: "Contributor Covenant Code of Conduct"
|
||||
include-in-header:
|
||||
- text: |
|
||||
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7994446359957143"
|
||||
crossorigin="anonymous"></script>
|
||||
---
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
awesom3quant@gmail.com.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
@@ -0,0 +1,26 @@
|
||||
project:
|
||||
type: website
|
||||
output-dir: docs
|
||||
render:
|
||||
- "*.qmd"
|
||||
- "*.ipynb"
|
||||
- "!quant.md"
|
||||
- "!github.ipynb"
|
||||
|
||||
website:
|
||||
title: "Awesome Quant"
|
||||
navbar:
|
||||
left:
|
||||
- href: index.qmd
|
||||
text: Home
|
||||
- href: projects.qmd
|
||||
text: Projects
|
||||
- href: CODE_OF_CONDUCT.qmd
|
||||
text: Code of Conduct
|
||||
|
||||
format:
|
||||
html:
|
||||
theme: cosmo
|
||||
css: styles.css
|
||||
toc: true
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title: "About"
|
||||
include-in-header:
|
||||
- text: |
|
||||
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7994446359957143"
|
||||
crossorigin="anonymous"></script>
|
||||
---
|
||||
|
||||
About this site
|
||||
@@ -0,0 +1,622 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta name="generator" content="quarto-1.4.550">
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||||
|
||||
|
||||
<title>Awesome Quant - Contributor Covenant Code of Conduct</title>
|
||||
<style>
|
||||
code{white-space: pre-wrap;}
|
||||
span.smallcaps{font-variant: small-caps;}
|
||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||
div.column{flex: auto; overflow-x: auto;}
|
||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||
ul.task-list{list-style: none;}
|
||||
ul.task-list li input[type="checkbox"] {
|
||||
width: 0.8em;
|
||||
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
|
||||
vertical-align: middle;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script src="site_libs/quarto-nav/quarto-nav.js"></script>
|
||||
<script src="site_libs/quarto-nav/headroom.min.js"></script>
|
||||
<script src="site_libs/clipboard/clipboard.min.js"></script>
|
||||
<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
|
||||
<script src="site_libs/quarto-search/fuse.min.js"></script>
|
||||
<script src="site_libs/quarto-search/quarto-search.js"></script>
|
||||
<meta name="quarto:offset" content="./">
|
||||
<script src="site_libs/quarto-html/quarto.js"></script>
|
||||
<script src="site_libs/quarto-html/popper.min.js"></script>
|
||||
<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
|
||||
<script src="site_libs/quarto-html/anchor.min.js"></script>
|
||||
<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
|
||||
<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
|
||||
<script src="site_libs/bootstrap/bootstrap.min.js"></script>
|
||||
<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
|
||||
<link href="site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
|
||||
<script id="quarto-search-options" type="application/json">{
|
||||
"location": "navbar",
|
||||
"copy-button": false,
|
||||
"collapse-after": 3,
|
||||
"panel-placement": "end",
|
||||
"type": "overlay",
|
||||
"limit": 50,
|
||||
"keyboard-shortcut": [
|
||||
"f",
|
||||
"/",
|
||||
"s"
|
||||
],
|
||||
"show-item-context": false,
|
||||
"language": {
|
||||
"search-no-results-text": "No results",
|
||||
"search-matching-documents-text": "matching documents",
|
||||
"search-copy-link-title": "Copy link to search",
|
||||
"search-hide-matches-text": "Hide additional matches",
|
||||
"search-more-match-text": "more match in this document",
|
||||
"search-more-matches-text": "more matches in this document",
|
||||
"search-clear-button-title": "Clear",
|
||||
"search-text-placeholder": "",
|
||||
"search-detached-cancel-button-title": "Cancel",
|
||||
"search-submit-button-title": "Submit",
|
||||
"search-label": "Search"
|
||||
}
|
||||
}</script>
|
||||
<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7994446359957143" crossorigin="anonymous"></script>
|
||||
|
||||
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
</head>
|
||||
|
||||
<body class="nav-fixed">
|
||||
|
||||
<div id="quarto-search-results"></div>
|
||||
<header id="quarto-header" class="headroom fixed-top">
|
||||
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
|
||||
<div class="navbar-container container-fluid">
|
||||
<div class="navbar-brand-container mx-auto">
|
||||
<a class="navbar-brand" href="./index.html">
|
||||
<span class="navbar-title">Awesome Quant</span>
|
||||
</a>
|
||||
</div>
|
||||
<div id="quarto-search" class="" title="Search"></div>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="./index.html">
|
||||
<span class="menu-text">Home</span></a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="./projects.html">
|
||||
<span class="menu-text">Projects</span></a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" href="./CODE_OF_CONDUCT.html" aria-current="page">
|
||||
<span class="menu-text">Code of Conduct</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
</div> <!-- /navcollapse -->
|
||||
<div class="quarto-navbar-tools">
|
||||
</div>
|
||||
</div> <!-- /container-fluid -->
|
||||
</nav>
|
||||
</header>
|
||||
<!-- content -->
|
||||
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
|
||||
<!-- sidebar -->
|
||||
<!-- margin-sidebar -->
|
||||
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
|
||||
<nav id="TOC" role="doc-toc" class="toc-active">
|
||||
<h2 id="toc-title">On this page</h2>
|
||||
|
||||
<ul>
|
||||
<li><a href="#our-pledge" id="toc-our-pledge" class="nav-link active" data-scroll-target="#our-pledge">Our Pledge</a></li>
|
||||
<li><a href="#our-standards" id="toc-our-standards" class="nav-link" data-scroll-target="#our-standards">Our Standards</a></li>
|
||||
<li><a href="#enforcement-responsibilities" id="toc-enforcement-responsibilities" class="nav-link" data-scroll-target="#enforcement-responsibilities">Enforcement Responsibilities</a></li>
|
||||
<li><a href="#scope" id="toc-scope" class="nav-link" data-scroll-target="#scope">Scope</a></li>
|
||||
<li><a href="#enforcement" id="toc-enforcement" class="nav-link" data-scroll-target="#enforcement">Enforcement</a></li>
|
||||
<li><a href="#enforcement-guidelines" id="toc-enforcement-guidelines" class="nav-link" data-scroll-target="#enforcement-guidelines">Enforcement Guidelines</a>
|
||||
<ul class="collapse">
|
||||
<li><a href="#correction" id="toc-correction" class="nav-link" data-scroll-target="#correction">1. Correction</a></li>
|
||||
<li><a href="#warning" id="toc-warning" class="nav-link" data-scroll-target="#warning">2. Warning</a></li>
|
||||
<li><a href="#temporary-ban" id="toc-temporary-ban" class="nav-link" data-scroll-target="#temporary-ban">3. Temporary Ban</a></li>
|
||||
<li><a href="#permanent-ban" id="toc-permanent-ban" class="nav-link" data-scroll-target="#permanent-ban">4. Permanent Ban</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#attribution" id="toc-attribution" class="nav-link" data-scroll-target="#attribution">Attribution</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
<!-- main -->
|
||||
<main class="content" id="quarto-document-content">
|
||||
|
||||
<header id="title-block-header" class="quarto-title-block default">
|
||||
<div class="quarto-title">
|
||||
<h1 class="title">Contributor Covenant Code of Conduct</h1>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="quarto-title-meta">
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<section id="our-pledge" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="our-pledge">Our Pledge</h2>
|
||||
<p>We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.</p>
|
||||
<p>We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.</p>
|
||||
</section>
|
||||
<section id="our-standards" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="our-standards">Our Standards</h2>
|
||||
<p>Examples of behavior that contributes to a positive environment for our community include:</p>
|
||||
<ul>
|
||||
<li>Demonstrating empathy and kindness toward other people</li>
|
||||
<li>Being respectful of differing opinions, viewpoints, and experiences</li>
|
||||
<li>Giving and gracefully accepting constructive feedback</li>
|
||||
<li>Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience</li>
|
||||
<li>Focusing on what is best not just for us as individuals, but for the overall community</li>
|
||||
</ul>
|
||||
<p>Examples of unacceptable behavior include:</p>
|
||||
<ul>
|
||||
<li>The use of sexualized language or imagery, and sexual attention or advances of any kind</li>
|
||||
<li>Trolling, insulting or derogatory comments, and personal or political attacks</li>
|
||||
<li>Public or private harassment</li>
|
||||
<li>Publishing others’ private information, such as a physical or email address, without their explicit permission</li>
|
||||
<li>Other conduct which could reasonably be considered inappropriate in a professional setting</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section id="enforcement-responsibilities" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="enforcement-responsibilities">Enforcement Responsibilities</h2>
|
||||
<p>Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.</p>
|
||||
<p>Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.</p>
|
||||
</section>
|
||||
<section id="scope" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="scope">Scope</h2>
|
||||
<p>This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.</p>
|
||||
</section>
|
||||
<section id="enforcement" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="enforcement">Enforcement</h2>
|
||||
<p>Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at awesom3quant@gmail.com. All complaints will be reviewed and investigated promptly and fairly.</p>
|
||||
<p>All community leaders are obligated to respect the privacy and security of the reporter of any incident.</p>
|
||||
</section>
|
||||
<section id="enforcement-guidelines" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="enforcement-guidelines">Enforcement Guidelines</h2>
|
||||
<p>Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:</p>
|
||||
<section id="correction" class="level3">
|
||||
<h3 class="anchored" data-anchor-id="correction">1. Correction</h3>
|
||||
<p><strong>Community Impact</strong>: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.</p>
|
||||
<p><strong>Consequence</strong>: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.</p>
|
||||
</section>
|
||||
<section id="warning" class="level3">
|
||||
<h3 class="anchored" data-anchor-id="warning">2. Warning</h3>
|
||||
<p><strong>Community Impact</strong>: A violation through a single incident or series of actions.</p>
|
||||
<p><strong>Consequence</strong>: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.</p>
|
||||
</section>
|
||||
<section id="temporary-ban" class="level3">
|
||||
<h3 class="anchored" data-anchor-id="temporary-ban">3. Temporary Ban</h3>
|
||||
<p><strong>Community Impact</strong>: A serious violation of community standards, including sustained inappropriate behavior.</p>
|
||||
<p><strong>Consequence</strong>: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.</p>
|
||||
</section>
|
||||
<section id="permanent-ban" class="level3">
|
||||
<h3 class="anchored" data-anchor-id="permanent-ban">4. Permanent Ban</h3>
|
||||
<p><strong>Community Impact</strong>: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.</p>
|
||||
<p><strong>Consequence</strong>: A permanent ban from any sort of public interaction within the community.</p>
|
||||
</section>
|
||||
</section>
|
||||
<section id="attribution" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="attribution">Attribution</h2>
|
||||
<p>This Code of Conduct is adapted from the <a href="https://www.contributor-covenant.org">Contributor Covenant</a>, version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.</p>
|
||||
<p>Community Impact Guidelines were inspired by <a href="https://github.com/mozilla/diversity">Mozilla’s code of conduct enforcement ladder</a>.</p>
|
||||
<p>For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.</p>
|
||||
|
||||
|
||||
</section>
|
||||
|
||||
</main> <!-- /main -->
|
||||
<script id="quarto-html-after-body" type="application/javascript">
|
||||
window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||
const toggleBodyColorMode = (bsSheetEl) => {
|
||||
const mode = bsSheetEl.getAttribute("data-mode");
|
||||
const bodyEl = window.document.querySelector("body");
|
||||
if (mode === "dark") {
|
||||
bodyEl.classList.add("quarto-dark");
|
||||
bodyEl.classList.remove("quarto-light");
|
||||
} else {
|
||||
bodyEl.classList.add("quarto-light");
|
||||
bodyEl.classList.remove("quarto-dark");
|
||||
}
|
||||
}
|
||||
const toggleBodyColorPrimary = () => {
|
||||
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
|
||||
if (bsSheetEl) {
|
||||
toggleBodyColorMode(bsSheetEl);
|
||||
}
|
||||
}
|
||||
toggleBodyColorPrimary();
|
||||
const icon = "";
|
||||
const anchorJS = new window.AnchorJS();
|
||||
anchorJS.options = {
|
||||
placement: 'right',
|
||||
icon: icon
|
||||
};
|
||||
anchorJS.add('.anchored');
|
||||
const isCodeAnnotation = (el) => {
|
||||
for (const clz of el.classList) {
|
||||
if (clz.startsWith('code-annotation-')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
const clipboard = new window.ClipboardJS('.code-copy-button', {
|
||||
text: function(trigger) {
|
||||
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
||||
for (const childEl of codeEl.children) {
|
||||
if (isCodeAnnotation(childEl)) {
|
||||
childEl.remove();
|
||||
}
|
||||
}
|
||||
return codeEl.innerText;
|
||||
}
|
||||
});
|
||||
clipboard.on('success', function(e) {
|
||||
// button target
|
||||
const button = e.trigger;
|
||||
// don't keep focus
|
||||
button.blur();
|
||||
// flash "checked"
|
||||
button.classList.add('code-copy-button-checked');
|
||||
var currentTitle = button.getAttribute("title");
|
||||
button.setAttribute("title", "Copied!");
|
||||
let tooltip;
|
||||
if (window.bootstrap) {
|
||||
button.setAttribute("data-bs-toggle", "tooltip");
|
||||
button.setAttribute("data-bs-placement", "left");
|
||||
button.setAttribute("data-bs-title", "Copied!");
|
||||
tooltip = new bootstrap.Tooltip(button,
|
||||
{ trigger: "manual",
|
||||
customClass: "code-copy-button-tooltip",
|
||||
offset: [0, -8]});
|
||||
tooltip.show();
|
||||
}
|
||||
setTimeout(function() {
|
||||
if (tooltip) {
|
||||
tooltip.hide();
|
||||
button.removeAttribute("data-bs-title");
|
||||
button.removeAttribute("data-bs-toggle");
|
||||
button.removeAttribute("data-bs-placement");
|
||||
}
|
||||
button.setAttribute("title", currentTitle);
|
||||
button.classList.remove('code-copy-button-checked');
|
||||
}, 1000);
|
||||
// clear code selection
|
||||
e.clearSelection();
|
||||
});
|
||||
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
|
||||
const config = {
|
||||
allowHTML: true,
|
||||
maxWidth: 500,
|
||||
delay: 100,
|
||||
arrow: false,
|
||||
appendTo: function(el) {
|
||||
return el.parentElement;
|
||||
},
|
||||
interactive: true,
|
||||
interactiveBorder: 10,
|
||||
theme: 'quarto',
|
||||
placement: 'bottom-start',
|
||||
};
|
||||
if (contentFn) {
|
||||
config.content = contentFn;
|
||||
}
|
||||
if (onTriggerFn) {
|
||||
config.onTrigger = onTriggerFn;
|
||||
}
|
||||
if (onUntriggerFn) {
|
||||
config.onUntrigger = onUntriggerFn;
|
||||
}
|
||||
window.tippy(el, config);
|
||||
}
|
||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
||||
for (var i=0; i<noterefs.length; i++) {
|
||||
const ref = noterefs[i];
|
||||
tippyHover(ref, function() {
|
||||
// use id or data attribute instead here
|
||||
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
|
||||
try { href = new URL(href).hash; } catch {}
|
||||
const id = href.replace(/^#\/?/, "");
|
||||
const note = window.document.getElementById(id);
|
||||
return note.innerHTML;
|
||||
});
|
||||
}
|
||||
const xrefs = window.document.querySelectorAll('a.quarto-xref');
|
||||
const processXRef = (id, note) => {
|
||||
// Strip column container classes
|
||||
const stripColumnClz = (el) => {
|
||||
el.classList.remove("page-full", "page-columns");
|
||||
if (el.children) {
|
||||
for (const child of el.children) {
|
||||
stripColumnClz(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
stripColumnClz(note)
|
||||
if (id === null || id.startsWith('sec-')) {
|
||||
// Special case sections, only their first couple elements
|
||||
const container = document.createElement("div");
|
||||
if (note.children && note.children.length > 2) {
|
||||
container.appendChild(note.children[0].cloneNode(true));
|
||||
for (let i = 1; i < note.children.length; i++) {
|
||||
const child = note.children[i];
|
||||
if (child.tagName === "P" && child.innerText === "") {
|
||||
continue;
|
||||
} else {
|
||||
container.appendChild(child.cloneNode(true));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (window.Quarto?.typesetMath) {
|
||||
window.Quarto.typesetMath(container);
|
||||
}
|
||||
return container.innerHTML
|
||||
} else {
|
||||
if (window.Quarto?.typesetMath) {
|
||||
window.Quarto.typesetMath(note);
|
||||
}
|
||||
return note.innerHTML;
|
||||
}
|
||||
} else {
|
||||
// Remove any anchor links if they are present
|
||||
const anchorLink = note.querySelector('a.anchorjs-link');
|
||||
if (anchorLink) {
|
||||
anchorLink.remove();
|
||||
}
|
||||
if (window.Quarto?.typesetMath) {
|
||||
window.Quarto.typesetMath(note);
|
||||
}
|
||||
// TODO in 1.5, we should make sure this works without a callout special case
|
||||
if (note.classList.contains("callout")) {
|
||||
return note.outerHTML;
|
||||
} else {
|
||||
return note.innerHTML;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var i=0; i<xrefs.length; i++) {
|
||||
const xref = xrefs[i];
|
||||
tippyHover(xref, undefined, function(instance) {
|
||||
instance.disable();
|
||||
let url = xref.getAttribute('href');
|
||||
let hash = undefined;
|
||||
if (url.startsWith('#')) {
|
||||
hash = url;
|
||||
} else {
|
||||
try { hash = new URL(url).hash; } catch {}
|
||||
}
|
||||
if (hash) {
|
||||
const id = hash.replace(/^#\/?/, "");
|
||||
const note = window.document.getElementById(id);
|
||||
if (note !== null) {
|
||||
try {
|
||||
const html = processXRef(id, note.cloneNode(true));
|
||||
instance.setContent(html);
|
||||
} finally {
|
||||
instance.enable();
|
||||
instance.show();
|
||||
}
|
||||
} else {
|
||||
// See if we can fetch this
|
||||
fetch(url.split('#')[0])
|
||||
.then(res => res.text())
|
||||
.then(html => {
|
||||
const parser = new DOMParser();
|
||||
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||
const note = htmlDoc.getElementById(id);
|
||||
if (note !== null) {
|
||||
const html = processXRef(id, note);
|
||||
instance.setContent(html);
|
||||
}
|
||||
}).finally(() => {
|
||||
instance.enable();
|
||||
instance.show();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// See if we can fetch a full url (with no hash to target)
|
||||
// This is a special case and we should probably do some content thinning / targeting
|
||||
fetch(url)
|
||||
.then(res => res.text())
|
||||
.then(html => {
|
||||
const parser = new DOMParser();
|
||||
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||
const note = htmlDoc.querySelector('main.content');
|
||||
if (note !== null) {
|
||||
// This should only happen for chapter cross references
|
||||
// (since there is no id in the URL)
|
||||
// remove the first header
|
||||
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
|
||||
note.children[0].remove();
|
||||
}
|
||||
const html = processXRef(null, note);
|
||||
instance.setContent(html);
|
||||
}
|
||||
}).finally(() => {
|
||||
instance.enable();
|
||||
instance.show();
|
||||
});
|
||||
}
|
||||
}, function(instance) {
|
||||
});
|
||||
}
|
||||
let selectedAnnoteEl;
|
||||
const selectorForAnnotation = ( cell, annotation) => {
|
||||
let cellAttr = 'data-code-cell="' + cell + '"';
|
||||
let lineAttr = 'data-code-annotation="' + annotation + '"';
|
||||
const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
|
||||
return selector;
|
||||
}
|
||||
const selectCodeLines = (annoteEl) => {
|
||||
const doc = window.document;
|
||||
const targetCell = annoteEl.getAttribute("data-target-cell");
|
||||
const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
|
||||
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
|
||||
const lines = annoteSpan.getAttribute("data-code-lines").split(",");
|
||||
const lineIds = lines.map((line) => {
|
||||
return targetCell + "-" + line;
|
||||
})
|
||||
let top = null;
|
||||
let height = null;
|
||||
let parent = null;
|
||||
if (lineIds.length > 0) {
|
||||
//compute the position of the single el (top and bottom and make a div)
|
||||
const el = window.document.getElementById(lineIds[0]);
|
||||
top = el.offsetTop;
|
||||
height = el.offsetHeight;
|
||||
parent = el.parentElement.parentElement;
|
||||
if (lineIds.length > 1) {
|
||||
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
|
||||
const bottom = lastEl.offsetTop + lastEl.offsetHeight;
|
||||
height = bottom - top;
|
||||
}
|
||||
if (top !== null && height !== null && parent !== null) {
|
||||
// cook up a div (if necessary) and position it
|
||||
let div = window.document.getElementById("code-annotation-line-highlight");
|
||||
if (div === null) {
|
||||
div = window.document.createElement("div");
|
||||
div.setAttribute("id", "code-annotation-line-highlight");
|
||||
div.style.position = 'absolute';
|
||||
parent.appendChild(div);
|
||||
}
|
||||
div.style.top = top - 2 + "px";
|
||||
div.style.height = height + 4 + "px";
|
||||
div.style.left = 0;
|
||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||
if (gutterDiv === null) {
|
||||
gutterDiv = window.document.createElement("div");
|
||||
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
|
||||
gutterDiv.style.position = 'absolute';
|
||||
const codeCell = window.document.getElementById(targetCell);
|
||||
const gutter = codeCell.querySelector('.code-annotation-gutter');
|
||||
gutter.appendChild(gutterDiv);
|
||||
}
|
||||
gutterDiv.style.top = top - 2 + "px";
|
||||
gutterDiv.style.height = height + 4 + "px";
|
||||
}
|
||||
selectedAnnoteEl = annoteEl;
|
||||
}
|
||||
};
|
||||
const unselectCodeLines = () => {
|
||||
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
|
||||
elementsIds.forEach((elId) => {
|
||||
const div = window.document.getElementById(elId);
|
||||
if (div) {
|
||||
div.remove();
|
||||
}
|
||||
});
|
||||
selectedAnnoteEl = undefined;
|
||||
};
|
||||
// Handle positioning of the toggle
|
||||
window.addEventListener(
|
||||
"resize",
|
||||
throttle(() => {
|
||||
elRect = undefined;
|
||||
if (selectedAnnoteEl) {
|
||||
selectCodeLines(selectedAnnoteEl);
|
||||
}
|
||||
}, 10)
|
||||
);
|
||||
function throttle(fn, ms) {
|
||||
let throttle = false;
|
||||
let timer;
|
||||
return (...args) => {
|
||||
if(!throttle) { // first call gets through
|
||||
fn.apply(this, args);
|
||||
throttle = true;
|
||||
} else { // all the others get throttled
|
||||
if(timer) clearTimeout(timer); // cancel #2
|
||||
timer = setTimeout(() => {
|
||||
fn.apply(this, args);
|
||||
timer = throttle = false;
|
||||
}, ms);
|
||||
}
|
||||
};
|
||||
}
|
||||
// Attach click handler to the DT
|
||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||
for (const annoteDlNode of annoteDls) {
|
||||
annoteDlNode.addEventListener('click', (event) => {
|
||||
const clickedEl = event.target;
|
||||
if (clickedEl !== selectedAnnoteEl) {
|
||||
unselectCodeLines();
|
||||
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
|
||||
if (activeEl) {
|
||||
activeEl.classList.remove('code-annotation-active');
|
||||
}
|
||||
selectCodeLines(clickedEl);
|
||||
clickedEl.classList.add('code-annotation-active');
|
||||
} else {
|
||||
// Unselect the line
|
||||
unselectCodeLines();
|
||||
clickedEl.classList.remove('code-annotation-active');
|
||||
}
|
||||
});
|
||||
}
|
||||
const findCites = (el) => {
|
||||
const parentEl = el.parentElement;
|
||||
if (parentEl) {
|
||||
const cites = parentEl.dataset.cites;
|
||||
if (cites) {
|
||||
return {
|
||||
el,
|
||||
cites: cites.split(' ')
|
||||
};
|
||||
} else {
|
||||
return findCites(el.parentElement)
|
||||
}
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
|
||||
for (var i=0; i<bibliorefs.length; i++) {
|
||||
const ref = bibliorefs[i];
|
||||
const citeInfo = findCites(ref);
|
||||
if (citeInfo) {
|
||||
tippyHover(citeInfo.el, function() {
|
||||
var popup = window.document.createElement('div');
|
||||
citeInfo.cites.forEach(function(cite) {
|
||||
var citeDiv = window.document.createElement('div');
|
||||
citeDiv.classList.add('hanging-indent');
|
||||
citeDiv.classList.add('csl-entry');
|
||||
var biblioDiv = window.document.getElementById('ref-' + cite);
|
||||
if (biblioDiv) {
|
||||
citeDiv.innerHTML = biblioDiv.innerHTML;
|
||||
}
|
||||
popup.appendChild(citeDiv);
|
||||
});
|
||||
return popup.innerHTML;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</div> <!-- /content -->
|
||||
|
||||
|
||||
|
||||
|
||||
</body></html>
|
||||
@@ -0,0 +1,537 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta name="generator" content="quarto-1.4.550">
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||||
|
||||
|
||||
<title>Awesome Quant - About</title>
|
||||
<style>
|
||||
code{white-space: pre-wrap;}
|
||||
span.smallcaps{font-variant: small-caps;}
|
||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||
div.column{flex: auto; overflow-x: auto;}
|
||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||
ul.task-list{list-style: none;}
|
||||
ul.task-list li input[type="checkbox"] {
|
||||
width: 0.8em;
|
||||
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
|
||||
vertical-align: middle;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script src="site_libs/quarto-nav/quarto-nav.js"></script>
|
||||
<script src="site_libs/quarto-nav/headroom.min.js"></script>
|
||||
<script src="site_libs/clipboard/clipboard.min.js"></script>
|
||||
<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
|
||||
<script src="site_libs/quarto-search/fuse.min.js"></script>
|
||||
<script src="site_libs/quarto-search/quarto-search.js"></script>
|
||||
<meta name="quarto:offset" content="./">
|
||||
<script src="site_libs/quarto-html/quarto.js"></script>
|
||||
<script src="site_libs/quarto-html/popper.min.js"></script>
|
||||
<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
|
||||
<script src="site_libs/quarto-html/anchor.min.js"></script>
|
||||
<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
|
||||
<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
|
||||
<script src="site_libs/bootstrap/bootstrap.min.js"></script>
|
||||
<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
|
||||
<link href="site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
|
||||
<script id="quarto-search-options" type="application/json">{
|
||||
"location": "navbar",
|
||||
"copy-button": false,
|
||||
"collapse-after": 3,
|
||||
"panel-placement": "end",
|
||||
"type": "overlay",
|
||||
"limit": 50,
|
||||
"keyboard-shortcut": [
|
||||
"f",
|
||||
"/",
|
||||
"s"
|
||||
],
|
||||
"show-item-context": false,
|
||||
"language": {
|
||||
"search-no-results-text": "No results",
|
||||
"search-matching-documents-text": "matching documents",
|
||||
"search-copy-link-title": "Copy link to search",
|
||||
"search-hide-matches-text": "Hide additional matches",
|
||||
"search-more-match-text": "more match in this document",
|
||||
"search-more-matches-text": "more matches in this document",
|
||||
"search-clear-button-title": "Clear",
|
||||
"search-text-placeholder": "",
|
||||
"search-detached-cancel-button-title": "Cancel",
|
||||
"search-submit-button-title": "Submit",
|
||||
"search-label": "Search"
|
||||
}
|
||||
}</script>
|
||||
<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7994446359957143" crossorigin="anonymous"></script>
|
||||
|
||||
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
</head>
|
||||
|
||||
<body class="nav-fixed">
|
||||
|
||||
<div id="quarto-search-results"></div>
|
||||
<header id="quarto-header" class="headroom fixed-top">
|
||||
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
|
||||
<div class="navbar-container container-fluid">
|
||||
<div class="navbar-brand-container mx-auto">
|
||||
<a class="navbar-brand" href="./index.html">
|
||||
<span class="navbar-title">Awesome Quant</span>
|
||||
</a>
|
||||
</div>
|
||||
<div id="quarto-search" class="" title="Search"></div>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="./index.html">
|
||||
<span class="menu-text">Home</span></a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="./projects.html">
|
||||
<span class="menu-text">Projects</span></a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="./CODE_OF_CONDUCT.html">
|
||||
<span class="menu-text">Code of Conduct</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
</div> <!-- /navcollapse -->
|
||||
<div class="quarto-navbar-tools">
|
||||
</div>
|
||||
</div> <!-- /container-fluid -->
|
||||
</nav>
|
||||
</header>
|
||||
<!-- content -->
|
||||
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
|
||||
<!-- sidebar -->
|
||||
<!-- margin-sidebar -->
|
||||
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
|
||||
|
||||
</div>
|
||||
<!-- main -->
|
||||
<main class="content" id="quarto-document-content">
|
||||
|
||||
<header id="title-block-header" class="quarto-title-block default">
|
||||
<div class="quarto-title">
|
||||
<h1 class="title">About</h1>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="quarto-title-meta">
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<p>About this site</p>
|
||||
|
||||
|
||||
|
||||
</main> <!-- /main -->
|
||||
<script id="quarto-html-after-body" type="application/javascript">
|
||||
window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||
const toggleBodyColorMode = (bsSheetEl) => {
|
||||
const mode = bsSheetEl.getAttribute("data-mode");
|
||||
const bodyEl = window.document.querySelector("body");
|
||||
if (mode === "dark") {
|
||||
bodyEl.classList.add("quarto-dark");
|
||||
bodyEl.classList.remove("quarto-light");
|
||||
} else {
|
||||
bodyEl.classList.add("quarto-light");
|
||||
bodyEl.classList.remove("quarto-dark");
|
||||
}
|
||||
}
|
||||
const toggleBodyColorPrimary = () => {
|
||||
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
|
||||
if (bsSheetEl) {
|
||||
toggleBodyColorMode(bsSheetEl);
|
||||
}
|
||||
}
|
||||
toggleBodyColorPrimary();
|
||||
const icon = "";
|
||||
const anchorJS = new window.AnchorJS();
|
||||
anchorJS.options = {
|
||||
placement: 'right',
|
||||
icon: icon
|
||||
};
|
||||
anchorJS.add('.anchored');
|
||||
const isCodeAnnotation = (el) => {
|
||||
for (const clz of el.classList) {
|
||||
if (clz.startsWith('code-annotation-')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
const clipboard = new window.ClipboardJS('.code-copy-button', {
|
||||
text: function(trigger) {
|
||||
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
||||
for (const childEl of codeEl.children) {
|
||||
if (isCodeAnnotation(childEl)) {
|
||||
childEl.remove();
|
||||
}
|
||||
}
|
||||
return codeEl.innerText;
|
||||
}
|
||||
});
|
||||
clipboard.on('success', function(e) {
|
||||
// button target
|
||||
const button = e.trigger;
|
||||
// don't keep focus
|
||||
button.blur();
|
||||
// flash "checked"
|
||||
button.classList.add('code-copy-button-checked');
|
||||
var currentTitle = button.getAttribute("title");
|
||||
button.setAttribute("title", "Copied!");
|
||||
let tooltip;
|
||||
if (window.bootstrap) {
|
||||
button.setAttribute("data-bs-toggle", "tooltip");
|
||||
button.setAttribute("data-bs-placement", "left");
|
||||
button.setAttribute("data-bs-title", "Copied!");
|
||||
tooltip = new bootstrap.Tooltip(button,
|
||||
{ trigger: "manual",
|
||||
customClass: "code-copy-button-tooltip",
|
||||
offset: [0, -8]});
|
||||
tooltip.show();
|
||||
}
|
||||
setTimeout(function() {
|
||||
if (tooltip) {
|
||||
tooltip.hide();
|
||||
button.removeAttribute("data-bs-title");
|
||||
button.removeAttribute("data-bs-toggle");
|
||||
button.removeAttribute("data-bs-placement");
|
||||
}
|
||||
button.setAttribute("title", currentTitle);
|
||||
button.classList.remove('code-copy-button-checked');
|
||||
}, 1000);
|
||||
// clear code selection
|
||||
e.clearSelection();
|
||||
});
|
||||
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
|
||||
const config = {
|
||||
allowHTML: true,
|
||||
maxWidth: 500,
|
||||
delay: 100,
|
||||
arrow: false,
|
||||
appendTo: function(el) {
|
||||
return el.parentElement;
|
||||
},
|
||||
interactive: true,
|
||||
interactiveBorder: 10,
|
||||
theme: 'quarto',
|
||||
placement: 'bottom-start',
|
||||
};
|
||||
if (contentFn) {
|
||||
config.content = contentFn;
|
||||
}
|
||||
if (onTriggerFn) {
|
||||
config.onTrigger = onTriggerFn;
|
||||
}
|
||||
if (onUntriggerFn) {
|
||||
config.onUntrigger = onUntriggerFn;
|
||||
}
|
||||
window.tippy(el, config);
|
||||
}
|
||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
||||
for (var i=0; i<noterefs.length; i++) {
|
||||
const ref = noterefs[i];
|
||||
tippyHover(ref, function() {
|
||||
// use id or data attribute instead here
|
||||
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
|
||||
try { href = new URL(href).hash; } catch {}
|
||||
const id = href.replace(/^#\/?/, "");
|
||||
const note = window.document.getElementById(id);
|
||||
return note.innerHTML;
|
||||
});
|
||||
}
|
||||
const xrefs = window.document.querySelectorAll('a.quarto-xref');
|
||||
const processXRef = (id, note) => {
|
||||
// Strip column container classes
|
||||
const stripColumnClz = (el) => {
|
||||
el.classList.remove("page-full", "page-columns");
|
||||
if (el.children) {
|
||||
for (const child of el.children) {
|
||||
stripColumnClz(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
stripColumnClz(note)
|
||||
if (id === null || id.startsWith('sec-')) {
|
||||
// Special case sections, only their first couple elements
|
||||
const container = document.createElement("div");
|
||||
if (note.children && note.children.length > 2) {
|
||||
container.appendChild(note.children[0].cloneNode(true));
|
||||
for (let i = 1; i < note.children.length; i++) {
|
||||
const child = note.children[i];
|
||||
if (child.tagName === "P" && child.innerText === "") {
|
||||
continue;
|
||||
} else {
|
||||
container.appendChild(child.cloneNode(true));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (window.Quarto?.typesetMath) {
|
||||
window.Quarto.typesetMath(container);
|
||||
}
|
||||
return container.innerHTML
|
||||
} else {
|
||||
if (window.Quarto?.typesetMath) {
|
||||
window.Quarto.typesetMath(note);
|
||||
}
|
||||
return note.innerHTML;
|
||||
}
|
||||
} else {
|
||||
// Remove any anchor links if they are present
|
||||
const anchorLink = note.querySelector('a.anchorjs-link');
|
||||
if (anchorLink) {
|
||||
anchorLink.remove();
|
||||
}
|
||||
if (window.Quarto?.typesetMath) {
|
||||
window.Quarto.typesetMath(note);
|
||||
}
|
||||
// TODO in 1.5, we should make sure this works without a callout special case
|
||||
if (note.classList.contains("callout")) {
|
||||
return note.outerHTML;
|
||||
} else {
|
||||
return note.innerHTML;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var i=0; i<xrefs.length; i++) {
|
||||
const xref = xrefs[i];
|
||||
tippyHover(xref, undefined, function(instance) {
|
||||
instance.disable();
|
||||
let url = xref.getAttribute('href');
|
||||
let hash = undefined;
|
||||
if (url.startsWith('#')) {
|
||||
hash = url;
|
||||
} else {
|
||||
try { hash = new URL(url).hash; } catch {}
|
||||
}
|
||||
if (hash) {
|
||||
const id = hash.replace(/^#\/?/, "");
|
||||
const note = window.document.getElementById(id);
|
||||
if (note !== null) {
|
||||
try {
|
||||
const html = processXRef(id, note.cloneNode(true));
|
||||
instance.setContent(html);
|
||||
} finally {
|
||||
instance.enable();
|
||||
instance.show();
|
||||
}
|
||||
} else {
|
||||
// See if we can fetch this
|
||||
fetch(url.split('#')[0])
|
||||
.then(res => res.text())
|
||||
.then(html => {
|
||||
const parser = new DOMParser();
|
||||
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||
const note = htmlDoc.getElementById(id);
|
||||
if (note !== null) {
|
||||
const html = processXRef(id, note);
|
||||
instance.setContent(html);
|
||||
}
|
||||
}).finally(() => {
|
||||
instance.enable();
|
||||
instance.show();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// See if we can fetch a full url (with no hash to target)
|
||||
// This is a special case and we should probably do some content thinning / targeting
|
||||
fetch(url)
|
||||
.then(res => res.text())
|
||||
.then(html => {
|
||||
const parser = new DOMParser();
|
||||
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||
const note = htmlDoc.querySelector('main.content');
|
||||
if (note !== null) {
|
||||
// This should only happen for chapter cross references
|
||||
// (since there is no id in the URL)
|
||||
// remove the first header
|
||||
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
|
||||
note.children[0].remove();
|
||||
}
|
||||
const html = processXRef(null, note);
|
||||
instance.setContent(html);
|
||||
}
|
||||
}).finally(() => {
|
||||
instance.enable();
|
||||
instance.show();
|
||||
});
|
||||
}
|
||||
}, function(instance) {
|
||||
});
|
||||
}
|
||||
let selectedAnnoteEl;
|
||||
const selectorForAnnotation = ( cell, annotation) => {
|
||||
let cellAttr = 'data-code-cell="' + cell + '"';
|
||||
let lineAttr = 'data-code-annotation="' + annotation + '"';
|
||||
const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
|
||||
return selector;
|
||||
}
|
||||
const selectCodeLines = (annoteEl) => {
|
||||
const doc = window.document;
|
||||
const targetCell = annoteEl.getAttribute("data-target-cell");
|
||||
const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
|
||||
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
|
||||
const lines = annoteSpan.getAttribute("data-code-lines").split(",");
|
||||
const lineIds = lines.map((line) => {
|
||||
return targetCell + "-" + line;
|
||||
})
|
||||
let top = null;
|
||||
let height = null;
|
||||
let parent = null;
|
||||
if (lineIds.length > 0) {
|
||||
//compute the position of the single el (top and bottom and make a div)
|
||||
const el = window.document.getElementById(lineIds[0]);
|
||||
top = el.offsetTop;
|
||||
height = el.offsetHeight;
|
||||
parent = el.parentElement.parentElement;
|
||||
if (lineIds.length > 1) {
|
||||
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
|
||||
const bottom = lastEl.offsetTop + lastEl.offsetHeight;
|
||||
height = bottom - top;
|
||||
}
|
||||
if (top !== null && height !== null && parent !== null) {
|
||||
// cook up a div (if necessary) and position it
|
||||
let div = window.document.getElementById("code-annotation-line-highlight");
|
||||
if (div === null) {
|
||||
div = window.document.createElement("div");
|
||||
div.setAttribute("id", "code-annotation-line-highlight");
|
||||
div.style.position = 'absolute';
|
||||
parent.appendChild(div);
|
||||
}
|
||||
div.style.top = top - 2 + "px";
|
||||
div.style.height = height + 4 + "px";
|
||||
div.style.left = 0;
|
||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||
if (gutterDiv === null) {
|
||||
gutterDiv = window.document.createElement("div");
|
||||
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
|
||||
gutterDiv.style.position = 'absolute';
|
||||
const codeCell = window.document.getElementById(targetCell);
|
||||
const gutter = codeCell.querySelector('.code-annotation-gutter');
|
||||
gutter.appendChild(gutterDiv);
|
||||
}
|
||||
gutterDiv.style.top = top - 2 + "px";
|
||||
gutterDiv.style.height = height + 4 + "px";
|
||||
}
|
||||
selectedAnnoteEl = annoteEl;
|
||||
}
|
||||
};
|
||||
const unselectCodeLines = () => {
|
||||
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
|
||||
elementsIds.forEach((elId) => {
|
||||
const div = window.document.getElementById(elId);
|
||||
if (div) {
|
||||
div.remove();
|
||||
}
|
||||
});
|
||||
selectedAnnoteEl = undefined;
|
||||
};
|
||||
// Handle positioning of the toggle
|
||||
window.addEventListener(
|
||||
"resize",
|
||||
throttle(() => {
|
||||
elRect = undefined;
|
||||
if (selectedAnnoteEl) {
|
||||
selectCodeLines(selectedAnnoteEl);
|
||||
}
|
||||
}, 10)
|
||||
);
|
||||
function throttle(fn, ms) {
|
||||
let throttle = false;
|
||||
let timer;
|
||||
return (...args) => {
|
||||
if(!throttle) { // first call gets through
|
||||
fn.apply(this, args);
|
||||
throttle = true;
|
||||
} else { // all the others get throttled
|
||||
if(timer) clearTimeout(timer); // cancel #2
|
||||
timer = setTimeout(() => {
|
||||
fn.apply(this, args);
|
||||
timer = throttle = false;
|
||||
}, ms);
|
||||
}
|
||||
};
|
||||
}
|
||||
// Attach click handler to the DT
|
||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||
for (const annoteDlNode of annoteDls) {
|
||||
annoteDlNode.addEventListener('click', (event) => {
|
||||
const clickedEl = event.target;
|
||||
if (clickedEl !== selectedAnnoteEl) {
|
||||
unselectCodeLines();
|
||||
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
|
||||
if (activeEl) {
|
||||
activeEl.classList.remove('code-annotation-active');
|
||||
}
|
||||
selectCodeLines(clickedEl);
|
||||
clickedEl.classList.add('code-annotation-active');
|
||||
} else {
|
||||
// Unselect the line
|
||||
unselectCodeLines();
|
||||
clickedEl.classList.remove('code-annotation-active');
|
||||
}
|
||||
});
|
||||
}
|
||||
const findCites = (el) => {
|
||||
const parentEl = el.parentElement;
|
||||
if (parentEl) {
|
||||
const cites = parentEl.dataset.cites;
|
||||
if (cites) {
|
||||
return {
|
||||
el,
|
||||
cites: cites.split(' ')
|
||||
};
|
||||
} else {
|
||||
return findCites(el.parentElement)
|
||||
}
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
|
||||
for (var i=0; i<bibliorefs.length; i++) {
|
||||
const ref = bibliorefs[i];
|
||||
const citeInfo = findCites(ref);
|
||||
if (citeInfo) {
|
||||
tippyHover(citeInfo.el, function() {
|
||||
var popup = window.document.createElement('div');
|
||||
citeInfo.cites.forEach(function(cite) {
|
||||
var citeDiv = window.document.createElement('div');
|
||||
citeDiv.classList.add('hanging-indent');
|
||||
citeDiv.classList.add('csl-entry');
|
||||
var biblioDiv = window.document.getElementById('ref-' + cite);
|
||||
if (biblioDiv) {
|
||||
citeDiv.innerHTML = biblioDiv.innerHTML;
|
||||
}
|
||||
popup.appendChild(citeDiv);
|
||||
});
|
||||
return popup.innerHTML;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</div> <!-- /content -->
|
||||
|
||||
|
||||
|
||||
|
||||
</body></html>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2078
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+12
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
.container-fluid.crosstalk-bscols{margin-left:-30px;margin-right:-30px;white-space:normal}body>.container-fluid.crosstalk-bscols{margin-left:auto;margin-right:auto}.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:inline-block;padding-right:12px;vertical-align:top}@media only screen and (max-width: 480px){.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:block;padding-right:inherit}}.crosstalk-input{margin-bottom:15px}.crosstalk-input .control-label{margin-bottom:0;vertical-align:middle}.crosstalk-input input[type="checkbox"]{margin:4px 0 0;margin-top:1px;line-height:normal}.crosstalk-input .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.crosstalk-input .checkbox>label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.crosstalk-input .checkbox input[type="checkbox"],.crosstalk-input .checkbox-inline input[type="checkbox"]{position:absolute;margin-top:2px;margin-left:-20px}.crosstalk-input .checkbox+.checkbox{margin-top:-5px}.crosstalk-input .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.crosstalk-input .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,75 @@
|
||||
/* Adjust margins outwards, so column contents line up with the edges of the
|
||||
parent of container-fluid. */
|
||||
.container-fluid.crosstalk-bscols {
|
||||
margin-left: -30px;
|
||||
margin-right: -30px;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
/* But don't adjust the margins outwards if we're directly under the body,
|
||||
i.e. we were the top-level of something at the console. */
|
||||
body > .container-fluid.crosstalk-bscols {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column {
|
||||
display: inline-block;
|
||||
padding-right: 12px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
@media only screen and (max-width:480px) {
|
||||
.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column {
|
||||
display: block;
|
||||
padding-right: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
/* Relevant BS3 styles to make filter_checkbox() look reasonable without Bootstrap */
|
||||
.crosstalk-input {
|
||||
margin-bottom: 15px; /* a la .form-group */
|
||||
.control-label {
|
||||
margin-bottom: 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
input[type="checkbox"] {
|
||||
margin: 4px 0 0;
|
||||
margin-top: 1px;
|
||||
line-height: normal;
|
||||
}
|
||||
.checkbox {
|
||||
position: relative;
|
||||
display: block;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.checkbox > label{
|
||||
padding-left: 20px;
|
||||
margin-bottom: 0;
|
||||
font-weight: 400;
|
||||
cursor: pointer;
|
||||
}
|
||||
.checkbox input[type="checkbox"],
|
||||
.checkbox-inline input[type="checkbox"] {
|
||||
position: absolute;
|
||||
margin-top: 2px;
|
||||
margin-left: -20px;
|
||||
}
|
||||
.checkbox + .checkbox {
|
||||
margin-top: -5px;
|
||||
}
|
||||
.checkbox-inline {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
padding-left: 20px;
|
||||
margin-bottom: 0;
|
||||
font-weight: 400;
|
||||
vertical-align: middle;
|
||||
cursor: pointer;
|
||||
}
|
||||
.checkbox-inline + .checkbox-inline {
|
||||
margin-top: 0;
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,32 @@
|
||||
.dt-crosstalk-fade {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
html body div.DTS div.dataTables_scrollBody {
|
||||
background: none;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Fix https://github.com/rstudio/DT/issues/563
|
||||
If the `table.display` is set to "block" (e.g., pkgdown), the browser will display
|
||||
datatable objects strangely. The search panel and the page buttons will still be
|
||||
in full-width but the table body will be "compact" and shorter.
|
||||
In therory, having this attributes will affect `dom="t"`
|
||||
with `display: block` users. But in reality, there should be no one.
|
||||
We may remove the below lines in the future if the upstream agree to have this there.
|
||||
See https://github.com/DataTables/DataTablesSrc/issues/160
|
||||
*/
|
||||
|
||||
table.dataTable {
|
||||
display: table;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
When DTOutput(fill = TRUE), it receives a .html-fill-item class (via htmltools::bindFillRole()), which effectively amounts to `flex: 1 1 auto`. That's mostly fine, but the case where `fillContainer=TRUE`+`height:auto`+`flex-basis:auto` and the container (e.g., a bslib::card()) doesn't have a defined height is a bit problematic since the table wants to fit the parent but the parent wants to fit the table, which results pretty small table height (maybe because there is a minimum height somewhere?). It seems better in this case to impose a 400px height default for the table, which we can do by setting `flex-basis` to 400px (the table is still allowed to grow/shrink when the container has an opinionated height).
|
||||
*/
|
||||
|
||||
.html-fill-container > .html-fill-item.datatables {
|
||||
flex-basis: 400px;
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/* Selected rows/cells */
|
||||
table.dataTable tr.selected td, table.dataTable td.selected {
|
||||
background-color: #b0bed9 !important;
|
||||
}
|
||||
/* In case of scrollX/Y or FixedHeader */
|
||||
.dataTables_scrollBody .dataTables_sizing {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
/* The datatables' theme CSS file doesn't define
|
||||
the color but with white background. It leads to an issue that
|
||||
when the HTML's body color is set to 'white', the user can't
|
||||
see the text since the background is white. One case happens in the
|
||||
RStudio's IDE when inline viewing the DT table inside an Rmd file,
|
||||
if the IDE theme is set to "Cobalt".
|
||||
|
||||
See https://github.com/rstudio/DT/issues/447 for more info
|
||||
|
||||
This fixes should have little side-effects because all the other elements
|
||||
of the default theme use the #333 font color.
|
||||
|
||||
TODO: The upstream may use relative colors for both the table background
|
||||
and the color. It means the table can display well without this patch
|
||||
then. At that time, we need to remove the below CSS attributes.
|
||||
*/
|
||||
div.datatables {
|
||||
color: #333;
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,901 @@
|
||||
(function() {
|
||||
// If window.HTMLWidgets is already defined, then use it; otherwise create a
|
||||
// new object. This allows preceding code to set options that affect the
|
||||
// initialization process (though none currently exist).
|
||||
window.HTMLWidgets = window.HTMLWidgets || {};
|
||||
|
||||
// See if we're running in a viewer pane. If not, we're in a web browser.
|
||||
var viewerMode = window.HTMLWidgets.viewerMode =
|
||||
/\bviewer_pane=1\b/.test(window.location);
|
||||
|
||||
// See if we're running in Shiny mode. If not, it's a static document.
|
||||
// Note that static widgets can appear in both Shiny and static modes, but
|
||||
// obviously, Shiny widgets can only appear in Shiny apps/documents.
|
||||
var shinyMode = window.HTMLWidgets.shinyMode =
|
||||
typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings;
|
||||
|
||||
// We can't count on jQuery being available, so we implement our own
|
||||
// version if necessary.
|
||||
function querySelectorAll(scope, selector) {
|
||||
if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) {
|
||||
return scope.find(selector);
|
||||
}
|
||||
if (scope.querySelectorAll) {
|
||||
return scope.querySelectorAll(selector);
|
||||
}
|
||||
}
|
||||
|
||||
function asArray(value) {
|
||||
if (value === null)
|
||||
return [];
|
||||
if ($.isArray(value))
|
||||
return value;
|
||||
return [value];
|
||||
}
|
||||
|
||||
// Implement jQuery's extend
|
||||
function extend(target /*, ... */) {
|
||||
if (arguments.length == 1) {
|
||||
return target;
|
||||
}
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
var source = arguments[i];
|
||||
for (var prop in source) {
|
||||
if (source.hasOwnProperty(prop)) {
|
||||
target[prop] = source[prop];
|
||||
}
|
||||
}
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
||||
// IE8 doesn't support Array.forEach.
|
||||
function forEach(values, callback, thisArg) {
|
||||
if (values.forEach) {
|
||||
values.forEach(callback, thisArg);
|
||||
} else {
|
||||
for (var i = 0; i < values.length; i++) {
|
||||
callback.call(thisArg, values[i], i, values);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Replaces the specified method with the return value of funcSource.
|
||||
//
|
||||
// Note that funcSource should not BE the new method, it should be a function
|
||||
// that RETURNS the new method. funcSource receives a single argument that is
|
||||
// the overridden method, it can be called from the new method. The overridden
|
||||
// method can be called like a regular function, it has the target permanently
|
||||
// bound to it so "this" will work correctly.
|
||||
function overrideMethod(target, methodName, funcSource) {
|
||||
var superFunc = target[methodName] || function() {};
|
||||
var superFuncBound = function() {
|
||||
return superFunc.apply(target, arguments);
|
||||
};
|
||||
target[methodName] = funcSource(superFuncBound);
|
||||
}
|
||||
|
||||
// Add a method to delegator that, when invoked, calls
|
||||
// delegatee.methodName. If there is no such method on
|
||||
// the delegatee, but there was one on delegator before
|
||||
// delegateMethod was called, then the original version
|
||||
// is invoked instead.
|
||||
// For example:
|
||||
//
|
||||
// var a = {
|
||||
// method1: function() { console.log('a1'); }
|
||||
// method2: function() { console.log('a2'); }
|
||||
// };
|
||||
// var b = {
|
||||
// method1: function() { console.log('b1'); }
|
||||
// };
|
||||
// delegateMethod(a, b, "method1");
|
||||
// delegateMethod(a, b, "method2");
|
||||
// a.method1();
|
||||
// a.method2();
|
||||
//
|
||||
// The output would be "b1", "a2".
|
||||
function delegateMethod(delegator, delegatee, methodName) {
|
||||
var inherited = delegator[methodName];
|
||||
delegator[methodName] = function() {
|
||||
var target = delegatee;
|
||||
var method = delegatee[methodName];
|
||||
|
||||
// The method doesn't exist on the delegatee. Instead,
|
||||
// call the method on the delegator, if it exists.
|
||||
if (!method) {
|
||||
target = delegator;
|
||||
method = inherited;
|
||||
}
|
||||
|
||||
if (method) {
|
||||
return method.apply(target, arguments);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Implement a vague facsimilie of jQuery's data method
|
||||
function elementData(el, name, value) {
|
||||
if (arguments.length == 2) {
|
||||
return el["htmlwidget_data_" + name];
|
||||
} else if (arguments.length == 3) {
|
||||
el["htmlwidget_data_" + name] = value;
|
||||
return el;
|
||||
} else {
|
||||
throw new Error("Wrong number of arguments for elementData: " +
|
||||
arguments.length);
|
||||
}
|
||||
}
|
||||
|
||||
// http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
|
||||
function escapeRegExp(str) {
|
||||
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
|
||||
}
|
||||
|
||||
function hasClass(el, className) {
|
||||
var re = new RegExp("\\b" + escapeRegExp(className) + "\\b");
|
||||
return re.test(el.className);
|
||||
}
|
||||
|
||||
// elements - array (or array-like object) of HTML elements
|
||||
// className - class name to test for
|
||||
// include - if true, only return elements with given className;
|
||||
// if false, only return elements *without* given className
|
||||
function filterByClass(elements, className, include) {
|
||||
var results = [];
|
||||
for (var i = 0; i < elements.length; i++) {
|
||||
if (hasClass(elements[i], className) == include)
|
||||
results.push(elements[i]);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
function on(obj, eventName, func) {
|
||||
if (obj.addEventListener) {
|
||||
obj.addEventListener(eventName, func, false);
|
||||
} else if (obj.attachEvent) {
|
||||
obj.attachEvent(eventName, func);
|
||||
}
|
||||
}
|
||||
|
||||
function off(obj, eventName, func) {
|
||||
if (obj.removeEventListener)
|
||||
obj.removeEventListener(eventName, func, false);
|
||||
else if (obj.detachEvent) {
|
||||
obj.detachEvent(eventName, func);
|
||||
}
|
||||
}
|
||||
|
||||
// Translate array of values to top/right/bottom/left, as usual with
|
||||
// the "padding" CSS property
|
||||
// https://developer.mozilla.org/en-US/docs/Web/CSS/padding
|
||||
function unpackPadding(value) {
|
||||
if (typeof(value) === "number")
|
||||
value = [value];
|
||||
if (value.length === 1) {
|
||||
return {top: value[0], right: value[0], bottom: value[0], left: value[0]};
|
||||
}
|
||||
if (value.length === 2) {
|
||||
return {top: value[0], right: value[1], bottom: value[0], left: value[1]};
|
||||
}
|
||||
if (value.length === 3) {
|
||||
return {top: value[0], right: value[1], bottom: value[2], left: value[1]};
|
||||
}
|
||||
if (value.length === 4) {
|
||||
return {top: value[0], right: value[1], bottom: value[2], left: value[3]};
|
||||
}
|
||||
}
|
||||
|
||||
// Convert an unpacked padding object to a CSS value
|
||||
function paddingToCss(paddingObj) {
|
||||
return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px";
|
||||
}
|
||||
|
||||
// Makes a number suitable for CSS
|
||||
function px(x) {
|
||||
if (typeof(x) === "number")
|
||||
return x + "px";
|
||||
else
|
||||
return x;
|
||||
}
|
||||
|
||||
// Retrieves runtime widget sizing information for an element.
|
||||
// The return value is either null, or an object with fill, padding,
|
||||
// defaultWidth, defaultHeight fields.
|
||||
function sizingPolicy(el) {
|
||||
var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']");
|
||||
if (!sizingEl)
|
||||
return null;
|
||||
var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}");
|
||||
if (viewerMode) {
|
||||
return sp.viewer;
|
||||
} else {
|
||||
return sp.browser;
|
||||
}
|
||||
}
|
||||
|
||||
// @param tasks Array of strings (or falsy value, in which case no-op).
|
||||
// Each element must be a valid JavaScript expression that yields a
|
||||
// function. Or, can be an array of objects with "code" and "data"
|
||||
// properties; in this case, the "code" property should be a string
|
||||
// of JS that's an expr that yields a function, and "data" should be
|
||||
// an object that will be added as an additional argument when that
|
||||
// function is called.
|
||||
// @param target The object that will be "this" for each function
|
||||
// execution.
|
||||
// @param args Array of arguments to be passed to the functions. (The
|
||||
// same arguments will be passed to all functions.)
|
||||
function evalAndRun(tasks, target, args) {
|
||||
if (tasks) {
|
||||
forEach(tasks, function(task) {
|
||||
var theseArgs = args;
|
||||
if (typeof(task) === "object") {
|
||||
theseArgs = theseArgs.concat([task.data]);
|
||||
task = task.code;
|
||||
}
|
||||
var taskFunc = tryEval(task);
|
||||
if (typeof(taskFunc) !== "function") {
|
||||
throw new Error("Task must be a function! Source:\n" + task);
|
||||
}
|
||||
taskFunc.apply(target, theseArgs);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Attempt eval() both with and without enclosing in parentheses.
|
||||
// Note that enclosing coerces a function declaration into
|
||||
// an expression that eval() can parse
|
||||
// (otherwise, a SyntaxError is thrown)
|
||||
function tryEval(code) {
|
||||
var result = null;
|
||||
try {
|
||||
result = eval("(" + code + ")");
|
||||
} catch(error) {
|
||||
if (!(error instanceof SyntaxError)) {
|
||||
throw error;
|
||||
}
|
||||
try {
|
||||
result = eval(code);
|
||||
} catch(e) {
|
||||
if (e instanceof SyntaxError) {
|
||||
throw error;
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function initSizing(el) {
|
||||
var sizing = sizingPolicy(el);
|
||||
if (!sizing)
|
||||
return;
|
||||
|
||||
var cel = document.getElementById("htmlwidget_container");
|
||||
if (!cel)
|
||||
return;
|
||||
|
||||
if (typeof(sizing.padding) !== "undefined") {
|
||||
document.body.style.margin = "0";
|
||||
document.body.style.padding = paddingToCss(unpackPadding(sizing.padding));
|
||||
}
|
||||
|
||||
if (sizing.fill) {
|
||||
document.body.style.overflow = "hidden";
|
||||
document.body.style.width = "100%";
|
||||
document.body.style.height = "100%";
|
||||
document.documentElement.style.width = "100%";
|
||||
document.documentElement.style.height = "100%";
|
||||
cel.style.position = "absolute";
|
||||
var pad = unpackPadding(sizing.padding);
|
||||
cel.style.top = pad.top + "px";
|
||||
cel.style.right = pad.right + "px";
|
||||
cel.style.bottom = pad.bottom + "px";
|
||||
cel.style.left = pad.left + "px";
|
||||
el.style.width = "100%";
|
||||
el.style.height = "100%";
|
||||
|
||||
return {
|
||||
getWidth: function() { return cel.getBoundingClientRect().width; },
|
||||
getHeight: function() { return cel.getBoundingClientRect().height; }
|
||||
};
|
||||
|
||||
} else {
|
||||
el.style.width = px(sizing.width);
|
||||
el.style.height = px(sizing.height);
|
||||
|
||||
return {
|
||||
getWidth: function() { return cel.getBoundingClientRect().width; },
|
||||
getHeight: function() { return cel.getBoundingClientRect().height; }
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Default implementations for methods
|
||||
var defaults = {
|
||||
find: function(scope) {
|
||||
return querySelectorAll(scope, "." + this.name);
|
||||
},
|
||||
renderError: function(el, err) {
|
||||
var $el = $(el);
|
||||
|
||||
this.clearError(el);
|
||||
|
||||
// Add all these error classes, as Shiny does
|
||||
var errClass = "shiny-output-error";
|
||||
if (err.type !== null) {
|
||||
// use the classes of the error condition as CSS class names
|
||||
errClass = errClass + " " + $.map(asArray(err.type), function(type) {
|
||||
return errClass + "-" + type;
|
||||
}).join(" ");
|
||||
}
|
||||
errClass = errClass + " htmlwidgets-error";
|
||||
|
||||
// Is el inline or block? If inline or inline-block, just display:none it
|
||||
// and add an inline error.
|
||||
var display = $el.css("display");
|
||||
$el.data("restore-display-mode", display);
|
||||
|
||||
if (display === "inline" || display === "inline-block") {
|
||||
$el.hide();
|
||||
if (err.message !== "") {
|
||||
var errorSpan = $("<span>").addClass(errClass);
|
||||
errorSpan.text(err.message);
|
||||
$el.after(errorSpan);
|
||||
}
|
||||
} else if (display === "block") {
|
||||
// If block, add an error just after the el, set visibility:none on the
|
||||
// el, and position the error to be on top of the el.
|
||||
// Mark it with a unique ID and CSS class so we can remove it later.
|
||||
$el.css("visibility", "hidden");
|
||||
if (err.message !== "") {
|
||||
var errorDiv = $("<div>").addClass(errClass).css("position", "absolute")
|
||||
.css("top", el.offsetTop)
|
||||
.css("left", el.offsetLeft)
|
||||
// setting width can push out the page size, forcing otherwise
|
||||
// unnecessary scrollbars to appear and making it impossible for
|
||||
// the element to shrink; so use max-width instead
|
||||
.css("maxWidth", el.offsetWidth)
|
||||
.css("height", el.offsetHeight);
|
||||
errorDiv.text(err.message);
|
||||
$el.after(errorDiv);
|
||||
|
||||
// Really dumb way to keep the size/position of the error in sync with
|
||||
// the parent element as the window is resized or whatever.
|
||||
var intId = setInterval(function() {
|
||||
if (!errorDiv[0].parentElement) {
|
||||
clearInterval(intId);
|
||||
return;
|
||||
}
|
||||
errorDiv
|
||||
.css("top", el.offsetTop)
|
||||
.css("left", el.offsetLeft)
|
||||
.css("maxWidth", el.offsetWidth)
|
||||
.css("height", el.offsetHeight);
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
},
|
||||
clearError: function(el) {
|
||||
var $el = $(el);
|
||||
var display = $el.data("restore-display-mode");
|
||||
$el.data("restore-display-mode", null);
|
||||
|
||||
if (display === "inline" || display === "inline-block") {
|
||||
if (display)
|
||||
$el.css("display", display);
|
||||
$(el.nextSibling).filter(".htmlwidgets-error").remove();
|
||||
} else if (display === "block"){
|
||||
$el.css("visibility", "inherit");
|
||||
$(el.nextSibling).filter(".htmlwidgets-error").remove();
|
||||
}
|
||||
},
|
||||
sizing: {}
|
||||
};
|
||||
|
||||
// Called by widget bindings to register a new type of widget. The definition
|
||||
// object can contain the following properties:
|
||||
// - name (required) - A string indicating the binding name, which will be
|
||||
// used by default as the CSS classname to look for.
|
||||
// - initialize (optional) - A function(el) that will be called once per
|
||||
// widget element; if a value is returned, it will be passed as the third
|
||||
// value to renderValue.
|
||||
// - renderValue (required) - A function(el, data, initValue) that will be
|
||||
// called with data. Static contexts will cause this to be called once per
|
||||
// element; Shiny apps will cause this to be called multiple times per
|
||||
// element, as the data changes.
|
||||
window.HTMLWidgets.widget = function(definition) {
|
||||
if (!definition.name) {
|
||||
throw new Error("Widget must have a name");
|
||||
}
|
||||
if (!definition.type) {
|
||||
throw new Error("Widget must have a type");
|
||||
}
|
||||
// Currently we only support output widgets
|
||||
if (definition.type !== "output") {
|
||||
throw new Error("Unrecognized widget type '" + definition.type + "'");
|
||||
}
|
||||
// TODO: Verify that .name is a valid CSS classname
|
||||
|
||||
// Support new-style instance-bound definitions. Old-style class-bound
|
||||
// definitions have one widget "object" per widget per type/class of
|
||||
// widget; the renderValue and resize methods on such widget objects
|
||||
// take el and instance arguments, because the widget object can't
|
||||
// store them. New-style instance-bound definitions have one widget
|
||||
// object per widget instance; the definition that's passed in doesn't
|
||||
// provide renderValue or resize methods at all, just the single method
|
||||
// factory(el, width, height)
|
||||
// which returns an object that has renderValue(x) and resize(w, h).
|
||||
// This enables a far more natural programming style for the widget
|
||||
// author, who can store per-instance state using either OO-style
|
||||
// instance fields or functional-style closure variables (I guess this
|
||||
// is in contrast to what can only be called C-style pseudo-OO which is
|
||||
// what we required before).
|
||||
if (definition.factory) {
|
||||
definition = createLegacyDefinitionAdapter(definition);
|
||||
}
|
||||
|
||||
if (!definition.renderValue) {
|
||||
throw new Error("Widget must have a renderValue function");
|
||||
}
|
||||
|
||||
// For static rendering (non-Shiny), use a simple widget registration
|
||||
// scheme. We also use this scheme for Shiny apps/documents that also
|
||||
// contain static widgets.
|
||||
window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || [];
|
||||
// Merge defaults into the definition; don't mutate the original definition.
|
||||
var staticBinding = extend({}, defaults, definition);
|
||||
overrideMethod(staticBinding, "find", function(superfunc) {
|
||||
return function(scope) {
|
||||
var results = superfunc(scope);
|
||||
// Filter out Shiny outputs, we only want the static kind
|
||||
return filterByClass(results, "html-widget-output", false);
|
||||
};
|
||||
});
|
||||
window.HTMLWidgets.widgets.push(staticBinding);
|
||||
|
||||
if (shinyMode) {
|
||||
// Shiny is running. Register the definition with an output binding.
|
||||
// The definition itself will not be the output binding, instead
|
||||
// we will make an output binding object that delegates to the
|
||||
// definition. This is because we foolishly used the same method
|
||||
// name (renderValue) for htmlwidgets definition and Shiny bindings
|
||||
// but they actually have quite different semantics (the Shiny
|
||||
// bindings receive data that includes lots of metadata that it
|
||||
// strips off before calling htmlwidgets renderValue). We can't
|
||||
// just ignore the difference because in some widgets it's helpful
|
||||
// to call this.renderValue() from inside of resize(), and if
|
||||
// we're not delegating, then that call will go to the Shiny
|
||||
// version instead of the htmlwidgets version.
|
||||
|
||||
// Merge defaults with definition, without mutating either.
|
||||
var bindingDef = extend({}, defaults, definition);
|
||||
|
||||
// This object will be our actual Shiny binding.
|
||||
var shinyBinding = new Shiny.OutputBinding();
|
||||
|
||||
// With a few exceptions, we'll want to simply use the bindingDef's
|
||||
// version of methods if they are available, otherwise fall back to
|
||||
// Shiny's defaults. NOTE: If Shiny's output bindings gain additional
|
||||
// methods in the future, and we want them to be overrideable by
|
||||
// HTMLWidget binding definitions, then we'll need to add them to this
|
||||
// list.
|
||||
delegateMethod(shinyBinding, bindingDef, "getId");
|
||||
delegateMethod(shinyBinding, bindingDef, "onValueChange");
|
||||
delegateMethod(shinyBinding, bindingDef, "onValueError");
|
||||
delegateMethod(shinyBinding, bindingDef, "renderError");
|
||||
delegateMethod(shinyBinding, bindingDef, "clearError");
|
||||
delegateMethod(shinyBinding, bindingDef, "showProgress");
|
||||
|
||||
// The find, renderValue, and resize are handled differently, because we
|
||||
// want to actually decorate the behavior of the bindingDef methods.
|
||||
|
||||
shinyBinding.find = function(scope) {
|
||||
var results = bindingDef.find(scope);
|
||||
|
||||
// Only return elements that are Shiny outputs, not static ones
|
||||
var dynamicResults = results.filter(".html-widget-output");
|
||||
|
||||
// It's possible that whatever caused Shiny to think there might be
|
||||
// new dynamic outputs, also caused there to be new static outputs.
|
||||
// Since there might be lots of different htmlwidgets bindings, we
|
||||
// schedule execution for later--no need to staticRender multiple
|
||||
// times.
|
||||
if (results.length !== dynamicResults.length)
|
||||
scheduleStaticRender();
|
||||
|
||||
return dynamicResults;
|
||||
};
|
||||
|
||||
// Wrap renderValue to handle initialization, which unfortunately isn't
|
||||
// supported natively by Shiny at the time of this writing.
|
||||
|
||||
shinyBinding.renderValue = function(el, data) {
|
||||
Shiny.renderDependencies(data.deps);
|
||||
// Resolve strings marked as javascript literals to objects
|
||||
if (!(data.evals instanceof Array)) data.evals = [data.evals];
|
||||
for (var i = 0; data.evals && i < data.evals.length; i++) {
|
||||
window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]);
|
||||
}
|
||||
if (!bindingDef.renderOnNullValue) {
|
||||
if (data.x === null) {
|
||||
el.style.visibility = "hidden";
|
||||
return;
|
||||
} else {
|
||||
el.style.visibility = "inherit";
|
||||
}
|
||||
}
|
||||
if (!elementData(el, "initialized")) {
|
||||
initSizing(el);
|
||||
|
||||
elementData(el, "initialized", true);
|
||||
if (bindingDef.initialize) {
|
||||
var rect = el.getBoundingClientRect();
|
||||
var result = bindingDef.initialize(el, rect.width, rect.height);
|
||||
elementData(el, "init_result", result);
|
||||
}
|
||||
}
|
||||
bindingDef.renderValue(el, data.x, elementData(el, "init_result"));
|
||||
evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]);
|
||||
};
|
||||
|
||||
// Only override resize if bindingDef implements it
|
||||
if (bindingDef.resize) {
|
||||
shinyBinding.resize = function(el, width, height) {
|
||||
// Shiny can call resize before initialize/renderValue have been
|
||||
// called, which doesn't make sense for widgets.
|
||||
if (elementData(el, "initialized")) {
|
||||
bindingDef.resize(el, width, height, elementData(el, "init_result"));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Shiny.outputBindings.register(shinyBinding, bindingDef.name);
|
||||
}
|
||||
};
|
||||
|
||||
var scheduleStaticRenderTimerId = null;
|
||||
function scheduleStaticRender() {
|
||||
if (!scheduleStaticRenderTimerId) {
|
||||
scheduleStaticRenderTimerId = setTimeout(function() {
|
||||
scheduleStaticRenderTimerId = null;
|
||||
window.HTMLWidgets.staticRender();
|
||||
}, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Render static widgets after the document finishes loading
|
||||
// Statically render all elements that are of this widget's class
|
||||
window.HTMLWidgets.staticRender = function() {
|
||||
var bindings = window.HTMLWidgets.widgets || [];
|
||||
forEach(bindings, function(binding) {
|
||||
var matches = binding.find(document.documentElement);
|
||||
forEach(matches, function(el) {
|
||||
var sizeObj = initSizing(el, binding);
|
||||
|
||||
var getSize = function(el) {
|
||||
if (sizeObj) {
|
||||
return {w: sizeObj.getWidth(), h: sizeObj.getHeight()}
|
||||
} else {
|
||||
var rect = el.getBoundingClientRect();
|
||||
return {w: rect.width, h: rect.height}
|
||||
}
|
||||
};
|
||||
|
||||
if (hasClass(el, "html-widget-static-bound"))
|
||||
return;
|
||||
el.className = el.className + " html-widget-static-bound";
|
||||
|
||||
var initResult;
|
||||
if (binding.initialize) {
|
||||
var size = getSize(el);
|
||||
initResult = binding.initialize(el, size.w, size.h);
|
||||
elementData(el, "init_result", initResult);
|
||||
}
|
||||
|
||||
if (binding.resize) {
|
||||
var lastSize = getSize(el);
|
||||
var resizeHandler = function(e) {
|
||||
var size = getSize(el);
|
||||
if (size.w === 0 && size.h === 0)
|
||||
return;
|
||||
if (size.w === lastSize.w && size.h === lastSize.h)
|
||||
return;
|
||||
lastSize = size;
|
||||
binding.resize(el, size.w, size.h, initResult);
|
||||
};
|
||||
|
||||
on(window, "resize", resizeHandler);
|
||||
|
||||
// This is needed for cases where we're running in a Shiny
|
||||
// app, but the widget itself is not a Shiny output, but
|
||||
// rather a simple static widget. One example of this is
|
||||
// an rmarkdown document that has runtime:shiny and widget
|
||||
// that isn't in a render function. Shiny only knows to
|
||||
// call resize handlers for Shiny outputs, not for static
|
||||
// widgets, so we do it ourselves.
|
||||
if (window.jQuery) {
|
||||
window.jQuery(document).on(
|
||||
"shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets",
|
||||
resizeHandler
|
||||
);
|
||||
window.jQuery(document).on(
|
||||
"hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets",
|
||||
resizeHandler
|
||||
);
|
||||
}
|
||||
|
||||
// This is needed for the specific case of ioslides, which
|
||||
// flips slides between display:none and display:block.
|
||||
// Ideally we would not have to have ioslide-specific code
|
||||
// here, but rather have ioslides raise a generic event,
|
||||
// but the rmarkdown package just went to CRAN so the
|
||||
// window to getting that fixed may be long.
|
||||
if (window.addEventListener) {
|
||||
// It's OK to limit this to window.addEventListener
|
||||
// browsers because ioslides itself only supports
|
||||
// such browsers.
|
||||
on(document, "slideenter", resizeHandler);
|
||||
on(document, "slideleave", resizeHandler);
|
||||
}
|
||||
}
|
||||
|
||||
var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']");
|
||||
if (scriptData) {
|
||||
var data = JSON.parse(scriptData.textContent || scriptData.text);
|
||||
// Resolve strings marked as javascript literals to objects
|
||||
if (!(data.evals instanceof Array)) data.evals = [data.evals];
|
||||
for (var k = 0; data.evals && k < data.evals.length; k++) {
|
||||
window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]);
|
||||
}
|
||||
binding.renderValue(el, data.x, initResult);
|
||||
evalAndRun(data.jsHooks.render, initResult, [el, data.x]);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
invokePostRenderHandlers();
|
||||
}
|
||||
|
||||
|
||||
function has_jQuery3() {
|
||||
if (!window.jQuery) {
|
||||
return false;
|
||||
}
|
||||
var $version = window.jQuery.fn.jquery;
|
||||
var $major_version = parseInt($version.split(".")[0]);
|
||||
return $major_version >= 3;
|
||||
}
|
||||
|
||||
/*
|
||||
/ Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's
|
||||
/ on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now
|
||||
/ really means $(setTimeout(fn)).
|
||||
/ https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous
|
||||
/
|
||||
/ Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny
|
||||
/ one tick later than it did before, which means staticRender() is
|
||||
/ called renderValue() earlier than (advanced) widget authors might be expecting.
|
||||
/ https://github.com/rstudio/shiny/issues/2630
|
||||
/
|
||||
/ For a concrete example, leaflet has some methods (e.g., updateBounds)
|
||||
/ which reference Shiny methods registered in initShiny (e.g., setInputValue).
|
||||
/ Since leaflet is privy to this life-cycle, it knows to use setTimeout() to
|
||||
/ delay execution of those methods (until Shiny methods are ready)
|
||||
/ https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268
|
||||
/
|
||||
/ Ideally widget authors wouldn't need to use this setTimeout() hack that
|
||||
/ leaflet uses to call Shiny methods on a staticRender(). In the long run,
|
||||
/ the logic initShiny should be broken up so that method registration happens
|
||||
/ right away, but binding happens later.
|
||||
*/
|
||||
function maybeStaticRenderLater() {
|
||||
if (shinyMode && has_jQuery3()) {
|
||||
window.jQuery(window.HTMLWidgets.staticRender);
|
||||
} else {
|
||||
window.HTMLWidgets.staticRender();
|
||||
}
|
||||
}
|
||||
|
||||
if (document.addEventListener) {
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
document.removeEventListener("DOMContentLoaded", arguments.callee, false);
|
||||
maybeStaticRenderLater();
|
||||
}, false);
|
||||
} else if (document.attachEvent) {
|
||||
document.attachEvent("onreadystatechange", function() {
|
||||
if (document.readyState === "complete") {
|
||||
document.detachEvent("onreadystatechange", arguments.callee);
|
||||
maybeStaticRenderLater();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
window.HTMLWidgets.getAttachmentUrl = function(depname, key) {
|
||||
// If no key, default to the first item
|
||||
if (typeof(key) === "undefined")
|
||||
key = 1;
|
||||
|
||||
var link = document.getElementById(depname + "-" + key + "-attachment");
|
||||
if (!link) {
|
||||
throw new Error("Attachment " + depname + "/" + key + " not found in document");
|
||||
}
|
||||
return link.getAttribute("href");
|
||||
};
|
||||
|
||||
window.HTMLWidgets.dataframeToD3 = function(df) {
|
||||
var names = [];
|
||||
var length;
|
||||
for (var name in df) {
|
||||
if (df.hasOwnProperty(name))
|
||||
names.push(name);
|
||||
if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") {
|
||||
throw new Error("All fields must be arrays");
|
||||
} else if (typeof(length) !== "undefined" && length !== df[name].length) {
|
||||
throw new Error("All fields must be arrays of the same length");
|
||||
}
|
||||
length = df[name].length;
|
||||
}
|
||||
var results = [];
|
||||
var item;
|
||||
for (var row = 0; row < length; row++) {
|
||||
item = {};
|
||||
for (var col = 0; col < names.length; col++) {
|
||||
item[names[col]] = df[names[col]][row];
|
||||
}
|
||||
results.push(item);
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
window.HTMLWidgets.transposeArray2D = function(array) {
|
||||
if (array.length === 0) return array;
|
||||
var newArray = array[0].map(function(col, i) {
|
||||
return array.map(function(row) {
|
||||
return row[i]
|
||||
})
|
||||
});
|
||||
return newArray;
|
||||
};
|
||||
// Split value at splitChar, but allow splitChar to be escaped
|
||||
// using escapeChar. Any other characters escaped by escapeChar
|
||||
// will be included as usual (including escapeChar itself).
|
||||
function splitWithEscape(value, splitChar, escapeChar) {
|
||||
var results = [];
|
||||
var escapeMode = false;
|
||||
var currentResult = "";
|
||||
for (var pos = 0; pos < value.length; pos++) {
|
||||
if (!escapeMode) {
|
||||
if (value[pos] === splitChar) {
|
||||
results.push(currentResult);
|
||||
currentResult = "";
|
||||
} else if (value[pos] === escapeChar) {
|
||||
escapeMode = true;
|
||||
} else {
|
||||
currentResult += value[pos];
|
||||
}
|
||||
} else {
|
||||
currentResult += value[pos];
|
||||
escapeMode = false;
|
||||
}
|
||||
}
|
||||
if (currentResult !== "") {
|
||||
results.push(currentResult);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
// Function authored by Yihui/JJ Allaire
|
||||
window.HTMLWidgets.evaluateStringMember = function(o, member) {
|
||||
var parts = splitWithEscape(member, '.', '\\');
|
||||
for (var i = 0, l = parts.length; i < l; i++) {
|
||||
var part = parts[i];
|
||||
// part may be a character or 'numeric' member name
|
||||
if (o !== null && typeof o === "object" && part in o) {
|
||||
if (i == (l - 1)) { // if we are at the end of the line then evalulate
|
||||
if (typeof o[part] === "string")
|
||||
o[part] = tryEval(o[part]);
|
||||
} else { // otherwise continue to next embedded object
|
||||
o = o[part];
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Retrieve the HTMLWidget instance (i.e. the return value of an
|
||||
// HTMLWidget binding's initialize() or factory() function)
|
||||
// associated with an element, or null if none.
|
||||
window.HTMLWidgets.getInstance = function(el) {
|
||||
return elementData(el, "init_result");
|
||||
};
|
||||
|
||||
// Finds the first element in the scope that matches the selector,
|
||||
// and returns the HTMLWidget instance (i.e. the return value of
|
||||
// an HTMLWidget binding's initialize() or factory() function)
|
||||
// associated with that element, if any. If no element matches the
|
||||
// selector, or the first matching element has no HTMLWidget
|
||||
// instance associated with it, then null is returned.
|
||||
//
|
||||
// The scope argument is optional, and defaults to window.document.
|
||||
window.HTMLWidgets.find = function(scope, selector) {
|
||||
if (arguments.length == 1) {
|
||||
selector = scope;
|
||||
scope = document;
|
||||
}
|
||||
|
||||
var el = scope.querySelector(selector);
|
||||
if (el === null) {
|
||||
return null;
|
||||
} else {
|
||||
return window.HTMLWidgets.getInstance(el);
|
||||
}
|
||||
};
|
||||
|
||||
// Finds all elements in the scope that match the selector, and
|
||||
// returns the HTMLWidget instances (i.e. the return values of
|
||||
// an HTMLWidget binding's initialize() or factory() function)
|
||||
// associated with the elements, in an array. If elements that
|
||||
// match the selector don't have an associated HTMLWidget
|
||||
// instance, the returned array will contain nulls.
|
||||
//
|
||||
// The scope argument is optional, and defaults to window.document.
|
||||
window.HTMLWidgets.findAll = function(scope, selector) {
|
||||
if (arguments.length == 1) {
|
||||
selector = scope;
|
||||
scope = document;
|
||||
}
|
||||
|
||||
var nodes = scope.querySelectorAll(selector);
|
||||
var results = [];
|
||||
for (var i = 0; i < nodes.length; i++) {
|
||||
results.push(window.HTMLWidgets.getInstance(nodes[i]));
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
var postRenderHandlers = [];
|
||||
function invokePostRenderHandlers() {
|
||||
while (postRenderHandlers.length) {
|
||||
var handler = postRenderHandlers.shift();
|
||||
if (handler) {
|
||||
handler();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Register the given callback function to be invoked after the
|
||||
// next time static widgets are rendered.
|
||||
window.HTMLWidgets.addPostRenderHandler = function(callback) {
|
||||
postRenderHandlers.push(callback);
|
||||
};
|
||||
|
||||
// Takes a new-style instance-bound definition, and returns an
|
||||
// old-style class-bound definition. This saves us from having
|
||||
// to rewrite all the logic in this file to accomodate both
|
||||
// types of definitions.
|
||||
function createLegacyDefinitionAdapter(defn) {
|
||||
var result = {
|
||||
name: defn.name,
|
||||
type: defn.type,
|
||||
initialize: function(el, width, height) {
|
||||
return defn.factory(el, width, height);
|
||||
},
|
||||
renderValue: function(el, x, instance) {
|
||||
return instance.renderValue(x);
|
||||
},
|
||||
resize: function(el, width, height, instance) {
|
||||
return instance.resize(width, height);
|
||||
}
|
||||
};
|
||||
|
||||
if (defn.find)
|
||||
result.find = defn.find;
|
||||
if (defn.renderError)
|
||||
result.renderError = defn.renderError;
|
||||
if (defn.clearError)
|
||||
result.clearError = defn.clearError;
|
||||
|
||||
return result;
|
||||
}
|
||||
})();
|
||||
+10881
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,203 @@
|
||||
/* quarto syntax highlight colors */
|
||||
:root {
|
||||
--quarto-hl-ot-color: #003B4F;
|
||||
--quarto-hl-at-color: #657422;
|
||||
--quarto-hl-ss-color: #20794D;
|
||||
--quarto-hl-an-color: #5E5E5E;
|
||||
--quarto-hl-fu-color: #4758AB;
|
||||
--quarto-hl-st-color: #20794D;
|
||||
--quarto-hl-cf-color: #003B4F;
|
||||
--quarto-hl-op-color: #5E5E5E;
|
||||
--quarto-hl-er-color: #AD0000;
|
||||
--quarto-hl-bn-color: #AD0000;
|
||||
--quarto-hl-al-color: #AD0000;
|
||||
--quarto-hl-va-color: #111111;
|
||||
--quarto-hl-bu-color: inherit;
|
||||
--quarto-hl-ex-color: inherit;
|
||||
--quarto-hl-pp-color: #AD0000;
|
||||
--quarto-hl-in-color: #5E5E5E;
|
||||
--quarto-hl-vs-color: #20794D;
|
||||
--quarto-hl-wa-color: #5E5E5E;
|
||||
--quarto-hl-do-color: #5E5E5E;
|
||||
--quarto-hl-im-color: #00769E;
|
||||
--quarto-hl-ch-color: #20794D;
|
||||
--quarto-hl-dt-color: #AD0000;
|
||||
--quarto-hl-fl-color: #AD0000;
|
||||
--quarto-hl-co-color: #5E5E5E;
|
||||
--quarto-hl-cv-color: #5E5E5E;
|
||||
--quarto-hl-cn-color: #8f5902;
|
||||
--quarto-hl-sc-color: #5E5E5E;
|
||||
--quarto-hl-dv-color: #AD0000;
|
||||
--quarto-hl-kw-color: #003B4F;
|
||||
}
|
||||
|
||||
/* other quarto variables */
|
||||
:root {
|
||||
--quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
}
|
||||
|
||||
pre > code.sourceCode > span {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
code span {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
code.sourceCode > span {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
div.sourceCode,
|
||||
div.sourceCode pre.sourceCode {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
code span.ot {
|
||||
color: #003B4F;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.at {
|
||||
color: #657422;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.ss {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.an {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.fu {
|
||||
color: #4758AB;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.st {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.cf {
|
||||
color: #003B4F;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.op {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.er {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.bn {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.al {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.va {
|
||||
color: #111111;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.bu {
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.ex {
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.pp {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.in {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.vs {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.wa {
|
||||
color: #5E5E5E;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
code span.do {
|
||||
color: #5E5E5E;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
code span.im {
|
||||
color: #00769E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.ch {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.dt {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.fl {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.co {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.cv {
|
||||
color: #5E5E5E;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
code span.cn {
|
||||
color: #8f5902;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.sc {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.dv {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.kw {
|
||||
color: #003B4F;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
.prevent-inlining {
|
||||
content: "</";
|
||||
}
|
||||
|
||||
/*# sourceMappingURL=debc5d5d77c3f9108843748ff7464032.css.map */
|
||||
@@ -0,0 +1,899 @@
|
||||
const sectionChanged = new CustomEvent("quarto-sectionChanged", {
|
||||
detail: {},
|
||||
bubbles: true,
|
||||
cancelable: false,
|
||||
composed: false,
|
||||
});
|
||||
|
||||
const layoutMarginEls = () => {
|
||||
// Find any conflicting margin elements and add margins to the
|
||||
// top to prevent overlap
|
||||
const marginChildren = window.document.querySelectorAll(
|
||||
".column-margin.column-container > *, .margin-caption, .aside"
|
||||
);
|
||||
|
||||
let lastBottom = 0;
|
||||
for (const marginChild of marginChildren) {
|
||||
if (marginChild.offsetParent !== null) {
|
||||
// clear the top margin so we recompute it
|
||||
marginChild.style.marginTop = null;
|
||||
const top = marginChild.getBoundingClientRect().top + window.scrollY;
|
||||
if (top < lastBottom) {
|
||||
const marginChildStyle = window.getComputedStyle(marginChild);
|
||||
const marginBottom = parseFloat(marginChildStyle["marginBottom"]);
|
||||
const margin = lastBottom - top + marginBottom;
|
||||
marginChild.style.marginTop = `${margin}px`;
|
||||
}
|
||||
const styles = window.getComputedStyle(marginChild);
|
||||
const marginTop = parseFloat(styles["marginTop"]);
|
||||
lastBottom = top + marginChild.getBoundingClientRect().height + marginTop;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||
// Recompute the position of margin elements anytime the body size changes
|
||||
if (window.ResizeObserver) {
|
||||
const resizeObserver = new window.ResizeObserver(
|
||||
throttle(() => {
|
||||
layoutMarginEls();
|
||||
if (
|
||||
window.document.body.getBoundingClientRect().width < 990 &&
|
||||
isReaderMode()
|
||||
) {
|
||||
quartoToggleReader();
|
||||
}
|
||||
}, 50)
|
||||
);
|
||||
resizeObserver.observe(window.document.body);
|
||||
}
|
||||
|
||||
const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]');
|
||||
const sidebarEl = window.document.getElementById("quarto-sidebar");
|
||||
const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left");
|
||||
const marginSidebarEl = window.document.getElementById(
|
||||
"quarto-margin-sidebar"
|
||||
);
|
||||
// function to determine whether the element has a previous sibling that is active
|
||||
const prevSiblingIsActiveLink = (el) => {
|
||||
const sibling = el.previousElementSibling;
|
||||
if (sibling && sibling.tagName === "A") {
|
||||
return sibling.classList.contains("active");
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// fire slideEnter for bootstrap tab activations (for htmlwidget resize behavior)
|
||||
function fireSlideEnter(e) {
|
||||
const event = window.document.createEvent("Event");
|
||||
event.initEvent("slideenter", true, true);
|
||||
window.document.dispatchEvent(event);
|
||||
}
|
||||
const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]');
|
||||
tabs.forEach((tab) => {
|
||||
tab.addEventListener("shown.bs.tab", fireSlideEnter);
|
||||
});
|
||||
|
||||
// fire slideEnter for tabby tab activations (for htmlwidget resize behavior)
|
||||
document.addEventListener("tabby", fireSlideEnter, false);
|
||||
|
||||
// Track scrolling and mark TOC links as active
|
||||
// get table of contents and sidebar (bail if we don't have at least one)
|
||||
const tocLinks = tocEl
|
||||
? [...tocEl.querySelectorAll("a[data-scroll-target]")]
|
||||
: [];
|
||||
const makeActive = (link) => tocLinks[link].classList.add("active");
|
||||
const removeActive = (link) => tocLinks[link].classList.remove("active");
|
||||
const removeAllActive = () =>
|
||||
[...Array(tocLinks.length).keys()].forEach((link) => removeActive(link));
|
||||
|
||||
// activate the anchor for a section associated with this TOC entry
|
||||
tocLinks.forEach((link) => {
|
||||
link.addEventListener("click", () => {
|
||||
if (link.href.indexOf("#") !== -1) {
|
||||
const anchor = link.href.split("#")[1];
|
||||
const heading = window.document.querySelector(
|
||||
`[data-anchor-id=${anchor}]`
|
||||
);
|
||||
if (heading) {
|
||||
// Add the class
|
||||
heading.classList.add("reveal-anchorjs-link");
|
||||
|
||||
// function to show the anchor
|
||||
const handleMouseout = () => {
|
||||
heading.classList.remove("reveal-anchorjs-link");
|
||||
heading.removeEventListener("mouseout", handleMouseout);
|
||||
};
|
||||
|
||||
// add a function to clear the anchor when the user mouses out of it
|
||||
heading.addEventListener("mouseout", handleMouseout);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
const sections = tocLinks.map((link) => {
|
||||
const target = link.getAttribute("data-scroll-target");
|
||||
if (target.startsWith("#")) {
|
||||
return window.document.getElementById(decodeURI(`${target.slice(1)}`));
|
||||
} else {
|
||||
return window.document.querySelector(decodeURI(`${target}`));
|
||||
}
|
||||
});
|
||||
|
||||
const sectionMargin = 200;
|
||||
let currentActive = 0;
|
||||
// track whether we've initialized state the first time
|
||||
let init = false;
|
||||
|
||||
const updateActiveLink = () => {
|
||||
// The index from bottom to top (e.g. reversed list)
|
||||
let sectionIndex = -1;
|
||||
if (
|
||||
window.innerHeight + window.pageYOffset >=
|
||||
window.document.body.offsetHeight
|
||||
) {
|
||||
sectionIndex = 0;
|
||||
} else {
|
||||
sectionIndex = [...sections].reverse().findIndex((section) => {
|
||||
if (section) {
|
||||
return window.pageYOffset >= section.offsetTop - sectionMargin;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
if (sectionIndex > -1) {
|
||||
const current = sections.length - sectionIndex - 1;
|
||||
if (current !== currentActive) {
|
||||
removeAllActive();
|
||||
currentActive = current;
|
||||
makeActive(current);
|
||||
if (init) {
|
||||
window.dispatchEvent(sectionChanged);
|
||||
}
|
||||
init = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const inHiddenRegion = (top, bottom, hiddenRegions) => {
|
||||
for (const region of hiddenRegions) {
|
||||
if (top <= region.bottom && bottom >= region.top) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
const categorySelector = "header.quarto-title-block .quarto-category";
|
||||
const activateCategories = (href) => {
|
||||
// Find any categories
|
||||
// Surround them with a link pointing back to:
|
||||
// #category=Authoring
|
||||
try {
|
||||
const categoryEls = window.document.querySelectorAll(categorySelector);
|
||||
for (const categoryEl of categoryEls) {
|
||||
const categoryText = categoryEl.textContent;
|
||||
if (categoryText) {
|
||||
const link = `${href}#category=${encodeURIComponent(categoryText)}`;
|
||||
const linkEl = window.document.createElement("a");
|
||||
linkEl.setAttribute("href", link);
|
||||
for (const child of categoryEl.childNodes) {
|
||||
linkEl.append(child);
|
||||
}
|
||||
categoryEl.appendChild(linkEl);
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
// Ignore errors
|
||||
}
|
||||
};
|
||||
function hasTitleCategories() {
|
||||
return window.document.querySelector(categorySelector) !== null;
|
||||
}
|
||||
|
||||
function offsetRelativeUrl(url) {
|
||||
const offset = getMeta("quarto:offset");
|
||||
return offset ? offset + url : url;
|
||||
}
|
||||
|
||||
function offsetAbsoluteUrl(url) {
|
||||
const offset = getMeta("quarto:offset");
|
||||
const baseUrl = new URL(offset, window.location);
|
||||
|
||||
const projRelativeUrl = url.replace(baseUrl, "");
|
||||
if (projRelativeUrl.startsWith("/")) {
|
||||
return projRelativeUrl;
|
||||
} else {
|
||||
return "/" + projRelativeUrl;
|
||||
}
|
||||
}
|
||||
|
||||
// read a meta tag value
|
||||
function getMeta(metaName) {
|
||||
const metas = window.document.getElementsByTagName("meta");
|
||||
for (let i = 0; i < metas.length; i++) {
|
||||
if (metas[i].getAttribute("name") === metaName) {
|
||||
return metas[i].getAttribute("content");
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
async function findAndActivateCategories() {
|
||||
const currentPagePath = offsetAbsoluteUrl(window.location.href);
|
||||
const response = await fetch(offsetRelativeUrl("listings.json"));
|
||||
if (response.status == 200) {
|
||||
return response.json().then(function (listingPaths) {
|
||||
const listingHrefs = [];
|
||||
for (const listingPath of listingPaths) {
|
||||
const pathWithoutLeadingSlash = listingPath.listing.substring(1);
|
||||
for (const item of listingPath.items) {
|
||||
if (
|
||||
item === currentPagePath ||
|
||||
item === currentPagePath + "index.html"
|
||||
) {
|
||||
// Resolve this path against the offset to be sure
|
||||
// we already are using the correct path to the listing
|
||||
// (this adjusts the listing urls to be rooted against
|
||||
// whatever root the page is actually running against)
|
||||
const relative = offsetRelativeUrl(pathWithoutLeadingSlash);
|
||||
const baseUrl = window.location;
|
||||
const resolvedPath = new URL(relative, baseUrl);
|
||||
listingHrefs.push(resolvedPath.pathname);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Look up the tree for a nearby linting and use that if we find one
|
||||
const nearestListing = findNearestParentListing(
|
||||
offsetAbsoluteUrl(window.location.pathname),
|
||||
listingHrefs
|
||||
);
|
||||
if (nearestListing) {
|
||||
activateCategories(nearestListing);
|
||||
} else {
|
||||
// See if the referrer is a listing page for this item
|
||||
const referredRelativePath = offsetAbsoluteUrl(document.referrer);
|
||||
const referrerListing = listingHrefs.find((listingHref) => {
|
||||
const isListingReferrer =
|
||||
listingHref === referredRelativePath ||
|
||||
listingHref === referredRelativePath + "index.html";
|
||||
return isListingReferrer;
|
||||
});
|
||||
|
||||
if (referrerListing) {
|
||||
// Try to use the referrer if possible
|
||||
activateCategories(referrerListing);
|
||||
} else if (listingHrefs.length > 0) {
|
||||
// Otherwise, just fall back to the first listing
|
||||
activateCategories(listingHrefs[0]);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
if (hasTitleCategories()) {
|
||||
findAndActivateCategories();
|
||||
}
|
||||
|
||||
const findNearestParentListing = (href, listingHrefs) => {
|
||||
if (!href || !listingHrefs) {
|
||||
return undefined;
|
||||
}
|
||||
// Look up the tree for a nearby linting and use that if we find one
|
||||
const relativeParts = href.substring(1).split("/");
|
||||
while (relativeParts.length > 0) {
|
||||
const path = relativeParts.join("/");
|
||||
for (const listingHref of listingHrefs) {
|
||||
if (listingHref.startsWith(path)) {
|
||||
return listingHref;
|
||||
}
|
||||
}
|
||||
relativeParts.pop();
|
||||
}
|
||||
|
||||
return undefined;
|
||||
};
|
||||
|
||||
const manageSidebarVisiblity = (el, placeholderDescriptor) => {
|
||||
let isVisible = true;
|
||||
let elRect;
|
||||
|
||||
return (hiddenRegions) => {
|
||||
if (el === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Find the last element of the TOC
|
||||
const lastChildEl = el.lastElementChild;
|
||||
|
||||
if (lastChildEl) {
|
||||
// Converts the sidebar to a menu
|
||||
const convertToMenu = () => {
|
||||
for (const child of el.children) {
|
||||
child.style.opacity = 0;
|
||||
child.style.overflow = "hidden";
|
||||
}
|
||||
|
||||
nexttick(() => {
|
||||
const toggleContainer = window.document.createElement("div");
|
||||
toggleContainer.style.width = "100%";
|
||||
toggleContainer.classList.add("zindex-over-content");
|
||||
toggleContainer.classList.add("quarto-sidebar-toggle");
|
||||
toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom
|
||||
toggleContainer.id = placeholderDescriptor.id;
|
||||
toggleContainer.style.position = "fixed";
|
||||
|
||||
const toggleIcon = window.document.createElement("i");
|
||||
toggleIcon.classList.add("quarto-sidebar-toggle-icon");
|
||||
toggleIcon.classList.add("bi");
|
||||
toggleIcon.classList.add("bi-caret-down-fill");
|
||||
|
||||
const toggleTitle = window.document.createElement("div");
|
||||
const titleEl = window.document.body.querySelector(
|
||||
placeholderDescriptor.titleSelector
|
||||
);
|
||||
if (titleEl) {
|
||||
toggleTitle.append(
|
||||
titleEl.textContent || titleEl.innerText,
|
||||
toggleIcon
|
||||
);
|
||||
}
|
||||
toggleTitle.classList.add("zindex-over-content");
|
||||
toggleTitle.classList.add("quarto-sidebar-toggle-title");
|
||||
toggleContainer.append(toggleTitle);
|
||||
|
||||
const toggleContents = window.document.createElement("div");
|
||||
toggleContents.classList = el.classList;
|
||||
toggleContents.classList.add("zindex-over-content");
|
||||
toggleContents.classList.add("quarto-sidebar-toggle-contents");
|
||||
for (const child of el.children) {
|
||||
if (child.id === "toc-title") {
|
||||
continue;
|
||||
}
|
||||
|
||||
const clone = child.cloneNode(true);
|
||||
clone.style.opacity = 1;
|
||||
clone.style.display = null;
|
||||
toggleContents.append(clone);
|
||||
}
|
||||
toggleContents.style.height = "0px";
|
||||
const positionToggle = () => {
|
||||
// position the element (top left of parent, same width as parent)
|
||||
if (!elRect) {
|
||||
elRect = el.getBoundingClientRect();
|
||||
}
|
||||
toggleContainer.style.left = `${elRect.left}px`;
|
||||
toggleContainer.style.top = `${elRect.top}px`;
|
||||
toggleContainer.style.width = `${elRect.width}px`;
|
||||
};
|
||||
positionToggle();
|
||||
|
||||
toggleContainer.append(toggleContents);
|
||||
el.parentElement.prepend(toggleContainer);
|
||||
|
||||
// Process clicks
|
||||
let tocShowing = false;
|
||||
// Allow the caller to control whether this is dismissed
|
||||
// when it is clicked (e.g. sidebar navigation supports
|
||||
// opening and closing the nav tree, so don't dismiss on click)
|
||||
const clickEl = placeholderDescriptor.dismissOnClick
|
||||
? toggleContainer
|
||||
: toggleTitle;
|
||||
|
||||
const closeToggle = () => {
|
||||
if (tocShowing) {
|
||||
toggleContainer.classList.remove("expanded");
|
||||
toggleContents.style.height = "0px";
|
||||
tocShowing = false;
|
||||
}
|
||||
};
|
||||
|
||||
// Get rid of any expanded toggle if the user scrolls
|
||||
window.document.addEventListener(
|
||||
"scroll",
|
||||
throttle(() => {
|
||||
closeToggle();
|
||||
}, 50)
|
||||
);
|
||||
|
||||
// Handle positioning of the toggle
|
||||
window.addEventListener(
|
||||
"resize",
|
||||
throttle(() => {
|
||||
elRect = undefined;
|
||||
positionToggle();
|
||||
}, 50)
|
||||
);
|
||||
|
||||
window.addEventListener("quarto-hrChanged", () => {
|
||||
elRect = undefined;
|
||||
});
|
||||
|
||||
// Process the click
|
||||
clickEl.onclick = () => {
|
||||
if (!tocShowing) {
|
||||
toggleContainer.classList.add("expanded");
|
||||
toggleContents.style.height = null;
|
||||
tocShowing = true;
|
||||
} else {
|
||||
closeToggle();
|
||||
}
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
// Converts a sidebar from a menu back to a sidebar
|
||||
const convertToSidebar = () => {
|
||||
for (const child of el.children) {
|
||||
child.style.opacity = 1;
|
||||
child.style.overflow = null;
|
||||
}
|
||||
|
||||
const placeholderEl = window.document.getElementById(
|
||||
placeholderDescriptor.id
|
||||
);
|
||||
if (placeholderEl) {
|
||||
placeholderEl.remove();
|
||||
}
|
||||
|
||||
el.classList.remove("rollup");
|
||||
};
|
||||
|
||||
if (isReaderMode()) {
|
||||
convertToMenu();
|
||||
isVisible = false;
|
||||
} else {
|
||||
// Find the top and bottom o the element that is being managed
|
||||
const elTop = el.offsetTop;
|
||||
const elBottom =
|
||||
elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight;
|
||||
|
||||
if (!isVisible) {
|
||||
// If the element is current not visible reveal if there are
|
||||
// no conflicts with overlay regions
|
||||
if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) {
|
||||
convertToSidebar();
|
||||
isVisible = true;
|
||||
}
|
||||
} else {
|
||||
// If the element is visible, hide it if it conflicts with overlay regions
|
||||
// and insert a placeholder toggle (or if we're in reader mode)
|
||||
if (inHiddenRegion(elTop, elBottom, hiddenRegions)) {
|
||||
convertToMenu();
|
||||
isVisible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]');
|
||||
for (const tabEl of tabEls) {
|
||||
const id = tabEl.getAttribute("data-bs-target");
|
||||
if (id) {
|
||||
const columnEl = document.querySelector(
|
||||
`${id} .column-margin, .tabset-margin-content`
|
||||
);
|
||||
if (columnEl)
|
||||
tabEl.addEventListener("shown.bs.tab", function (event) {
|
||||
const el = event.srcElement;
|
||||
if (el) {
|
||||
const visibleCls = `${el.id}-margin-content`;
|
||||
// walk up until we find a parent tabset
|
||||
let panelTabsetEl = el.parentElement;
|
||||
while (panelTabsetEl) {
|
||||
if (panelTabsetEl.classList.contains("panel-tabset")) {
|
||||
break;
|
||||
}
|
||||
panelTabsetEl = panelTabsetEl.parentElement;
|
||||
}
|
||||
|
||||
if (panelTabsetEl) {
|
||||
const prevSib = panelTabsetEl.previousElementSibling;
|
||||
if (
|
||||
prevSib &&
|
||||
prevSib.classList.contains("tabset-margin-container")
|
||||
) {
|
||||
const childNodes = prevSib.querySelectorAll(
|
||||
".tabset-margin-content"
|
||||
);
|
||||
for (const childEl of childNodes) {
|
||||
if (childEl.classList.contains(visibleCls)) {
|
||||
childEl.classList.remove("collapse");
|
||||
} else {
|
||||
childEl.classList.add("collapse");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
layoutMarginEls();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Manage the visibility of the toc and the sidebar
|
||||
const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, {
|
||||
id: "quarto-toc-toggle",
|
||||
titleSelector: "#toc-title",
|
||||
dismissOnClick: true,
|
||||
});
|
||||
const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, {
|
||||
id: "quarto-sidebarnav-toggle",
|
||||
titleSelector: ".title",
|
||||
dismissOnClick: false,
|
||||
});
|
||||
let tocLeftScrollVisibility;
|
||||
if (leftTocEl) {
|
||||
tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, {
|
||||
id: "quarto-lefttoc-toggle",
|
||||
titleSelector: "#toc-title",
|
||||
dismissOnClick: true,
|
||||
});
|
||||
}
|
||||
|
||||
// Find the first element that uses formatting in special columns
|
||||
const conflictingEls = window.document.body.querySelectorAll(
|
||||
'[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]'
|
||||
);
|
||||
|
||||
// Filter all the possibly conflicting elements into ones
|
||||
// the do conflict on the left or ride side
|
||||
const arrConflictingEls = Array.from(conflictingEls);
|
||||
const leftSideConflictEls = arrConflictingEls.filter((el) => {
|
||||
if (el.tagName === "ASIDE") {
|
||||
return false;
|
||||
}
|
||||
return Array.from(el.classList).find((className) => {
|
||||
return (
|
||||
className !== "column-body" &&
|
||||
className.startsWith("column-") &&
|
||||
!className.endsWith("right") &&
|
||||
!className.endsWith("container") &&
|
||||
className !== "column-margin"
|
||||
);
|
||||
});
|
||||
});
|
||||
const rightSideConflictEls = arrConflictingEls.filter((el) => {
|
||||
if (el.tagName === "ASIDE") {
|
||||
return true;
|
||||
}
|
||||
|
||||
const hasMarginCaption = Array.from(el.classList).find((className) => {
|
||||
return className == "margin-caption";
|
||||
});
|
||||
if (hasMarginCaption) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return Array.from(el.classList).find((className) => {
|
||||
return (
|
||||
className !== "column-body" &&
|
||||
!className.endsWith("container") &&
|
||||
className.startsWith("column-") &&
|
||||
!className.endsWith("left")
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
const kOverlapPaddingSize = 10;
|
||||
function toRegions(els) {
|
||||
return els.map((el) => {
|
||||
const boundRect = el.getBoundingClientRect();
|
||||
const top =
|
||||
boundRect.top +
|
||||
document.documentElement.scrollTop -
|
||||
kOverlapPaddingSize;
|
||||
return {
|
||||
top,
|
||||
bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
let hasObserved = false;
|
||||
const visibleItemObserver = (els) => {
|
||||
let visibleElements = [...els];
|
||||
const intersectionObserver = new IntersectionObserver(
|
||||
(entries, _observer) => {
|
||||
entries.forEach((entry) => {
|
||||
if (entry.isIntersecting) {
|
||||
if (visibleElements.indexOf(entry.target) === -1) {
|
||||
visibleElements.push(entry.target);
|
||||
}
|
||||
} else {
|
||||
visibleElements = visibleElements.filter((visibleEntry) => {
|
||||
return visibleEntry !== entry;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if (!hasObserved) {
|
||||
hideOverlappedSidebars();
|
||||
}
|
||||
hasObserved = true;
|
||||
},
|
||||
{}
|
||||
);
|
||||
els.forEach((el) => {
|
||||
intersectionObserver.observe(el);
|
||||
});
|
||||
|
||||
return {
|
||||
getVisibleEntries: () => {
|
||||
return visibleElements;
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
const rightElementObserver = visibleItemObserver(rightSideConflictEls);
|
||||
const leftElementObserver = visibleItemObserver(leftSideConflictEls);
|
||||
|
||||
const hideOverlappedSidebars = () => {
|
||||
marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries()));
|
||||
sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries()));
|
||||
if (tocLeftScrollVisibility) {
|
||||
tocLeftScrollVisibility(
|
||||
toRegions(leftElementObserver.getVisibleEntries())
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
window.quartoToggleReader = () => {
|
||||
// Applies a slow class (or removes it)
|
||||
// to update the transition speed
|
||||
const slowTransition = (slow) => {
|
||||
const manageTransition = (id, slow) => {
|
||||
const el = document.getElementById(id);
|
||||
if (el) {
|
||||
if (slow) {
|
||||
el.classList.add("slow");
|
||||
} else {
|
||||
el.classList.remove("slow");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
manageTransition("TOC", slow);
|
||||
manageTransition("quarto-sidebar", slow);
|
||||
};
|
||||
const readerMode = !isReaderMode();
|
||||
setReaderModeValue(readerMode);
|
||||
|
||||
// If we're entering reader mode, slow the transition
|
||||
if (readerMode) {
|
||||
slowTransition(readerMode);
|
||||
}
|
||||
highlightReaderToggle(readerMode);
|
||||
hideOverlappedSidebars();
|
||||
|
||||
// If we're exiting reader mode, restore the non-slow transition
|
||||
if (!readerMode) {
|
||||
slowTransition(!readerMode);
|
||||
}
|
||||
};
|
||||
|
||||
const highlightReaderToggle = (readerMode) => {
|
||||
const els = document.querySelectorAll(".quarto-reader-toggle");
|
||||
if (els) {
|
||||
els.forEach((el) => {
|
||||
if (readerMode) {
|
||||
el.classList.add("reader");
|
||||
} else {
|
||||
el.classList.remove("reader");
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const setReaderModeValue = (val) => {
|
||||
if (window.location.protocol !== "file:") {
|
||||
window.localStorage.setItem("quarto-reader-mode", val);
|
||||
} else {
|
||||
localReaderMode = val;
|
||||
}
|
||||
};
|
||||
|
||||
const isReaderMode = () => {
|
||||
if (window.location.protocol !== "file:") {
|
||||
return window.localStorage.getItem("quarto-reader-mode") === "true";
|
||||
} else {
|
||||
return localReaderMode;
|
||||
}
|
||||
};
|
||||
let localReaderMode = null;
|
||||
|
||||
const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded");
|
||||
const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1;
|
||||
|
||||
// Walk the TOC and collapse/expand nodes
|
||||
// Nodes are expanded if:
|
||||
// - they are top level
|
||||
// - they have children that are 'active' links
|
||||
// - they are directly below an link that is 'active'
|
||||
const walk = (el, depth) => {
|
||||
// Tick depth when we enter a UL
|
||||
if (el.tagName === "UL") {
|
||||
depth = depth + 1;
|
||||
}
|
||||
|
||||
// It this is active link
|
||||
let isActiveNode = false;
|
||||
if (el.tagName === "A" && el.classList.contains("active")) {
|
||||
isActiveNode = true;
|
||||
}
|
||||
|
||||
// See if there is an active child to this element
|
||||
let hasActiveChild = false;
|
||||
for (child of el.children) {
|
||||
hasActiveChild = walk(child, depth) || hasActiveChild;
|
||||
}
|
||||
|
||||
// Process the collapse state if this is an UL
|
||||
if (el.tagName === "UL") {
|
||||
if (tocOpenDepth === -1 && depth > 1) {
|
||||
el.classList.add("collapse");
|
||||
} else if (
|
||||
depth <= tocOpenDepth ||
|
||||
hasActiveChild ||
|
||||
prevSiblingIsActiveLink(el)
|
||||
) {
|
||||
el.classList.remove("collapse");
|
||||
} else {
|
||||
el.classList.add("collapse");
|
||||
}
|
||||
|
||||
// untick depth when we leave a UL
|
||||
depth = depth - 1;
|
||||
}
|
||||
return hasActiveChild || isActiveNode;
|
||||
};
|
||||
|
||||
// walk the TOC and expand / collapse any items that should be shown
|
||||
|
||||
if (tocEl) {
|
||||
walk(tocEl, 0);
|
||||
updateActiveLink();
|
||||
}
|
||||
|
||||
// Throttle the scroll event and walk peridiocally
|
||||
window.document.addEventListener(
|
||||
"scroll",
|
||||
throttle(() => {
|
||||
if (tocEl) {
|
||||
updateActiveLink();
|
||||
walk(tocEl, 0);
|
||||
}
|
||||
if (!isReaderMode()) {
|
||||
hideOverlappedSidebars();
|
||||
}
|
||||
}, 5)
|
||||
);
|
||||
window.addEventListener(
|
||||
"resize",
|
||||
throttle(() => {
|
||||
if (!isReaderMode()) {
|
||||
hideOverlappedSidebars();
|
||||
}
|
||||
}, 10)
|
||||
);
|
||||
hideOverlappedSidebars();
|
||||
highlightReaderToggle(isReaderMode());
|
||||
});
|
||||
|
||||
// grouped tabsets
|
||||
window.addEventListener("pageshow", (_event) => {
|
||||
function getTabSettings() {
|
||||
const data = localStorage.getItem("quarto-persistent-tabsets-data");
|
||||
if (!data) {
|
||||
localStorage.setItem("quarto-persistent-tabsets-data", "{}");
|
||||
return {};
|
||||
}
|
||||
if (data) {
|
||||
return JSON.parse(data);
|
||||
}
|
||||
}
|
||||
|
||||
function setTabSettings(data) {
|
||||
localStorage.setItem(
|
||||
"quarto-persistent-tabsets-data",
|
||||
JSON.stringify(data)
|
||||
);
|
||||
}
|
||||
|
||||
function setTabState(groupName, groupValue) {
|
||||
const data = getTabSettings();
|
||||
data[groupName] = groupValue;
|
||||
setTabSettings(data);
|
||||
}
|
||||
|
||||
function toggleTab(tab, active) {
|
||||
const tabPanelId = tab.getAttribute("aria-controls");
|
||||
const tabPanel = document.getElementById(tabPanelId);
|
||||
if (active) {
|
||||
tab.classList.add("active");
|
||||
tabPanel.classList.add("active");
|
||||
} else {
|
||||
tab.classList.remove("active");
|
||||
tabPanel.classList.remove("active");
|
||||
}
|
||||
}
|
||||
|
||||
function toggleAll(selectedGroup, selectorsToSync) {
|
||||
for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) {
|
||||
const active = selectedGroup === thisGroup;
|
||||
for (const tab of tabs) {
|
||||
toggleTab(tab, active);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function findSelectorsToSyncByLanguage() {
|
||||
const result = {};
|
||||
const tabs = Array.from(
|
||||
document.querySelectorAll(`div[data-group] a[id^='tabset-']`)
|
||||
);
|
||||
for (const item of tabs) {
|
||||
const div = item.parentElement.parentElement.parentElement;
|
||||
const group = div.getAttribute("data-group");
|
||||
if (!result[group]) {
|
||||
result[group] = {};
|
||||
}
|
||||
const selectorsToSync = result[group];
|
||||
const value = item.innerHTML;
|
||||
if (!selectorsToSync[value]) {
|
||||
selectorsToSync[value] = [];
|
||||
}
|
||||
selectorsToSync[value].push(item);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function setupSelectorSync() {
|
||||
const selectorsToSync = findSelectorsToSyncByLanguage();
|
||||
Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => {
|
||||
Object.entries(tabSetsByValue).forEach(([value, items]) => {
|
||||
items.forEach((item) => {
|
||||
item.addEventListener("click", (_event) => {
|
||||
setTabState(group, value);
|
||||
toggleAll(value, selectorsToSync[group]);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
return selectorsToSync;
|
||||
}
|
||||
|
||||
const selectorsToSync = setupSelectorSync();
|
||||
for (const [group, selectedName] of Object.entries(getTabSettings())) {
|
||||
const selectors = selectorsToSync[group];
|
||||
// it's possible that stale state gives us empty selections, so we explicitly check here.
|
||||
if (selectors) {
|
||||
toggleAll(selectedName, selectors);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function throttle(func, wait) {
|
||||
let waiting = false;
|
||||
return function () {
|
||||
if (!waiting) {
|
||||
func.apply(this, arguments);
|
||||
waiting = true;
|
||||
setTimeout(function () {
|
||||
waiting = false;
|
||||
}, wait);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function nexttick(func) {
|
||||
return setTimeout(func, 0);
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
|
||||
/*!
|
||||
* headroom.js v0.12.0 - Give your page some headroom. Hide your header until you need it
|
||||
* Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js
|
||||
* License: MIT
|
||||
*/
|
||||
|
||||
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).Headroom=n()}(this,function(){"use strict";function t(){return"undefined"!=typeof window}function d(t){return function(t){return t&&t.document&&function(t){return 9===t.nodeType}(t.document)}(t)?function(t){var n=t.document,o=n.body,s=n.documentElement;return{scrollHeight:function(){return Math.max(o.scrollHeight,s.scrollHeight,o.offsetHeight,s.offsetHeight,o.clientHeight,s.clientHeight)},height:function(){return t.innerHeight||s.clientHeight||o.clientHeight},scrollY:function(){return void 0!==t.pageYOffset?t.pageYOffset:(s||o.parentNode||o).scrollTop}}}(t):function(t){return{scrollHeight:function(){return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight)},height:function(){return Math.max(t.offsetHeight,t.clientHeight)},scrollY:function(){return t.scrollTop}}}(t)}function n(t,s,e){var n,o=function(){var n=!1;try{var t={get passive(){n=!0}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){n=!1}return n}(),i=!1,r=d(t),l=r.scrollY(),a={};function c(){var t=Math.round(r.scrollY()),n=r.height(),o=r.scrollHeight();a.scrollY=t,a.lastScrollY=l,a.direction=l<t?"down":"up",a.distance=Math.abs(t-l),a.isOutOfBounds=t<0||o<t+n,a.top=t<=s.offset[a.direction],a.bottom=o<=t+n,a.toleranceExceeded=a.distance>s.tolerance[a.direction],e(a),l=t,i=!1}function h(){i||(i=!0,n=requestAnimationFrame(c))}var u=!!o&&{passive:!0,capture:!1};return t.addEventListener("scroll",h,u),c(),{destroy:function(){cancelAnimationFrame(n),t.removeEventListener("scroll",h,u)}}}function o(t){return t===Object(t)?t:{down:t,up:t}}function s(t,n){n=n||{},Object.assign(this,s.options,n),this.classes=Object.assign({},s.options.classes,n.classes),this.elem=t,this.tolerance=o(this.tolerance),this.offset=o(this.offset),this.initialised=!1,this.frozen=!1}return s.prototype={constructor:s,init:function(){return s.cutsTheMustard&&!this.initialised&&(this.addClass("initial"),this.initialised=!0,setTimeout(function(t){t.scrollTracker=n(t.scroller,{offset:t.offset,tolerance:t.tolerance},t.update.bind(t))},100,this)),this},destroy:function(){this.initialised=!1,Object.keys(this.classes).forEach(this.removeClass,this),this.scrollTracker.destroy()},unpin:function(){!this.hasClass("pinned")&&this.hasClass("unpinned")||(this.addClass("unpinned"),this.removeClass("pinned"),this.onUnpin&&this.onUnpin.call(this))},pin:function(){this.hasClass("unpinned")&&(this.addClass("pinned"),this.removeClass("unpinned"),this.onPin&&this.onPin.call(this))},freeze:function(){this.frozen=!0,this.addClass("frozen")},unfreeze:function(){this.frozen=!1,this.removeClass("frozen")},top:function(){this.hasClass("top")||(this.addClass("top"),this.removeClass("notTop"),this.onTop&&this.onTop.call(this))},notTop:function(){this.hasClass("notTop")||(this.addClass("notTop"),this.removeClass("top"),this.onNotTop&&this.onNotTop.call(this))},bottom:function(){this.hasClass("bottom")||(this.addClass("bottom"),this.removeClass("notBottom"),this.onBottom&&this.onBottom.call(this))},notBottom:function(){this.hasClass("notBottom")||(this.addClass("notBottom"),this.removeClass("bottom"),this.onNotBottom&&this.onNotBottom.call(this))},shouldUnpin:function(t){return"down"===t.direction&&!t.top&&t.toleranceExceeded},shouldPin:function(t){return"up"===t.direction&&t.toleranceExceeded||t.top},addClass:function(t){this.elem.classList.add.apply(this.elem.classList,this.classes[t].split(" "))},removeClass:function(t){this.elem.classList.remove.apply(this.elem.classList,this.classes[t].split(" "))},hasClass:function(t){return this.classes[t].split(" ").every(function(t){return this.classList.contains(t)},this.elem)},update:function(t){t.isOutOfBounds||!0!==this.frozen&&(t.top?this.top():this.notTop(),t.bottom?this.bottom():this.notBottom(),this.shouldUnpin(t)?this.unpin():this.shouldPin(t)&&this.pin())}},s.options={tolerance:{up:0,down:0},offset:0,scroller:t()?window:null,classes:{frozen:"headroom--frozen",pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",bottom:"headroom--bottom",notBottom:"headroom--not-bottom",initial:"headroom"}},s.cutsTheMustard=!!(t()&&function(){}.bind&&"classList"in document.documentElement&&Object.assign&&Object.keys&&requestAnimationFrame),s});
|
||||
@@ -0,0 +1,288 @@
|
||||
const headroomChanged = new CustomEvent("quarto-hrChanged", {
|
||||
detail: {},
|
||||
bubbles: true,
|
||||
cancelable: false,
|
||||
composed: false,
|
||||
});
|
||||
|
||||
window.document.addEventListener("DOMContentLoaded", function () {
|
||||
let init = false;
|
||||
|
||||
// Manage the back to top button, if one is present.
|
||||
let lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;
|
||||
const scrollDownBuffer = 5;
|
||||
const scrollUpBuffer = 35;
|
||||
const btn = document.getElementById("quarto-back-to-top");
|
||||
const hideBackToTop = () => {
|
||||
btn.style.display = "none";
|
||||
};
|
||||
const showBackToTop = () => {
|
||||
btn.style.display = "inline-block";
|
||||
};
|
||||
if (btn) {
|
||||
window.document.addEventListener(
|
||||
"scroll",
|
||||
function () {
|
||||
const currentScrollTop =
|
||||
window.pageYOffset || document.documentElement.scrollTop;
|
||||
|
||||
// Shows and hides the button 'intelligently' as the user scrolls
|
||||
if (currentScrollTop - scrollDownBuffer > lastScrollTop) {
|
||||
hideBackToTop();
|
||||
lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop;
|
||||
} else if (currentScrollTop < lastScrollTop - scrollUpBuffer) {
|
||||
showBackToTop();
|
||||
lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop;
|
||||
}
|
||||
|
||||
// Show the button at the bottom, hides it at the top
|
||||
if (currentScrollTop <= 0) {
|
||||
hideBackToTop();
|
||||
} else if (
|
||||
window.innerHeight + currentScrollTop >=
|
||||
document.body.offsetHeight
|
||||
) {
|
||||
showBackToTop();
|
||||
}
|
||||
},
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
function throttle(func, wait) {
|
||||
var timeout;
|
||||
return function () {
|
||||
const context = this;
|
||||
const args = arguments;
|
||||
const later = function () {
|
||||
clearTimeout(timeout);
|
||||
timeout = null;
|
||||
func.apply(context, args);
|
||||
};
|
||||
|
||||
if (!timeout) {
|
||||
timeout = setTimeout(later, wait);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function headerOffset() {
|
||||
// Set an offset if there is are fixed top navbar
|
||||
const headerEl = window.document.querySelector("header.fixed-top");
|
||||
if (headerEl) {
|
||||
return headerEl.clientHeight;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function footerOffset() {
|
||||
const footerEl = window.document.querySelector("footer.footer");
|
||||
if (footerEl) {
|
||||
return footerEl.clientHeight;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function dashboardOffset() {
|
||||
const dashboardNavEl = window.document.getElementById(
|
||||
"quarto-dashboard-header"
|
||||
);
|
||||
if (dashboardNavEl !== null) {
|
||||
return dashboardNavEl.clientHeight;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function updateDocumentOffsetWithoutAnimation() {
|
||||
updateDocumentOffset(false);
|
||||
}
|
||||
|
||||
function updateDocumentOffset(animated) {
|
||||
// set body offset
|
||||
const topOffset = headerOffset();
|
||||
const bodyOffset = topOffset + footerOffset() + dashboardOffset();
|
||||
const bodyEl = window.document.body;
|
||||
bodyEl.setAttribute("data-bs-offset", topOffset);
|
||||
bodyEl.style.paddingTop = topOffset + "px";
|
||||
|
||||
// deal with sidebar offsets
|
||||
const sidebars = window.document.querySelectorAll(
|
||||
".sidebar, .headroom-target"
|
||||
);
|
||||
sidebars.forEach((sidebar) => {
|
||||
if (!animated) {
|
||||
sidebar.classList.add("notransition");
|
||||
// Remove the no transition class after the animation has time to complete
|
||||
setTimeout(function () {
|
||||
sidebar.classList.remove("notransition");
|
||||
}, 201);
|
||||
}
|
||||
|
||||
if (window.Headroom && sidebar.classList.contains("sidebar-unpinned")) {
|
||||
sidebar.style.top = "0";
|
||||
sidebar.style.maxHeight = "100vh";
|
||||
} else {
|
||||
sidebar.style.top = topOffset + "px";
|
||||
sidebar.style.maxHeight = "calc(100vh - " + topOffset + "px)";
|
||||
}
|
||||
});
|
||||
|
||||
// allow space for footer
|
||||
const mainContainer = window.document.querySelector(".quarto-container");
|
||||
if (mainContainer) {
|
||||
mainContainer.style.minHeight = "calc(100vh - " + bodyOffset + "px)";
|
||||
}
|
||||
|
||||
// link offset
|
||||
let linkStyle = window.document.querySelector("#quarto-target-style");
|
||||
if (!linkStyle) {
|
||||
linkStyle = window.document.createElement("style");
|
||||
linkStyle.setAttribute("id", "quarto-target-style");
|
||||
window.document.head.appendChild(linkStyle);
|
||||
}
|
||||
while (linkStyle.firstChild) {
|
||||
linkStyle.removeChild(linkStyle.firstChild);
|
||||
}
|
||||
if (topOffset > 0) {
|
||||
linkStyle.appendChild(
|
||||
window.document.createTextNode(`
|
||||
section:target::before {
|
||||
content: "";
|
||||
display: block;
|
||||
height: ${topOffset}px;
|
||||
margin: -${topOffset}px 0 0;
|
||||
}`)
|
||||
);
|
||||
}
|
||||
if (init) {
|
||||
window.dispatchEvent(headroomChanged);
|
||||
}
|
||||
init = true;
|
||||
}
|
||||
|
||||
// initialize headroom
|
||||
var header = window.document.querySelector("#quarto-header");
|
||||
if (header && window.Headroom) {
|
||||
const headroom = new window.Headroom(header, {
|
||||
tolerance: 5,
|
||||
onPin: function () {
|
||||
const sidebars = window.document.querySelectorAll(
|
||||
".sidebar, .headroom-target"
|
||||
);
|
||||
sidebars.forEach((sidebar) => {
|
||||
sidebar.classList.remove("sidebar-unpinned");
|
||||
});
|
||||
updateDocumentOffset();
|
||||
},
|
||||
onUnpin: function () {
|
||||
const sidebars = window.document.querySelectorAll(
|
||||
".sidebar, .headroom-target"
|
||||
);
|
||||
sidebars.forEach((sidebar) => {
|
||||
sidebar.classList.add("sidebar-unpinned");
|
||||
});
|
||||
updateDocumentOffset();
|
||||
},
|
||||
});
|
||||
headroom.init();
|
||||
|
||||
let frozen = false;
|
||||
window.quartoToggleHeadroom = function () {
|
||||
if (frozen) {
|
||||
headroom.unfreeze();
|
||||
frozen = false;
|
||||
} else {
|
||||
headroom.freeze();
|
||||
frozen = true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
window.addEventListener(
|
||||
"hashchange",
|
||||
function (e) {
|
||||
if (
|
||||
getComputedStyle(document.documentElement).scrollBehavior !== "smooth"
|
||||
) {
|
||||
window.scrollTo(0, window.pageYOffset - headerOffset());
|
||||
}
|
||||
},
|
||||
false
|
||||
);
|
||||
|
||||
// Observe size changed for the header
|
||||
const headerEl = window.document.querySelector("header.fixed-top");
|
||||
if (headerEl && window.ResizeObserver) {
|
||||
const observer = new window.ResizeObserver(() => {
|
||||
setTimeout(updateDocumentOffsetWithoutAnimation, 0);
|
||||
});
|
||||
observer.observe(headerEl, {
|
||||
attributes: true,
|
||||
childList: true,
|
||||
characterData: true,
|
||||
});
|
||||
} else {
|
||||
window.addEventListener(
|
||||
"resize",
|
||||
throttle(updateDocumentOffsetWithoutAnimation, 50)
|
||||
);
|
||||
}
|
||||
setTimeout(updateDocumentOffsetWithoutAnimation, 250);
|
||||
|
||||
// fixup index.html links if we aren't on the filesystem
|
||||
if (window.location.protocol !== "file:") {
|
||||
const links = window.document.querySelectorAll("a");
|
||||
for (let i = 0; i < links.length; i++) {
|
||||
if (links[i].href) {
|
||||
links[i].href = links[i].href.replace(/\/index\.html/, "/");
|
||||
}
|
||||
}
|
||||
|
||||
// Fixup any sharing links that require urls
|
||||
// Append url to any sharing urls
|
||||
const sharingLinks = window.document.querySelectorAll(
|
||||
"a.sidebar-tools-main-item, a.quarto-navigation-tool, a.quarto-navbar-tools, a.quarto-navbar-tools-item"
|
||||
);
|
||||
for (let i = 0; i < sharingLinks.length; i++) {
|
||||
const sharingLink = sharingLinks[i];
|
||||
const href = sharingLink.getAttribute("href");
|
||||
if (href) {
|
||||
sharingLink.setAttribute(
|
||||
"href",
|
||||
href.replace("|url|", window.location.href)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Scroll the active navigation item into view, if necessary
|
||||
const navSidebar = window.document.querySelector("nav#quarto-sidebar");
|
||||
if (navSidebar) {
|
||||
// Find the active item
|
||||
const activeItem = navSidebar.querySelector("li.sidebar-item a.active");
|
||||
if (activeItem) {
|
||||
// Wait for the scroll height and height to resolve by observing size changes on the
|
||||
// nav element that is scrollable
|
||||
const resizeObserver = new ResizeObserver((_entries) => {
|
||||
// The bottom of the element
|
||||
const elBottom = activeItem.offsetTop;
|
||||
const viewBottom = navSidebar.scrollTop + navSidebar.clientHeight;
|
||||
|
||||
// The element height and scroll height are the same, then we are still loading
|
||||
if (viewBottom !== navSidebar.scrollHeight) {
|
||||
// Determine if the item isn't visible and scroll to it
|
||||
if (elBottom >= viewBottom) {
|
||||
navSidebar.scrollTop = elBottom;
|
||||
}
|
||||
|
||||
// stop observing now since we've completed the scroll
|
||||
resizeObserver.unobserve(navSidebar);
|
||||
}
|
||||
});
|
||||
resizeObserver.observe(navSidebar);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
+516
@@ -0,0 +1,516 @@
|
||||
---
|
||||
title: "Awesome Quant"
|
||||
date-modified: "`r Sys.Date()`"
|
||||
keywords: ["r packages", "python packages", "julia packages",
|
||||
"software development", "software engineering", "financial computing",
|
||||
"r", "python", "julia"]
|
||||
include-in-header:
|
||||
- text: |
|
||||
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7994446359957143"
|
||||
crossorigin="anonymous"></script>
|
||||
---
|
||||
|
||||
A curated list of insanely awesome libraries, packages and resources for Quants (Quantitative Finance).
|
||||
|
||||
[](https://awesome.re)
|
||||
|
||||
## Python
|
||||
|
||||
### Numerical Libraries & Data Structures
|
||||
|
||||
- [numpy](https://www.numpy.org) - NumPy is the fundamental package for scientific computing with Python.
|
||||
- [scipy](https://www.scipy.org) - SciPy (pronounced “Sigh Pie”) is a Python-based ecosystem of open-source software for mathematics, science, and engineering.
|
||||
- [pandas](https://pandas.pydata.org) - pandas is an open source, BSD-licensed library providing high-performance, easy-to-use data structures and data analysis tools for the Python programming language.
|
||||
- [quantdsl](https://github.com/johnbywater/quantdsl) - Domain specific language for quantitative analytics in finance and trading.
|
||||
- [statistics](https://docs.python.org/3/library/statistics.html) - Builtin Python library for all basic statistical calculations.
|
||||
- [sympy](https://www.sympy.org/) - SymPy is a Python library for symbolic mathematics.
|
||||
- [pymc3](https://docs.pymc.io/) - Probabilistic Programming in Python: Bayesian Modeling and Probabilistic Machine Learning with Theano.
|
||||
- [modelx](https://docs.modelx.io/) - Python reimagination of spreadsheets as formula-centric objects that are interoperable with pandas.
|
||||
- [ArcticDB](https://github.com/man-group/ArcticDB) - High performance datastore for time series and tick data.
|
||||
|
||||
### Financial Instruments and Pricing
|
||||
|
||||
- [OpenBB Terminal](https://github.com/OpenBB-finance/OpenBBTerminal) - Terminal for investment research for everyone.
|
||||
- [PyQL](https://github.com/enthought/pyql) - QuantLib's Python port.
|
||||
- [pyfin](https://github.com/opendoor-labs/pyfin) - Basic options pricing in Python. *ARCHIVED*
|
||||
- [vollib](https://github.com/vollib/vollib) - vollib is a python library for calculating option prices, implied volatility and greeks.
|
||||
- [QuantPy](https://github.com/jsmidt/QuantPy) - A framework for quantitative finance In python.
|
||||
- [Finance-Python](https://github.com/alpha-miner/Finance-Python) - Python tools for Finance.
|
||||
- [ffn](https://github.com/pmorissette/ffn) - A financial function library for Python.
|
||||
- [pynance](https://github.com/GriffinAustin/pynance) - Lightweight Python library for assembling and analysing financial data.
|
||||
- [tia](https://github.com/bpsmith/tia) - Toolkit for integration and analysis.
|
||||
- [hasura/base-python-dash](https://platform.hasura.io/hub/projects/hasura/base-python-dash) - Hasura quickstart to deploy Dash framework. Written on top of Flask, Plotly.js, and React.js, Dash is ideal for building data visualization apps with highly custom user interfaces in pure Python.
|
||||
- [hasura/base-python-bokeh](https://platform.hasura.io/hub/projects/hasura/base-python-bokeh) - Hasura quickstart to visualize data with bokeh library.
|
||||
- [pysabr](https://github.com/ynouri/pysabr) - SABR model Python implementation.
|
||||
- [FinancePy](https://github.com/domokane/FinancePy) - A Python Finance Library that focuses on the pricing and risk-management of Financial Derivatives, including fixed-income, equity, FX and credit derivatives.
|
||||
- [gs-quant](https://github.com/goldmansachs/gs-quant) - Python toolkit for quantitative finance
|
||||
- [willowtree](https://github.com/federicomariamassari/willowtree) - Robust and flexible Python implementation of the willow tree lattice for derivatives pricing.
|
||||
- [financial-engineering](https://github.com/federicomariamassari/financial-engineering) - Applications of Monte Carlo methods to financial engineering projects, in Python.
|
||||
- [optlib](https://github.com/dbrojas/optlib) - A library for financial options pricing written in Python.
|
||||
- [tf-quant-finance](https://github.com/google/tf-quant-finance) - High-performance TensorFlow library for quantitative finance.
|
||||
- [Q-Fin](https://github.com/RomanMichaelPaolucci/Q-Fin) - A Python library for mathematical finance.
|
||||
- [Quantsbin](https://github.com/quantsbin/Quantsbin) - Tools for pricing and plotting of vanilla option prices, greeks and various other analysis around them.
|
||||
- [finoptions](https://github.com/bbcho/finoptions-dev) - Complete python implementation of R package fOptions with partial implementation of fExoticOptions for pricing various options.
|
||||
- [pypme](https://github.com/ymyke/pypme) - PME (Public Market Equivalent) calculation.
|
||||
- [AbsBox](https://github.com/yellowbean/AbsBox) - A Python based library to model cashflow for structured product like Asset-backed securities (ABS) and Mortgage-backed securities (MBS).
|
||||
- [Intrinsic-Value-Calculator](https://github.com/akashaero/Intrinsic-Value-Calculator) - A Python tool for quick calculations of a stock's fair value using Discounted Cash Flow analysis.
|
||||
- [Kelly-Criterion](https://github.com/deltaray-io/kelly-criterion) - Kelly Criterion implemented in Python to size portfolios based on J. L. Kelly Jr's formula.
|
||||
|
||||
### Indicators
|
||||
|
||||
- [pandas_talib](https://github.com/femtotrader/pandas_talib) - A Python Pandas implementation of technical analysis indicators.
|
||||
- [finta](https://github.com/peerchemist/finta) - Common financial technical analysis indicators implemented in Pandas.
|
||||
- [Tulipy](https://github.com/cirla/tulipy) - Financial Technical Analysis Indicator Library (Python bindings for [tulipindicators](https://github.com/TulipCharts/tulipindicators))
|
||||
- [lppls](https://github.com/Boulder-Investment-Technologies/lppls) - A Python module for fitting the [Log-Periodic Power Law Singularity (LPPLS)](https://en.wikipedia.org/wiki/Didier_Sornette#The_JLS_and_LPPLS_models) model.
|
||||
|
||||
### Trading & Backtesting
|
||||
- [skfolio](https://github.com/skfolio/skfolio) - Python library for portfolio optimization built on top of scikit-learn. It provides a unified interface and sklearn compatible tools to build, tune and cross-validate portfolio models.
|
||||
- [Investing algorithm framework](https://github.com/coding-kitties/investing-algorithm-framework) - Framework for developing, backtesting, and deploying automated trading algorithms.
|
||||
- [QSTrader](https://github.com/mhallsmoore/qstrader) - QSTrader backtesting simulation engine.
|
||||
- [Blankly](https://github.com/Blankly-Finance/Blankly) - Fully integrated backtesting, paper trading, and live deployment.
|
||||
- [TA-Lib](https://github.com/mrjbq7/ta-lib) - Python wrapper for TA-Lib (<http://ta-lib.org/>).
|
||||
- [zipline](https://github.com/quantopian/zipline) - Pythonic algorithmic trading library.
|
||||
- [QuantSoftware Toolkit](https://github.com/QuantSoftware/QuantSoftwareToolkit) - Python-based open source software framework designed to support portfolio construction and management.
|
||||
- [quantitative](https://github.com/jeffrey-liang/quantitative) - Quantitative finance, and backtesting library.
|
||||
- [analyzer](https://github.com/llazzaro/analyzer) - Python framework for real-time financial and backtesting trading strategies.
|
||||
- [bt](https://github.com/pmorissette/bt) - Flexible Backtesting for Python.
|
||||
- [backtrader](https://github.com/backtrader/backtrader) - Python Backtesting library for trading strategies.
|
||||
- [pythalesians](https://github.com/thalesians/pythalesians) - Python library to backtest trading strategies, plot charts, seamlessly download market data, analyse market patterns etc.
|
||||
- [pybacktest](https://github.com/ematvey/pybacktest) - Vectorized backtesting framework in Python / pandas, designed to make your backtesting easier.
|
||||
- [pyalgotrade](https://github.com/gbeced/pyalgotrade) - Python Algorithmic Trading Library.
|
||||
- [basana](https://github.com/gbeced/basana) - A Python async and event driven framework for algorithmic trading, with a focus on crypto currencies.
|
||||
- [tradingWithPython](https://pypi.org/project/tradingWithPython/) - A collection of functions and classes for Quantitative trading.
|
||||
- [Pandas TA](https://github.com/twopirllc/pandas-ta) - Pandas TA is an easy to use Python 3 Pandas Extension with 115+ Indicators. Easily build Custom Strategies.
|
||||
- [ta](https://github.com/bukosabino/ta) - Technical Analysis Library using Pandas (Python)
|
||||
- [algobroker](https://github.com/joequant/algobroker) - This is an execution engine for algo trading.
|
||||
- [pysentosa](https://pypi.org/project/pysentosa/) - Python API for sentosa trading system.
|
||||
- [finmarketpy](https://github.com/cuemacro/finmarketpy) - Python library for backtesting trading strategies and analyzing financial markets.
|
||||
- [binary-martingale](https://github.com/metaperl/binary-martingale) - Computer program to automatically trade binary options martingale style.
|
||||
- [fooltrader](https://github.com/foolcage/fooltrader) - the project using big-data technology to provide an uniform way to analyze the whole market.
|
||||
- [zvt](https://github.com/zvtvz/zvt) - the project using sql,pandas to provide an uniform and extendable way to record data,computing factors,select securites, backtesting,realtime trading and it could show all of them in clearly charts in realtime.
|
||||
- [pylivetrader](https://github.com/alpacahq/pylivetrader) - zipline-compatible live trading library.
|
||||
- [pipeline-live](https://github.com/alpacahq/pipeline-live) - zipline's pipeline capability with IEX for live trading.
|
||||
- [zipline-extensions](https://github.com/quantrocket-llc/zipline-extensions) - Zipline extensions and adapters for QuantRocket.
|
||||
- [moonshot](https://github.com/quantrocket-llc/moonshot) - Vectorized backtester and trading engine for QuantRocket based on Pandas.
|
||||
- [PyPortfolioOpt](https://github.com/robertmartin8/PyPortfolioOpt) - Financial portfolio optimisation in python, including classical efficient frontier and advanced methods.
|
||||
- [Eiten](https://github.com/tradytics/eiten) - Eiten is an open source toolkit by Tradytics that implements various statistical and algorithmic investing strategies such as Eigen Portfolios, Minimum Variance Portfolios, Maximum Sharpe Ratio Portfolios, and Genetic Algorithms based Portfolios.
|
||||
- [riskparity.py](https://github.com/dppalomar/riskparity.py) - fast and scalable design of risk parity portfolios with TensorFlow 2.0
|
||||
- [mlfinlab](https://github.com/hudson-and-thames/mlfinlab) - Implementations regarding "Advances in Financial Machine Learning" by Marcos Lopez de Prado. (Feature Engineering, Financial Data Structures, Meta-Labeling)
|
||||
- [pyqstrat](https://github.com/abbass2/pyqstrat) - A fast, extensible, transparent python library for backtesting quantitative strategies.
|
||||
- [NowTrade](https://github.com/edouardpoitras/NowTrade) - Python library for backtesting technical/mechanical strategies in the stock and currency markets.
|
||||
- [pinkfish](https://github.com/fja05680/pinkfish) - A backtester and spreadsheet library for security analysis.
|
||||
- [aat](https://github.com/timkpaine/aat) - Async Algorithmic Trading Engine
|
||||
- [Backtesting.py](https://kernc.github.io/backtesting.py/) - Backtest trading strategies in Python
|
||||
- [catalyst](https://github.com/enigmampc/catalyst) - An Algorithmic Trading Library for Crypto-Assets in Python
|
||||
- [quantstats](https://github.com/ranaroussi/quantstats) - Portfolio analytics for quants, written in Python
|
||||
- [qtpylib](https://github.com/ranaroussi/qtpylib) - QTPyLib, Pythonic Algorithmic Trading <http://qtpylib.io>
|
||||
- [Quantdom](https://github.com/constverum/Quantdom) - Python-based framework for backtesting trading strategies & analyzing financial markets [GUI :neckbeard:]
|
||||
- [freqtrade](https://github.com/freqtrade/freqtrade) - Free, open source crypto trading bot
|
||||
- [algorithmic-trading-with-python](https://github.com/chrisconlan/algorithmic-trading-with-python) - Free `pandas` and `scikit-learn` resources for trading simulation, backtesting, and machine learning on financial data.
|
||||
- [DeepDow](https://github.com/jankrepl/deepdow) - Portfolio optimization with deep learning
|
||||
- [Qlib](https://github.com/microsoft/qlib) - An AI-oriented Quantitative Investment Platform by Microsoft. Full ML pipeline of data processing, model training, back-testing; and covers the entire chain of quantitative investment: alpha seeking, risk modeling, portfolio optimization, and order execution.
|
||||
- [machine-learning-for-trading](https://github.com/stefan-jansen/machine-learning-for-trading) - Code and resources for Machine Learning for Algorithmic Trading
|
||||
- [AlphaPy](https://github.com/ScottfreeLLC/AlphaPy) - Automated Machine Learning [AutoML] with Python, scikit-learn, Keras, XGBoost, LightGBM, and CatBoost
|
||||
- [jesse](https://github.com/jesse-ai/jesse) - An advanced crypto trading bot written in Python
|
||||
- [rqalpha](https://github.com/ricequant/rqalpha) - A extendable, replaceable Python algorithmic backtest && trading framework supporting multiple securities.
|
||||
- [FinRL-Library](https://github.com/AI4Finance-LLC/FinRL-Library) - A Deep Reinforcement Learning Library for Automated Trading in Quantitative Finance. NeurIPS 2020.
|
||||
- [bulbea](https://github.com/achillesrasquinha/bulbea) - Deep Learning based Python Library for Stock Market Prediction and Modelling.
|
||||
- [ib_nope](https://github.com/ajhpark/ib_nope) - Automated trading system for NOPE strategy over IBKR TWS.
|
||||
- [OctoBot](https://github.com/Drakkar-Software/OctoBot) - Open source cryptocurrency trading bot for high frequency, arbitrage, TA and social trading with an advanced web interface.
|
||||
- [bta-lib](https://github.com/mementum/bta-lib) - Technical Analysis library in pandas for backtesting algotrading and quantitative analysis.
|
||||
- [Stock-Prediction-Models](https://github.com/huseinzol05/Stock-Prediction-Models) - Gathers machine learning and deep learning models for Stock forecasting including trading bots and simulations.
|
||||
- [TuneTA](https://github.com/jmrichardson/tuneta) - TuneTA optimizes technical indicators using a distance correlation measure to a user defined target feature such as next day return.
|
||||
- [AutoTrader](https://github.com/kieran-mackle/AutoTrader) - A Python-based development platform for automated trading systems - from backtesting to optimisation to livetrading.
|
||||
- [fast-trade](https://github.com/jrmeier/fast-trade) - A library built with backtest portability and performance in mind for backtest trading strategies.
|
||||
- [qf-lib](https://github.com/quarkfin/qf-lib) - QF-Lib is a Python library that provides high quality tools for quantitative finance.
|
||||
- [tda-api](https://github.com/alexgolec/tda-api) - Gather data and trade equities, options, and ETFs via TDAmeritrade.
|
||||
- [vectorbt](https://github.com/polakowo/vectorbt) - Find your trading edge, using a powerful toolkit for backtesting, algorithmic trading, and research.
|
||||
- [Lean](https://github.com/QuantConnect/Lean) - Lean Algorithmic Trading Engine by QuantConnect (Python, C#).
|
||||
- [fast-trade](https://github.com/jrmeier/fast-trade) - Low code backtesting library utilizing pandas and technical analysis indicators.
|
||||
- [pysystemtrade](https://github.com/robcarver17/pysystemtrade) - pysystemtrade is the open source version of Robert Carver's backtesting and trading engine that implements systems according to the framework outlined in his book "Systematic Trading", which is further developed on his [blog](https://qoppac.blogspot.com/).
|
||||
- [pytrendseries](https://github.com/rafa-rod/pytrendseries) - Detect trend in time series, drawdown, drawdown within a constant look-back window , maximum drawdown, time underwater.
|
||||
- [PyLOB](https://github.com/DrAshBooth/PyLOB) - Fully functioning fast Limit Order Book written in Python.
|
||||
- [PyBroker](https://github.com/edtechre/pybroker) - Algorithmic Trading with Machine Learning.
|
||||
- [OctoBot Script](https://github.com/Drakkar-Software/OctoBot-Script) - A quant framework to create cryptocurrencies strategies - from backtesting to optimisation to livetrading.
|
||||
- [hftbacktest](https://github.com/nkaz001/hftbacktest) - A high-frequency trading and market-making backtesting tool accounts for limit orders, queue positions, and latencies, utilizing full tick data for trades and order books.
|
||||
- [vnpy](https://github.com/vnpy/vnpy) - VeighNa is a Python-based open source quantitative trading system development framework.
|
||||
- [Intelligent Trading Bot](https://github.com/asavinov/intelligent-trading-bot) - Automatically generating signals and trading based on machine learning and feature engineering
|
||||
- [fastquant](https://github.com/enzoampil/fastquant) - fastquant allows you to easily backtest investment strategies with as few as 3 lines of python code.
|
||||
- [nautilus_trader](https://github.com/nautechsystems/nautilus_trader) - A high-performance algorithmic trading platform and event-driven backtester.
|
||||
|
||||
### Risk Analysis
|
||||
|
||||
- [pyfolio](https://github.com/quantopian/pyfolio) - Portfolio and risk analytics in Python.
|
||||
- [empyrical](https://github.com/quantopian/empyrical) - Common financial risk and performance metrics.
|
||||
- [fecon235](https://github.com/rsvp/fecon235) - Computational tools for financial economics include: Gaussian Mixture model of leptokurtotic risk, adaptive Boltzmann portfolios.
|
||||
- [finance](https://pypi.org/project/finance/) - Financial Risk Calculations. Optimized for ease of use through class construction and operator overload.
|
||||
- [qfrm](https://pypi.org/project/qfrm/) - Quantitative Financial Risk Management: awesome OOP tools for measuring, managing and visualizing risk of financial instruments and portfolios.
|
||||
- [visualize-wealth](https://github.com/benjaminmgross/visualize-wealth) - Portfolio construction and quantitative analysis.
|
||||
- [VisualPortfolio](https://github.com/wegamekinglc/VisualPortfolio) - This tool is used to visualize the performance of a portfolio.
|
||||
- [universal-portfolios](https://github.com/Marigold/universal-portfolios) - Collection of algorithms for online portfolio selection.
|
||||
- [FinQuant](https://github.com/fmilthaler/FinQuant) - A program for financial portfolio management, analysis and optimisation.
|
||||
- [Empyrial](https://github.com/ssantoshp/Empyrial) - Portfolio's risk and performance analytics and returns predictions.
|
||||
- [risktools](https://github.com/bbcho/risktools-dev) - Risk tools for use within the crude and crude products trading space with partial implementation of R's PerformanceAnalytics.
|
||||
- [Riskfolio-Lib](https://github.com/dcajasn/Riskfolio-Lib) - Portfolio Optimization and Quantitative Strategic Asset Allocation in Python.
|
||||
|
||||
### Factor Analysis
|
||||
|
||||
- [alphalens](https://github.com/quantopian/alphalens) - Performance analysis of predictive alpha factors.
|
||||
- [Spectre](https://github.com/Heerozh/spectre) - GPU-accelerated Factors analysis library and Backtester
|
||||
|
||||
### Quant Research Environment
|
||||
|
||||
- [Jupyter Quant](https://github.com/gnzsnz/jupyter-quant) - A dockerized Jupyter quant research environment with preloaded tools for quant analysis, statsmodels, pymc, arch, py_vollib, zipline-reloaded, PyPortfolioOpt, etc.
|
||||
|
||||
### Time Series
|
||||
|
||||
- [ARCH](https://github.com/bashtage/arch) - ARCH models in Python.
|
||||
- [statsmodels](http://statsmodels.sourceforge.net) - Python module that allows users to explore data, estimate statistical models, and perform statistical tests.
|
||||
- [dynts](https://github.com/quantmind/dynts) - Python package for timeseries analysis and manipulation.
|
||||
- [PyFlux](https://github.com/RJT1990/pyflux) - Python library for timeseries modelling and inference (frequentist and Bayesian) on models.
|
||||
- [tsfresh](https://github.com/blue-yonder/tsfresh) - Automatic extraction of relevant features from time series.
|
||||
- [hasura/quandl-metabase](https://platform.hasura.io/hub/projects/anirudhm/quandl-metabase-time-series) - Hasura quickstart to visualize Quandl's timeseries datasets with Metabase.
|
||||
- [Facebook Prophet](https://github.com/facebook/prophet) - Tool for producing high quality forecasts for time series data that has multiple seasonality with linear or non-linear growth.
|
||||
- [tsmoothie](https://github.com/cerlymarco/tsmoothie) - A python library for time-series smoothing and outlier detection in a vectorized way.
|
||||
- [pmdarima](https://github.com/alkaline-ml/pmdarima) - A statistical library designed to fill the void in Python's time series analysis capabilities, including the equivalent of R's auto.arima function.
|
||||
- [gluon-ts](https://github.com/awslabs/gluon-ts) - vProbabilistic time series modeling in Python.
|
||||
|
||||
### Calendars
|
||||
|
||||
- [exchange_calendars](https://github.com/gerrymanoim/exchange_calendars) - Stock Exchange Trading Calendars.
|
||||
- [bizdays](https://github.com/wilsonfreitas/python-bizdays) - Business days calculations and utilities.
|
||||
- [pandas_market_calendars](https://github.com/rsheftel/pandas_market_calendars) - Exchange calendars to use with pandas for trading applications.
|
||||
|
||||
### Data Sources
|
||||
|
||||
- [yfinance](https://github.com/ranaroussi/yfinance) - Yahoo! Finance market data downloader (+faster Pandas Datareader)
|
||||
- [findatapy](https://github.com/cuemacro/findatapy) - Python library to download market data via Bloomberg, Quandl, Yahoo etc.
|
||||
- [googlefinance](https://github.com/hongtaocai/googlefinance) - Python module to get real-time stock data from Google Finance API.
|
||||
- [yahoo-finance](https://github.com/lukaszbanasiak/yahoo-finance) - Python module to get stock data from Yahoo! Finance.
|
||||
- [pandas-datareader](https://github.com/pydata/pandas-datareader) - Python module to get data from various sources (Google Finance, Yahoo Finance, FRED, OECD, Fama/French, World Bank, Eurostat...) into Pandas datastructures such as DataFrame, Panel with a caching mechanism.
|
||||
- [pandas-finance](https://github.com/davidastephens/pandas-finance) - High level API for access to and analysis of financial data.
|
||||
- [pyhoofinance](https://github.com/innes213/pyhoofinance) - Rapidly queries Yahoo Finance for multiple tickers and returns typed data for analysis.
|
||||
- [yfinanceapi](https://github.com/Karthik005/yfinanceapi) - Finance API for Python.
|
||||
- [yql-finance](https://github.com/slawek87/yql-finance) - yql-finance is simple and fast. API returns stock closing prices for current period of time and current stock ticker (i.e. APPL, GOOGL).
|
||||
- [ystockquote](https://github.com/cgoldberg/ystockquote) - Retrieve stock quote data from Yahoo Finance.
|
||||
- [wallstreet](https://github.com/mcdallas/wallstreet) - Real time stock and option data.
|
||||
- [stock_extractor](https://github.com/ZachLiuGIS/stock_extractor) - General Purpose Stock Extractors from Online Resources.
|
||||
- [Stockex](https://github.com/cttn/Stockex) - Python wrapper for Yahoo! Finance API.
|
||||
- [finsymbols](https://github.com/skillachie/finsymbols) - Obtains stock symbols and relating information for SP500, AMEX, NYSE, and NASDAQ.
|
||||
- [FRB](https://github.com/avelkoski/FRB) - Python Client for FRED® API.
|
||||
- [inquisitor](https://github.com/econdb/inquisitor) - Python Interface to Econdb.com API.
|
||||
- [yfi](https://github.com/nickelkr/yfi) - Yahoo! YQL library.
|
||||
- [chinesestockapi](https://pypi.org/project/chinesestockapi/) - Python API to get Chinese stock price.
|
||||
- [exchange](https://github.com/akarat/exchange) - Get current exchange rate.
|
||||
- [ticks](https://github.com/jamescnowell/ticks) - Simple command line tool to get stock ticker data.
|
||||
- [pybbg](https://github.com/bpsmith/pybbg) - Python interface to Bloomberg COM APIs.
|
||||
- [ccy](https://github.com/lsbardel/ccy) - Python module for currencies.
|
||||
- [tushare](https://pypi.org/project/tushare/) - A utility for crawling historical and Real-time Quotes data of China stocks.
|
||||
- [jsm](https://pypi.org/project/jsm/) - Get the japanese stock market data.
|
||||
- [cn_stock_src](https://github.com/jealous/cn_stock_src) - Utility for retrieving basic China stock data from different sources.
|
||||
- [coinmarketcap](https://github.com/barnumbirr/coinmarketcap) - Python API for coinmarketcap.
|
||||
- [after-hours](https://github.com/datawrestler/after-hours) - Obtain pre market and after hours stock prices for a given symbol.
|
||||
- [bronto-python](https://pypi.org/project/bronto-python/) - Bronto API Integration for Python.
|
||||
- [pytdx](https://github.com/rainx/pytdx) - Python Interface for retrieving chinese stock realtime quote data from TongDaXin Nodes.
|
||||
- [pdblp](https://github.com/matthewgilbert/pdblp) - A simple interface to integrate pandas and the Bloomberg Open API.
|
||||
- [tiingo](https://github.com/hydrosquall/tiingo-python) - Python interface for daily composite prices/OHLC/Volume + Real-time News Feeds, powered by the Tiingo Data Platform.
|
||||
- [iexfinance](https://github.com/addisonlynch/iexfinance) - Python Interface for retrieving real-time and historical prices and equities data from The Investor's Exchange.
|
||||
- [pyEX](https://github.com/timkpaine/pyEX) - Python interface to IEX with emphasis on pandas, support for streaming data, premium data, points data (economic, rates, commodities), and technical indicators.
|
||||
- [alpaca-trade-api](https://github.com/alpacahq/alpaca-trade-api-python) - Python interface for retrieving real-time and historical prices from Alpaca API as well as trade execution.
|
||||
- [metatrader5](https://pypi.org/project/MetaTrader5/) - API Connector to MetaTrader 5 Terminal
|
||||
- [akshare](https://github.com/jindaxiang/akshare) - AkShare is an elegant and simple financial data interface library for Python, built for human beings! <https://akshare.readthedocs.io>
|
||||
- [yahooquery](https://github.com/dpguthrie/yahooquery) - Python interface for retrieving data through unofficial Yahoo Finance API.
|
||||
- [investpy](https://github.com/alvarobartt/investpy) - Financial Data Extraction from Investing.com with Python! <https://investpy.readthedocs.io/>
|
||||
- [yliveticker](https://github.com/yahoofinancelive/yliveticker) - Live stream of market data from Yahoo Finance websocket.
|
||||
- [bbgbridge](https://github.com/ran404/bbgbridge) - Easy to use Bloomberg Desktop API wrapper for Python.
|
||||
- [alpha_vantage](https://github.com/RomelTorres/alpha_vantage) - A python wrapper for Alpha Vantage API for financial data.
|
||||
- [FinanceDataReader](https://github.com/FinanceData/FinanceDataReader) - Open Source Financial data reader for U.S, Korean, Japanese, Chinese, Vietnamese Stocks
|
||||
- [pystlouisfed](https://github.com/TomasKoutek/pystlouisfed) - Python client for Federal Reserve Bank of St. Louis API - FRED, ALFRED, GeoFRED and FRASER.
|
||||
- [python-bcb](https://github.com/wilsonfreitas/python-bcb) - Python interface to Brazilian Central Bank web services.
|
||||
- [market-prices](https://github.com/maread99/market_prices) - Create meaningful OHLCV datasets from knowledge of [exchange-calendars](https://github.com/gerrymanoim/exchange_calendars) (works out-the-box with data from Yahoo Finance).
|
||||
- [tardis-python](https://github.com/tardis-dev/tardis-python) - Python interface for Tardis.dev high frequency crypto market data
|
||||
- [lake-api](https://github.com/crypto-lake/lake-api) - Python interface for Crypto Lake high frequency crypto market data
|
||||
- [tessa](https://github.com/ymyke/tessa) - simple, hassle-free access to price information of financial assets (currently based on yfinance and pycoingecko), including search and a symbol class.
|
||||
- [pandaSDMX](https://github.com/dr-leo/pandaSDMX) - Python package that implements SDMX 2.1 (ISO 17369:2013), a format for exchange of statistical data and metadata used by national statistical agencies, central banks, and international organisations.
|
||||
- [cif](https://github.com/LenkaV/CIF) - Python package that include few composite indicators, which summarize multidimensional relationships between individual economic indicators.
|
||||
- [finagg](https://github.com/theOGognf/finagg) - finagg is a Python package that provides implementations of popular and free financial APIs, tools for aggregating historical data from those APIs into SQL databases, and tools for transforming aggregated data into features useful for analysis and AI/ML.
|
||||
|
||||
### Excel Integration
|
||||
|
||||
- [xlwings](https://www.xlwings.org/) - Make Excel fly with Python.
|
||||
- [openpyxl](https://openpyxl.readthedocs.io/en/latest/) - Read/Write Excel 2007 xlsx/xlsm files.
|
||||
- [xlrd](https://github.com/python-excel/xlrd) - Library for developers to extract data from Microsoft Excel spreadsheet files.
|
||||
- [xlsxwriter](https://xlsxwriter.readthedocs.io/) - Write files in the Excel 2007+ XLSX file format.
|
||||
- [xlwt](https://github.com/python-excel/xlwt) - Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform.
|
||||
- [DataNitro](https://datanitro.com/) - DataNitro also offers full-featured Python-Excel integration, including UDFs. Trial downloads are available, but users must purchase a license.
|
||||
- [xlloop](http://xlloop.sourceforge.net) - XLLoop is an open source framework for implementing Excel user-defined functions (UDFs) on a centralised server (a function server).
|
||||
- [expy](http://www.bnikolic.co.uk/expy/expy.html) - The ExPy add-in allows easy use of Python directly from within an Microsoft Excel spreadsheet, both to execute arbitrary code and to define new Excel functions.
|
||||
- [pyxll](https://www.pyxll.com) - PyXLL is an Excel add-in that enables you to extend Excel using nothing but Python code.
|
||||
|
||||
### Visualization
|
||||
|
||||
- [D-Tale](https://github.com/man-group/dtale) - Visualizer for pandas dataframes and xarray datasets.
|
||||
- [mplfinance](https://github.com/matplotlib/mplfinance) - matplotlib utilities for the visualization, and visual analysis, of financial data.
|
||||
- [finplot](https://github.com/highfestiva/finplot) - Performant and effortless finance plotting for Python.
|
||||
- [finvizfinance](https://github.com/lit26/finvizfinance) - Finviz analysis python library.
|
||||
- [market-analy](https://github.com/maread99/market_analy) - Analysis and interactive charting using [market-prices](https://github.com/maread99/market_prices) and bqplot.
|
||||
|
||||
## R
|
||||
|
||||
### Numerical Libraries & Data Structures
|
||||
|
||||
- [xts](https://github.com/joshuaulrich/xts) - eXtensible Time Series: Provide for uniform handling of R's different time-based data classes by extending zoo, maximizing native format information preservation and allowing for user level customization and extension, while simplifying cross-class interoperability.
|
||||
- [data.table](https://github.com/Rdatatable/data.table) - Extension of data.frame: Fast aggregation of large data (e.g. 100GB in RAM), fast ordered joins, fast add/modify/delete of columns by group using no copies at all, list columns and a fast file reader (fread). Offers a natural and flexible syntax, for faster development.
|
||||
- [sparseEigen](https://github.com/dppalomar/sparseEigen) - Sparse pricipal component analysis.
|
||||
- [TSdbi](http://tsdbi.r-forge.r-project.org/) - Provides a common interface to time series databases.
|
||||
- [tseries](https://cran.r-project.org/web/packages/tseries/index.html) - Time Series Analysis and Computational Finance.
|
||||
- [zoo](https://cran.r-project.org/web/packages/zoo/index.html) - S3 Infrastructure for Regular and Irregular Time Series (Z's Ordered Observations).
|
||||
- [tis](https://cran.r-project.org/web/packages/tis/index.html) - Functions and S3 classes for time indexes and time indexed series, which are compatible with FAME frequencies.
|
||||
- [tfplot](https://cran.r-project.org/web/packages/tfplot/index.html) - Utilities for simple manipulation and quick plotting of time series data.
|
||||
- [tframe](https://cran.r-project.org/web/packages/tframe/index.html) - A kernel of functions for programming time series methods in a way that is relatively independently of the representation of time.
|
||||
|
||||
### Data Sources
|
||||
|
||||
- [IBrokers](https://cran.r-project.org/web/packages/IBrokers/index.html) - Provides native R access to Interactive Brokers Trader Workstation API.
|
||||
- [Rblpapi](https://github.com/Rblp/Rblpapi) - An R Interface to 'Bloomberg' is provided via the 'Blp API'.
|
||||
- [Quandl](https://www.quandl.com/tools/r) - Get Financial Data Directly Into R.
|
||||
- [Rbitcoin](https://github.com/jangorecki/Rbitcoin) - Unified markets API interface (bitstamp, kraken, btce, bitmarket).
|
||||
- [GetTDData](https://github.com/msperlin/GetTDData) - Downloads and aggregates data for Brazilian government issued bonds directly from the website of Tesouro Direto.
|
||||
- [GetHFData](https://github.com/msperlin/GetHFData) - Downloads and aggregates high frequency trading data for Brazilian instruments directly from Bovespa ftp site.
|
||||
- [Reddit WallstreetBets API](https://dashboard.nbshare.io/apps/reddit/api/) - Provides daily top 50 stocks from reddit (subreddit) Wallstreetbets and their sentiments via the API.
|
||||
- [td](https://github.com/eddelbuettel/td) - Interfaces the 'twelvedata' API for stocks and (digital and standard) currencies.
|
||||
- [rbcb](https://github.com/wilsonfreitas/rbcb) - R interface to Brazilian Central Bank web services.
|
||||
- [rb3](https://github.com/ropensci/rb3) - A bunch of downloaders and parsers for data delivered from B3.
|
||||
- [simfinapi](https://github.com/matthiasgomolka/simfinapi) - Makes 'SimFin' data (<https://simfin.com/>) easily accessible in R.
|
||||
|
||||
### Financial Instruments and Pricing
|
||||
|
||||
- [RQuantLib](http://dirk.eddelbuettel.com/code/rquantlib.html) - RQuantLib connects GNU R with QuantLib.
|
||||
- [quantmod](https://cran.r-project.org/web/packages/quantmod/index.html) - Quantitative Financial Modelling Framework.
|
||||
- [Rmetrics](https://www.rmetrics.org) - The premier open source software solution for teaching and training quantitative finance.
|
||||
- [fAsianOptions](https://cran.r-project.org/web/packages/fAsianOptions/index.html) - EBM and Asian Option Valuation.
|
||||
- [fAssets](https://cran.r-project.org/web/packages/fAssets/index.html) - Analysing and Modelling Financial Assets.
|
||||
- [fBasics](https://cran.r-project.org/web/packages/fBasics/index.html) - Markets and Basic Statistics.
|
||||
- [fBonds](https://cran.r-project.org/web/packages/fBonds/index.html) - Bonds and Interest Rate Models.
|
||||
- [fExoticOptions](https://cran.r-project.org/web/packages/fExoticOptions/index.html) - Exotic Option Valuation.
|
||||
- [fOptions](https://cran.r-project.org/web/packages/fOptions/index.html) - Pricing and Evaluating Basic Options.
|
||||
- [fPortfolio](https://cran.r-project.org/web/packages/fPortfolio/index.html) - Portfolio Selection and Optimization.
|
||||
- [portfolio](https://github.com/dgerlanc/portfolio) - Analysing equity portfolios.
|
||||
- [sparseIndexTracking](https://github.com/dppalomar/sparseIndexTracking) - Portfolio design to track an index.
|
||||
- [covFactorModel](https://github.com/dppalomar/covFactorModel) - Covariance matrix estimation via factor models.
|
||||
- [riskParityPortfolio](https://github.com/dppalomar/riskParityPortfolio) - Blazingly fast design of risk parity portfolios.
|
||||
- [sde](https://cran.r-project.org/web/packages/sde/index.html) - Simulation and Inference for Stochastic Differential Equations.
|
||||
- [YieldCurve](https://cran.r-project.org/web/packages/YieldCurve/index.html) - Modelling and estimation of the yield curve.
|
||||
- [SmithWilsonYieldCurve](https://cran.r-project.org/web/packages/SmithWilsonYieldCurve/index.html) - Constructs a yield curve by the Smith-Wilson method from a table of LIBOR and SWAP rates.
|
||||
- [ycinterextra](https://cran.r-project.org/web/packages/ycinterextra/index.html) - Yield curve or zero-coupon prices interpolation and extrapolation.
|
||||
- [AmericanCallOpt](https://cran.r-project.org/web/packages/AmericanCallOpt/index.html) - This package includes pricing function for selected American call options with underlying assets that generate payouts.
|
||||
- [VarSwapPrice](https://cran.r-project.org/web/packages/VarSwapPrice/index.html) - Pricing a variance swap on an equity index.
|
||||
- [RND](https://cran.r-project.org/web/packages/RND/index.html) - Risk Neutral Density Extraction Package.
|
||||
- [LSMonteCarlo](https://cran.r-project.org/web/packages/LSMonteCarlo/index.html) - American options pricing with Least Squares Monte Carlo method.
|
||||
- [OptHedging](https://cran.r-project.org/web/packages/OptHedging/index.html) - Estimation of value and hedging strategy of call and put options.
|
||||
- [tvm](https://cran.r-project.org/web/packages/tvm/index.html) - Time Value of Money Functions.
|
||||
- [OptionPricing](https://cran.r-project.org/web/packages/OptionPricing/index.html) - Option Pricing with Efficient Simulation Algorithms.
|
||||
- [credule](https://github.com/blenezet/credule) - Credit Default Swap Functions.
|
||||
- [derivmkts](https://cran.r-project.org/web/packages/derivmkts/index.html) - Functions and R Code to Accompany Derivatives Markets.
|
||||
- [FinCal](https://github.com/felixfan/FinCal) - Package for time value of money calculation, time series analysis and computational finance.
|
||||
- [r-quant](https://github.com/artyyouth/r-quant) - R code for quantitative analysis in finance.
|
||||
- [options.studies](https://github.com/taylorizing/options.studies) - options trading studies functions for use with options.data package and shiny.
|
||||
- [PortfolioAnalytics](https://github.com/braverock/PortfolioAnalytics) - Portfolio Analysis, Including Numerical Methods for Optimizationof Portfolios.
|
||||
- [fmbasics](https://github.com/imanuelcostigan/fmbasics) - Financial Market Building Blocks.
|
||||
- [R-fixedincome](https://github.com/wilsonfreitas/R-fixedincome) - Fixed income tools for R.
|
||||
|
||||
### Trading
|
||||
|
||||
- [backtest](https://cran.r-project.org/web/packages/backtest/index.html) - Exploring Portfolio-Based Conjectures About Financial Instruments.
|
||||
- [pa](https://cran.r-project.org/web/packages/pa/index.html) - Performance Attribution for Equity Portfolios.
|
||||
- [TTR](https://github.com/joshuaulrich/TTR) - Technical Trading Rules.
|
||||
- [QuantTools](https://quanttools.bitbucket.io/_site/index.html) - Enhanced Quantitative Trading Modelling.
|
||||
- [blotter](https://github.com/braverock/blotter) - Transaction infrastructure for defining instruments, transactions, portfolios and accounts for trading systems and simulation. Provides portfolio support for multi-asset class and multi-currency portfolios. Actively maintained and developed.
|
||||
|
||||
### Backtesting
|
||||
|
||||
- [quantstrat](https://github.com/braverock/quantstrat) - Transaction-oriented infrastructure for constructing trading systems and simulation. Provides support for multi-asset class and multi-currency portfolios for backtesting and other financial research.
|
||||
|
||||
### Risk Analysis
|
||||
|
||||
- [PerformanceAnalytics](https://github.com/braverock/PerformanceAnalytics) - Econometric tools for performance and risk analysis.
|
||||
|
||||
### Factor Analysis
|
||||
|
||||
- [FactorAnalytics](https://github.com/braverock/FactorAnalytics) - The FactorAnalytics package contains fitting and analysis methods for the three main types of factor models used in conjunction with portfolio construction, optimization and risk management, namely fundamental factor models, time series factor models and statistical factor models.
|
||||
- [Expected Returns](https://github.com/JustinMShea/ExpectedReturns) - Solutions for enhancing portfolio diversification and replications of seminal papers with R, most of which are discussed in one of the best investment references of the recent decade, Expected Returns: An Investors Guide to Harvesting Market Rewards by Antti Ilmanen.
|
||||
|
||||
### Time Series
|
||||
|
||||
- [tseries](https://cran.r-project.org/web/packages/tseries/index.html) - Time Series Analysis and Computational Finance.
|
||||
- [fGarch](https://cran.r-project.org/web/packages/fGarch/index.html) - Rmetrics - Autoregressive Conditional Heteroskedastic Modelling.
|
||||
- [timeSeries](https://cran.r-project.org/web/packages/timeSeries/index.html) - Rmetrics - Financial Time Series Objects.
|
||||
- [rugarch](https://github.com/alexiosg/rugarch) - Univariate GARCH Models.
|
||||
- [rmgarch](https://github.com/alexiosg/rmgarch) - Multivariate GARCH Models.
|
||||
- [tidypredict](https://github.com/edgararuiz/tidypredict) - Run predictions inside the database <https://tidypredict.netlify.com/>.
|
||||
- [tidyquant](https://github.com/business-science/tidyquant) - Bringing financial analysis to the tidyverse.
|
||||
- [timetk](https://github.com/business-science/timetk) - A toolkit for working with time series in R.
|
||||
- [tibbletime](https://github.com/business-science/tibbletime) - Built on top of the tidyverse, tibbletime is an extension that allows for the creation of time aware tibbles through the setting of a time index.
|
||||
- [matrixprofile](https://github.com/matrix-profile-foundation/matrixprofile) - Time series data mining library built on top of the novel Matrix Profile data structure and algorithms.
|
||||
- [garchmodels](https://github.com/AlbertoAlmuinha/garchmodels) - A parsnip backend for GARCH models.
|
||||
|
||||
### Calendars
|
||||
|
||||
- [timeDate](https://cran.r-project.org/web/packages/timeDate/index.html) - Chronological and Calendar Objects
|
||||
- [bizdays](https://github.com/wilsonfreitas/R-bizdays) - Business days calculations and utilities
|
||||
|
||||
## Matlab
|
||||
|
||||
### FrameWorks
|
||||
|
||||
- [QUANTAXIS](https://github.com/yutiansut/quantaxis) - Integrated Quantitative Toolbox with Matlab.
|
||||
|
||||
## Julia
|
||||
|
||||
- [QuantLib.jl](https://github.com/pazzo83/QuantLib.jl) - Quantlib implementation in pure Julia.
|
||||
- [Ito.jl](https://github.com/aviks/Ito.jl) - A Julia package for quantitative finance.
|
||||
- [TALib.jl](https://github.com/femtotrader/TALib.jl) - A Julia wrapper for TA-Lib.
|
||||
- [IncTA.jl](https://github.com/femtotrader/IncTA.jl) - Julia Incremental Technical Analysis Indicators
|
||||
- [Miletus.jl](https://github.com/JuliaComputing/Miletus.jl) - A financial contract definition, modeling language, and valuation framework.
|
||||
- [Temporal.jl](https://github.com/dysonance/Temporal.jl) - Flexible and efficient time series class & methods.
|
||||
- [Indicators.jl](https://github.com/dysonance/Indicators.jl) - Financial market technical analysis & indicators on top of Temporal.
|
||||
- [Strategems.jl](https://github.com/dysonance/Strategems.jl) - Quantitative systematic trading strategy development and backtesting.
|
||||
- [TimeSeries.jl](https://github.com/JuliaStats/TimeSeries.jl) - Time series toolkit for Julia.
|
||||
- [MarketTechnicals.jl](https://github.com/JuliaQuant/MarketTechnicals.jl) - Technical analysis of financial time series on top of TimeSeries.
|
||||
- [MarketData.jl](https://github.com/JuliaQuant/MarketData.jl) - Time series market data.
|
||||
- [TimeFrames.jl](https://github.com/femtotrader/TimeFrames.jl) - A Julia library that defines TimeFrame (essentially for resampling TimeSeries).
|
||||
- [DataFrames.jl](https://github.com/JuliaData/DataFrames.jl) - In-memory tabular data in Julia
|
||||
- [TSFrames.jl](https://github.com/xKDR/TSFrames.jl) - Handle timeseries data on top of the powerful and mature DataFrames.jl
|
||||
|
||||
## Java
|
||||
|
||||
- [Strata](http://strata.opengamma.io/) - Modern open-source analytics and market risk library designed and written in Java.
|
||||
- [JQuantLib](http://www.jquantlib.org) - JQuantLib is a free, open-source, comprehensive framework for quantitative finance, written in 100% Java.
|
||||
- [finmath.net](http://finmath.net) - Java library with algorithms and methodologies related to mathematical finance.
|
||||
- [quantcomponents](https://github.com/lsgro/quantcomponents) - Free Java components for Quantitative Finance and Algorithmic Trading.
|
||||
- [DRIP](https://lakshmidrip.github.io/DRIP) - Fixed Income, Asset Allocation, Transaction Cost Analysis, XVA Metrics Libraries.
|
||||
- [ta4j](https://github.com/ta4j/ta4j) - A Java library for technical analysis.
|
||||
|
||||
## JavaScript
|
||||
|
||||
- [finance.js](https://github.com/ebradyjobory/finance.js) - A JavaScript library for common financial calculations.
|
||||
- [portfolio-allocation](https://github.com/lequant40/portfolio_allocation_js) - PortfolioAllocation is a JavaScript library designed to help constructing financial portfolios made of several assets: bonds, commodities, cryptocurrencies, currencies, exchange traded funds (ETFs), mutual funds, stocks...
|
||||
- [Ghostfolio](https://github.com/ghostfolio/ghostfolio) - Wealth management software to keep track of financial assets like stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.
|
||||
- [IndicatorTS](https://github.com/cinar/indicatorts) - Indicator is a TypeScript module providing various stock technical analysis indicators, strategies, and a backtest framework for trading.
|
||||
- [ccxt](https://github.com/ccxt/ccxt) - A JavaScript / Python / PHP cryptocurrency trading API with support for more than 100 bitcoin/altcoin exchanges.
|
||||
- [PENDAX](https://github.com/CompendiumFi/PENDAX-SDK) - Javascript SDK for Trading/Data API and Websockets for FTX, FTXUS, OKX, Bybit, & More.
|
||||
|
||||
### Data Visualization
|
||||
|
||||
- [QUANTAXIS_Webkit](https://github.com/yutiansut/QUANTAXIS_Webkit) - An awesome visualization center based on quantaxis.
|
||||
|
||||
## Haskell
|
||||
|
||||
- [quantfin](https://github.com/boundedvariation/quantfin) - quant finance in pure haskell.
|
||||
- [Haxcel](https://github.com/MarcusRainbow/Haxcel) - Excel Addin for Haskell.
|
||||
- [Ffinar](https://github.com/MarcusRainbow/Ffinar) - A financial maths library in Haskell.
|
||||
|
||||
## Scala
|
||||
|
||||
- [QuantScale](https://github.com/choucrifahed/quantscale) - Scala Quantitative Finance Library.
|
||||
- [Scala Quant](https://github.com/frankcash/Scala-Quant) - Scala library for working with stock data from IFTTT recipes or Google Finance.
|
||||
|
||||
## Ruby
|
||||
|
||||
- [Jiji](https://github.com/unageanu/jiji2) - Open Source Forex algorithmic trading framework using OANDA REST API.
|
||||
|
||||
## Elixir/Erlang
|
||||
|
||||
- [Tai](https://github.com/fremantle-capital/tai) - Open Source composable, real time, market data and trade execution toolkit.
|
||||
- [Workbench](https://github.com/fremantle-industries/workbench) - From Idea to Execution - Manage your trading operation across a globally distributed cluster
|
||||
- [Prop](https://github.com/fremantle-industries/prop) - An open and opinionated trading platform using productive & familiar open source libraries and tools for strategy research, execution and operation.
|
||||
|
||||
## Golang
|
||||
|
||||
- [Kelp](https://github.com/stellar/kelp) - Kelp is an open-source Golang algorithmic cryptocurrency trading bot that runs on centralized exchanges and Stellar DEX (command-line usage and desktop GUI).
|
||||
- [marketstore](https://github.com/alpacahq/marketstore) - DataFrame Server for Financial Timeseries Data.
|
||||
- [IndicatorGo](https://github.com/cinar/indicator) - IndicatorGo is a Golang module providing various stock technical analysis indicators, strategies, and a backtest framework for trading.
|
||||
|
||||
## CPP
|
||||
|
||||
- [TradeFrame](https://github.com/rburkholder/trade-frame) - C++ 17 based framework/library (with sample applications) for testing options based automated trading ideas using DTN IQ real time data feed and Interactive Brokers (TWS API) for trade execution. Comes with built-in [Option Greeks/IV](https://github.com/rburkholder/trade-frame/tree/master/lib/TFOptions) calculation library.
|
||||
|
||||
## Frameworks
|
||||
|
||||
- [QuantLib](https://www.quantlib.org) - The QuantLib project is aimed at providing a comprehensive software framework for quantitative finance.
|
||||
- [JQuantLib](http://www.jquantlib.org) - Java port.
|
||||
- [RQuantLib](http://dirk.eddelbuettel.com/code/rquantlib.html) - R port.
|
||||
- [QuantLibAddin](https://www.quantlib.org/quantlibaddin/) - Excel support.
|
||||
- [QuantLibXL](https://www.quantlib.org/quantlibxl/) - Excel support.
|
||||
- [QLNet](https://github.com/amaggiulli/qlnet) - .Net port.
|
||||
- [PyQL](https://github.com/enthought/pyql) - Python port.
|
||||
- [QuantLib.jl](https://github.com/pazzo83/QuantLib.jl) - Julia port.
|
||||
- [QuantLib-Python Documentation](https://quantlib-python-docs.readthedocs.io/) - Documentation for the Python bindings for the QuantLib library
|
||||
- [QuantLib with Automatic Differention enabled](https://github.com/auto-differentiation/quantlib-xad) - Integration of Automatic Differentiation with the QuantLib library
|
||||
- [TA-Lib](https://ta-lib.org) - perform technical analysis of financial market data.
|
||||
- [ta-lib-python](https://github.com/TA-Lib/ta-lib-python)
|
||||
- [ta-lib](https://github.com/TA-Lib/ta-lib)
|
||||
- [Portfolio Optimizer](https://portfoliooptimizer.io/) - Portfolio Optimizer is a Web API for portfolio analysis and optimization.
|
||||
|
||||
|
||||
## CSharp
|
||||
|
||||
- [QuantConnect](https://github.com/QuantConnect/Lean) - Lean Engine is an open-source fully managed C# algorithmic trading engine built for desktop and cloud usage.
|
||||
- [StockSharp](https://github.com/StockSharp/StockSharp) - Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options).
|
||||
- [TDAmeritrade.DotNetCore](https://github.com/NVentimiglia/TDAmeritrade.DotNetCore) - Free, open-source .NET Client for the TD Ameritrade Trading Platform. Helps developers integrate TD Ameritrade API into custom trading solutions.
|
||||
|
||||
## Rust
|
||||
|
||||
- [QuantMath](https://github.com/MarcusRainbow/QuantMath) - Financial maths library for risk-neutral pricing and risk
|
||||
- [Barter](https://github.com/barter-rs/barter-rs) - Open-source Rust framework for building event-driven live-trading & backtesting systems
|
||||
- [LFEST](https://github.com/MathisWellmann/lfest-rs) - Simulated perpetual futures exchange to trade your strategy against.
|
||||
- [TradeAggregation](https://github.com/MathisWellmann/trade_aggregation-rs) - Aggregate trades into user-defined candles using information driven rules.
|
||||
- [SlidingFeatures](https://github.com/MathisWellmann/sliding_features-rs) - Chainable tree-like sliding windows for signal processing and technical analysis.
|
||||
- [RustQuant](https://github.com/avhz/RustQuant) - Quantitative finance library written in Rust.
|
||||
- [finalytics](https://github.com/Nnamdi-sys/finalytics) - A rust library for financial data analysis.
|
||||
|
||||
|
||||
## Reproducing Works, Training & Books
|
||||
|
||||
- [Derman Papers](https://github.com/MarcosCarreira/DermanPapers) - Notebooks that replicate original quantitative finance papers from Emanuel Derman.
|
||||
- [ML-Quant](https://www.ml-quant.com/) - Top Quant resources like ArXiv (sanity), SSRN, RePec, Journals, Podcasts, Videos, and Blogs.
|
||||
- [volatility-trading](https://github.com/jasonstrimpel/volatility-trading) - A complete set of volatility estimators based on Euan Sinclair's Volatility Trading.
|
||||
- [quant](https://github.com/paulperry/quant) - Quantitative Finance and Algorithmic Trading exhaust; mostly ipython notebooks based on Quantopian, Zipline, or Pandas.
|
||||
- [fecon235](https://github.com/rsvp/fecon235) - Open source project for software tools in financial economics. Many jupyter notebook to verify theoretical ideas and practical methods interactively.
|
||||
- [Quantitative-Notebooks](https://github.com/LongOnly/Quantitative-Notebooks) - Educational notebooks on quantitative finance, algorithmic trading, financial modelling and investment strategy
|
||||
- [QuantEcon](https://quantecon.org/) - Lecture series on economics, finance, econometrics and data science; QuantEcon.py, QuantEcon.jl, notebooks
|
||||
- [FinanceHub](https://github.com/Finance-Hub/FinanceHub) - Resources for Quantitative Finance
|
||||
- [Python_Option_Pricing](https://github.com/dedwards25/Python_Option_Pricing) - An libary to price financial options written in Python. Includes: Black Scholes, Black 76, Implied Volatility, American, European, Asian, Spread Options.
|
||||
- [python-training](https://github.com/jpmorganchase/python-training) - J.P. Morgan's Python training for business analysts and traders.
|
||||
- [Stock_Analysis_For_Quant](https://github.com/LastAncientOne/Stock_Analysis_For_Quant) - Different Types of Stock Analysis in Excel, Matlab, Power BI, Python, R, and Tableau.
|
||||
- [algorithmic-trading-with-python](https://github.com/chrisconlan/algorithmic-trading-with-python) - Source code for Algorithmic Trading with Python (2020) by Chris Conlan.
|
||||
- [MEDIUM_NoteBook](https://github.com/cerlymarco/MEDIUM_NoteBook) - Repository containing notebooks of [cerlymarco](https://github.com/cerlymarco)'s posts on Medium.
|
||||
- [QuantFinance](https://github.com/PythonCharmers/QuantFinance) - Training materials in quantitative finance.
|
||||
- [IPythonScripts](https://github.com/mgroncki/IPythonScripts) - Tutorials about Quantitative Finance in Python and QuantLib: Pricing, xVAs, Hedging, Portfolio Optimisation, Machine Learning and Deep Learning.
|
||||
- [Computational-Finance-Course](https://github.com/LechGrzelak/Computational-Finance-Course) - Materials for the course of Computational Finance.
|
||||
- [Machine-Learning-for-Asset-Managers](https://github.com/emoen/Machine-Learning-for-Asset-Managers) - Implementation of code snippets, exercises and application to live data from Machine Learning for Asset Managers (Elements in Quantitative Finance) written by Prof. Marcos López de Prado.
|
||||
- [Python-for-Finance-Cookbook](https://github.com/PacktPublishing/Python-for-Finance-Cookbook) - Python for Finance Cookbook, published by Packt.
|
||||
- [modelos_vol_derivativos](https://github.com/ysaporito/modelos_vol_derivativos) - "Modelos de Volatilidade para Derivativos" book's Jupyter notebooks
|
||||
- [NMOF](https://github.com/enricoschumann/NMOF) - Functions, examples and data from the first and the second edition of "Numerical Methods and Optimization in Finance" by M. Gilli, D. Maringer and E. Schumann (2019, ISBN:978-0128150658).
|
||||
- [py4fi2nd](https://github.com/yhilpisch/py4fi2nd) - Jupyter Notebooks and code for Python for Finance (2nd ed., O'Reilly) by Yves Hilpisch.
|
||||
- [aiif](https://github.com/yhilpisch/aiif) - Jupyter Notebooks and code for the book Artificial Intelligence in Finance (O'Reilly) by Yves Hilpisch.
|
||||
- [py4at](https://github.com/yhilpisch/py4at) - Jupyter Notebooks and code for the book Python for Algorithmic Trading (O'Reilly) by Yves Hilpisch.
|
||||
- [dawp](https://github.com/yhilpisch/dawp) - Jupyter Notebooks and code for Derivatives Analytics with Python (Wiley Finance) by Yves Hilpisch.
|
||||
- [dx](https://github.com/yhilpisch/dx) - DX Analytics | Financial and Derivatives Analytics with Python.
|
||||
- [QuantFinanceBook](https://github.com/LechGrzelak/QuantFinanceBook) - Quantitative Finance book.
|
||||
- [rough_bergomi](https://github.com/ryanmccrickerd/rough_bergomi) - A Python implementation of the rough Bergomi model.
|
||||
- [frh-fx](https://github.com/ryanmccrickerd/frh-fx) - A python implementation of the fast-reversion Heston model of Mechkov for FX purposes.
|
||||
- [Value Investing Studies](https://github.com/euclidjda/value-investing-studies) - A collection of data analysis studies that examine the performance and characteristics of value investing over long periods of time.
|
||||
- [Machine Learning Asset Management](https://github.com/firmai/machine-learning-asset-management) - Machine Learning in Asset Management (by @firmai).
|
||||
- [Deep Learning Machine Learning Stock](https://github.com/LastAncientOne/Deep-Learning-Machine-Learning-Stock) - Deep Learning and Machine Learning stocks represent a promising long-term or short-term opportunity for investors and traders.
|
||||
- [Technical Analysis and Feature Engineering](https://github.com/jo-cho/Technical_Analysis_and_Feature_Engineering) - Feature Engineering and Feature Importance of Machine Learning in Financial Market.
|
||||
- [Differential Machine Learning and Axes that matter by Brian Huge and Antoine Savine](https://github.com/differential-machine-learning/notebooks) - Implement, demonstrate, reproduce and extend the results of the Risk articles 'Differential Machine Learning' (2020) and 'PCA with a Difference' (2021) by Huge and Savine, and cover implementation details left out from the papers.
|
||||
- [systematictradingexamples](https://github.com/robcarver17/systematictradingexamples) - Examples of code related to book [Systematic Trading](www.systematictrading.org) and [blog](http://qoppac.blogspot.com)
|
||||
- [pysystemtrade_examples](https://github.com/robcarver17/pysystemtrade_examples) - Examples using pysystemtrade for Robert Carver's [blog](http://qoppac.blogspot.com).
|
||||
- [ML_Finance_Codes](https://github.com/mfrdixon/ML_Finance_Codes) - Machine Learning in Finance: From Theory to Practice Book
|
||||
- [Hands-On Machine Learning for Algorithmic Trading](https://github.com/packtpublishing/hands-on-machine-learning-for-algorithmic-trading) - Hands-On Machine Learning for Algorithmic Trading, published by Packt
|
||||
- [financialnoob-misc](https://github.com/financialnoob/misc) - Codes from @financialnoob's posts
|
||||
- [MesoSim Options Trading Strategy Library](https://github.com/deltaray-io/strategy-library) - Free and public Options Trading strategy library for MesoSim.
|
||||
- [Quant-Finance-With-Python-Code](https://github.com/lingyixu/Quant-Finance-With-Python-Code) - Repo for code examples in Quantitative Finance with Python by Chris Kelliher
|
||||
- [QuantFinanceTraining](https://github.com/JoaoJungblut/QuantFinanceTraining) - This repository contains codes that were executed during my training in the CQF (Certificate in Quantitative Finance). The codes are organized by class, facilitating navigation and reference.
|
||||
- [Statistical-Learning-based-Portfolio-Optimization](https://github.com/YannickKae/Statistical-Learning-based-Portfolio-Optimization) - This R Shiny App utilizes the Hierarchical Equal Risk Contribution (HERC) approach, a modern portfolio optimization method developed by Raffinot (2018).
|
||||
@@ -0,0 +1,385 @@
|
||||
project,section,last_commit,url,description,github,cran,repo
|
||||
numpy,Python > Numerical Libraries & Data Structures,,https://www.numpy.org,NumPy is the fundamental package for scientific computing with Python.,False,False,
|
||||
scipy,Python > Numerical Libraries & Data Structures,,https://www.scipy.org,"SciPy (pronounced “Sigh Pie”) is a Python-based ecosystem of open-source software for mathematics, science, and engineering.",False,False,
|
||||
pandas,Python > Numerical Libraries & Data Structures,,https://pandas.pydata.org,"pandas is an open source, BSD-licensed library providing high-performance, easy-to-use data structures and data analysis tools for the Python programming language.",False,False,
|
||||
quantdsl,Python > Numerical Libraries & Data Structures,2017-10-26,https://github.com/johnbywater/quantdsl,Domain specific language for quantitative analytics in finance and trading.,True,False,johnbywater/quantdsl
|
||||
statistics,Python > Numerical Libraries & Data Structures,,https://docs.python.org/3/library/statistics.html,Builtin Python library for all basic statistical calculations.,False,False,
|
||||
sympy,Python > Numerical Libraries & Data Structures,,https://www.sympy.org/,SymPy is a Python library for symbolic mathematics.,False,False,
|
||||
pymc3,Python > Numerical Libraries & Data Structures,,https://docs.pymc.io/,Probabilistic Programming in Python: Bayesian Modeling and Probabilistic Machine Learning with Theano.,False,False,
|
||||
modelx,Python > Numerical Libraries & Data Structures,,https://docs.modelx.io/,Python reimagination of spreadsheets as formula-centric objects that are interoperable with pandas.,False,False,
|
||||
ArcticDB,Python > Numerical Libraries & Data Structures,2024-02-17,https://github.com/man-group/ArcticDB,High performance datastore for time series and tick data.,True,False,man-group/ArcticDB
|
||||
OpenBB Terminal,Python > Financial Instruments and Pricing,2024-02-15,https://github.com/OpenBB-finance/OpenBBTerminal,Terminal for investment research for everyone.,True,False,OpenBB-finance/OpenBBTerminal
|
||||
PyQL,Python > Financial Instruments and Pricing,2023-11-08,https://github.com/enthought/pyql,QuantLib's Python port.,True,False,enthought/pyql
|
||||
pyfin,Python > Financial Instruments and Pricing,2014-12-03,https://github.com/opendoor-labs/pyfin,Basic options pricing in Python. *ARCHIVED*,True,False,opendoor-labs/pyfin
|
||||
vollib,Python > Financial Instruments and Pricing,2023-04-01,https://github.com/vollib/vollib,"vollib is a python library for calculating option prices, implied volatility and greeks.",True,False,vollib/vollib
|
||||
QuantPy,Python > Financial Instruments and Pricing,2017-11-28,https://github.com/jsmidt/QuantPy,A framework for quantitative finance In python.,True,False,jsmidt/QuantPy
|
||||
Finance-Python,Python > Financial Instruments and Pricing,2024-01-01,https://github.com/alpha-miner/Finance-Python,Python tools for Finance.,True,False,alpha-miner/Finance-Python
|
||||
ffn,Python > Financial Instruments and Pricing,2023-12-31,https://github.com/pmorissette/ffn,A financial function library for Python.,True,False,pmorissette/ffn
|
||||
pynance,Python > Financial Instruments and Pricing,2021-02-03,https://github.com/GriffinAustin/pynance,Lightweight Python library for assembling and analysing financial data.,True,False,GriffinAustin/pynance
|
||||
tia,Python > Financial Instruments and Pricing,2017-06-05,https://github.com/bpsmith/tia,Toolkit for integration and analysis.,True,False,bpsmith/tia
|
||||
hasura/base-python-dash,Python > Financial Instruments and Pricing,,https://platform.hasura.io/hub/projects/hasura/base-python-dash,"Hasura quickstart to deploy Dash framework. Written on top of Flask, Plotly.js, and React.js, Dash is ideal for building data visualization apps with highly custom user interfaces in pure Python.",False,False,
|
||||
hasura/base-python-bokeh,Python > Financial Instruments and Pricing,,https://platform.hasura.io/hub/projects/hasura/base-python-bokeh,Hasura quickstart to visualize data with bokeh library.,False,False,
|
||||
pysabr,Python > Financial Instruments and Pricing,2022-04-21,https://github.com/ynouri/pysabr,SABR model Python implementation.,True,False,ynouri/pysabr
|
||||
FinancePy,Python > Financial Instruments and Pricing,2024-02-13,https://github.com/domokane/FinancePy,"A Python Finance Library that focuses on the pricing and risk-management of Financial Derivatives, including fixed-income, equity, FX and credit derivatives.",True,False,domokane/FinancePy
|
||||
gs-quant,Python > Financial Instruments and Pricing,2024-02-16,https://github.com/goldmansachs/gs-quant,Python toolkit for quantitative finance,True,False,goldmansachs/gs-quant
|
||||
willowtree,Python > Financial Instruments and Pricing,2018-07-14,https://github.com/federicomariamassari/willowtree,Robust and flexible Python implementation of the willow tree lattice for derivatives pricing.,True,False,federicomariamassari/willowtree
|
||||
financial-engineering,Python > Financial Instruments and Pricing,2017-11-20,https://github.com/federicomariamassari/financial-engineering,"Applications of Monte Carlo methods to financial engineering projects, in Python.",True,False,federicomariamassari/financial-engineering
|
||||
optlib,Python > Financial Instruments and Pricing,2022-11-18,https://github.com/dbrojas/optlib,A library for financial options pricing written in Python.,True,False,dbrojas/optlib
|
||||
tf-quant-finance,Python > Financial Instruments and Pricing,2023-08-15,https://github.com/google/tf-quant-finance,High-performance TensorFlow library for quantitative finance.,True,False,google/tf-quant-finance
|
||||
Q-Fin,Python > Financial Instruments and Pricing,2023-04-07,https://github.com/RomanMichaelPaolucci/Q-Fin,A Python library for mathematical finance.,True,False,RomanMichaelPaolucci/Q-Fin
|
||||
Quantsbin,Python > Financial Instruments and Pricing,2021-05-23,https://github.com/quantsbin/Quantsbin,"Tools for pricing and plotting of vanilla option prices, greeks and various other analysis around them.",True,False,quantsbin/Quantsbin
|
||||
finoptions,Python > Financial Instruments and Pricing,2024-02-01,https://github.com/bbcho/finoptions-dev,Complete python implementation of R package fOptions with partial implementation of fExoticOptions for pricing various options.,True,False,bbcho/finoptions-dev
|
||||
pypme,Python > Financial Instruments and Pricing,2023-06-27,https://github.com/ymyke/pypme,PME (Public Market Equivalent) calculation.,True,False,ymyke/pypme
|
||||
AbsBox,Python > Financial Instruments and Pricing,2024-02-16,https://github.com/yellowbean/AbsBox,A Python based library to model cashflow for structured product like Asset-backed securities (ABS) and Mortgage-backed securities (MBS).,True,False,yellowbean/AbsBox
|
||||
Intrinsic-Value-Calculator,Python > Financial Instruments and Pricing,2023-08-08,https://github.com/akashaero/Intrinsic-Value-Calculator,A Python tool for quick calculations of a stock's fair value using Discounted Cash Flow analysis.,True,False,akashaero/Intrinsic-Value-Calculator
|
||||
Kelly-Criterion,Python > Financial Instruments and Pricing,2019-02-16,https://github.com/deltaray-io/kelly-criterion,Kelly Criterion implemented in Python to size portfolios based on J. L. Kelly Jr's formula.,True,False,deltaray-io/kelly-criterion
|
||||
pandas_talib,Python > Indicators,2018-05-30,https://github.com/femtotrader/pandas_talib,A Python Pandas implementation of technical analysis indicators.,True,False,femtotrader/pandas_talib
|
||||
finta,Python > Indicators,2022-07-24,https://github.com/peerchemist/finta,Common financial technical analysis indicators implemented in Pandas.,True,False,peerchemist/finta
|
||||
Tulipy,Python > Indicators,2019-04-11,https://github.com/cirla/tulipy,Financial Technical Analysis Indicator Library (Python bindings for [tulipindicators](https://github.com/TulipCharts/tulipindicators)),True,False,cirla/tulipy
|
||||
lppls,Python > Indicators,2024-02-15,https://github.com/Boulder-Investment-Technologies/lppls,A Python module for fitting the [Log-Periodic Power Law Singularity (LPPLS)](https://en.wikipedia.org/wiki/Didier_Sornette#The_JLS_and_LPPLS_models) model.,True,False,Boulder-Investment-Technologies/lppls
|
||||
skfolio,Python > Trading & Backtesting,2024-02-14,https://github.com/skfolio/skfolio,"Python library for portfolio optimization built on top of scikit-learn. It provides a unified interface and sklearn compatible tools to build, tune and cross-validate portfolio models.",True,False,skfolio/skfolio
|
||||
Investing algorithm framework,Python > Trading & Backtesting,2024-02-13,https://github.com/coding-kitties/investing-algorithm-framework,"Framework for developing, backtesting, and deploying automated trading algorithms.",True,False,coding-kitties/investing-algorithm-framework
|
||||
QSTrader,Python > Trading & Backtesting,2024-02-07,https://github.com/mhallsmoore/qstrader,QSTrader backtesting simulation engine.,True,False,mhallsmoore/qstrader
|
||||
Blankly,Python > Trading & Backtesting,2023-12-23,https://github.com/Blankly-Finance/Blankly,"Fully integrated backtesting, paper trading, and live deployment.",True,False,Blankly-Finance/Blankly
|
||||
TA-Lib,Python > Trading & Backtesting,2024-02-14,https://github.com/mrjbq7/ta-lib,Python wrapper for TA-Lib (<http://ta-lib.org/>).,True,False,mrjbq7/ta-lib
|
||||
zipline,Python > Trading & Backtesting,2020-10-14,https://github.com/quantopian/zipline,Pythonic algorithmic trading library.,True,False,quantopian/zipline
|
||||
QuantSoftware Toolkit,Python > Trading & Backtesting,2016-10-07,https://github.com/QuantSoftware/QuantSoftwareToolkit,Python-based open source software framework designed to support portfolio construction and management.,True,False,QuantSoftware/QuantSoftwareToolkit
|
||||
quantitative,Python > Trading & Backtesting,2019-03-03,https://github.com/jeffrey-liang/quantitative,"Quantitative finance, and backtesting library.",True,False,jeffrey-liang/quantitative
|
||||
analyzer,Python > Trading & Backtesting,2015-12-22,https://github.com/llazzaro/analyzer,Python framework for real-time financial and backtesting trading strategies.,True,False,llazzaro/analyzer
|
||||
bt,Python > Trading & Backtesting,2024-02-05,https://github.com/pmorissette/bt,Flexible Backtesting for Python.,True,False,pmorissette/bt
|
||||
backtrader,Python > Trading & Backtesting,2023-04-19,https://github.com/backtrader/backtrader,Python Backtesting library for trading strategies.,True,False,backtrader/backtrader
|
||||
pythalesians,Python > Trading & Backtesting,2016-09-23,https://github.com/thalesians/pythalesians,"Python library to backtest trading strategies, plot charts, seamlessly download market data, analyse market patterns etc.",True,False,thalesians/pythalesians
|
||||
pybacktest,Python > Trading & Backtesting,2019-09-09,https://github.com/ematvey/pybacktest,"Vectorized backtesting framework in Python / pandas, designed to make your backtesting easier.",True,False,ematvey/pybacktest
|
||||
pyalgotrade,Python > Trading & Backtesting,2023-03-05,https://github.com/gbeced/pyalgotrade,Python Algorithmic Trading Library.,True,False,gbeced/pyalgotrade
|
||||
basana,Python > Trading & Backtesting,2024-01-07,https://github.com/gbeced/basana,"A Python async and event driven framework for algorithmic trading, with a focus on crypto currencies.",True,False,gbeced/basana
|
||||
tradingWithPython,Python > Trading & Backtesting,,https://pypi.org/project/tradingWithPython/,A collection of functions and classes for Quantitative trading.,False,False,
|
||||
Pandas TA,Python > Trading & Backtesting,2022-09-24,https://github.com/twopirllc/pandas-ta,Pandas TA is an easy to use Python 3 Pandas Extension with 115+ Indicators. Easily build Custom Strategies.,True,False,twopirllc/pandas-ta
|
||||
ta,Python > Trading & Backtesting,2023-11-02,https://github.com/bukosabino/ta,Technical Analysis Library using Pandas (Python),True,False,bukosabino/ta
|
||||
algobroker,Python > Trading & Backtesting,2016-03-31,https://github.com/joequant/algobroker,This is an execution engine for algo trading.,True,False,joequant/algobroker
|
||||
pysentosa,Python > Trading & Backtesting,,https://pypi.org/project/pysentosa/,Python API for sentosa trading system.,False,False,
|
||||
finmarketpy,Python > Trading & Backtesting,2024-01-01,https://github.com/cuemacro/finmarketpy,Python library for backtesting trading strategies and analyzing financial markets.,True,False,cuemacro/finmarketpy
|
||||
binary-martingale,Python > Trading & Backtesting,2017-10-16,https://github.com/metaperl/binary-martingale,Computer program to automatically trade binary options martingale style.,True,False,metaperl/binary-martingale
|
||||
fooltrader,Python > Trading & Backtesting,2020-07-19,https://github.com/foolcage/fooltrader,the project using big-data technology to provide an uniform way to analyze the whole market.,True,False,foolcage/fooltrader
|
||||
zvt,Python > Trading & Backtesting,2024-02-05,https://github.com/zvtvz/zvt,"the project using sql,pandas to provide an uniform and extendable way to record data,computing factors,select securites, backtesting,realtime trading and it could show all of them in clearly charts in realtime.",True,False,zvtvz/zvt
|
||||
pylivetrader,Python > Trading & Backtesting,2022-04-11,https://github.com/alpacahq/pylivetrader,zipline-compatible live trading library.,True,False,alpacahq/pylivetrader
|
||||
pipeline-live,Python > Trading & Backtesting,2022-04-11,https://github.com/alpacahq/pipeline-live,zipline's pipeline capability with IEX for live trading.,True,False,alpacahq/pipeline-live
|
||||
zipline-extensions,Python > Trading & Backtesting,2018-09-17,https://github.com/quantrocket-llc/zipline-extensions,Zipline extensions and adapters for QuantRocket.,True,False,quantrocket-llc/zipline-extensions
|
||||
moonshot,Python > Trading & Backtesting,2023-12-28,https://github.com/quantrocket-llc/moonshot,Vectorized backtester and trading engine for QuantRocket based on Pandas.,True,False,quantrocket-llc/moonshot
|
||||
PyPortfolioOpt,Python > Trading & Backtesting,2023-12-06,https://github.com/robertmartin8/PyPortfolioOpt,"Financial portfolio optimisation in python, including classical efficient frontier and advanced methods.",True,False,robertmartin8/PyPortfolioOpt
|
||||
Eiten,Python > Trading & Backtesting,2020-09-21,https://github.com/tradytics/eiten,"Eiten is an open source toolkit by Tradytics that implements various statistical and algorithmic investing strategies such as Eigen Portfolios, Minimum Variance Portfolios, Maximum Sharpe Ratio Portfolios, and Genetic Algorithms based Portfolios.",True,False,tradytics/eiten
|
||||
riskparity.py,Python > Trading & Backtesting,2024-02-10,https://github.com/dppalomar/riskparity.py,fast and scalable design of risk parity portfolios with TensorFlow 2.0,True,False,dppalomar/riskparity.py
|
||||
mlfinlab,Python > Trading & Backtesting,2021-12-01,https://github.com/hudson-and-thames/mlfinlab,"Implementations regarding ""Advances in Financial Machine Learning"" by Marcos Lopez de Prado. (Feature Engineering, Financial Data Structures, Meta-Labeling)",True,False,hudson-and-thames/mlfinlab
|
||||
pyqstrat,Python > Trading & Backtesting,2023-11-05,https://github.com/abbass2/pyqstrat,"A fast, extensible, transparent python library for backtesting quantitative strategies.",True,False,abbass2/pyqstrat
|
||||
NowTrade,Python > Trading & Backtesting,2017-02-07,https://github.com/edouardpoitras/NowTrade,Python library for backtesting technical/mechanical strategies in the stock and currency markets.,True,False,edouardpoitras/NowTrade
|
||||
pinkfish,Python > Trading & Backtesting,2023-12-30,https://github.com/fja05680/pinkfish,A backtester and spreadsheet library for security analysis.,True,False,fja05680/pinkfish
|
||||
aat,Python > Trading & Backtesting,2023-09-11,https://github.com/timkpaine/aat,Async Algorithmic Trading Engine,True,False,timkpaine/aat
|
||||
Backtesting.py,Python > Trading & Backtesting,,https://kernc.github.io/backtesting.py/,Backtest trading strategies in Python,False,False,
|
||||
catalyst,Python > Trading & Backtesting,2021-09-22,https://github.com/enigmampc/catalyst,An Algorithmic Trading Library for Crypto-Assets in Python,True,False,enigmampc/catalyst
|
||||
quantstats,Python > Trading & Backtesting,2023-07-06,https://github.com/ranaroussi/quantstats,"Portfolio analytics for quants, written in Python",True,False,ranaroussi/quantstats
|
||||
qtpylib,Python > Trading & Backtesting,2021-03-24,https://github.com/ranaroussi/qtpylib,"QTPyLib, Pythonic Algorithmic Trading <http://qtpylib.io>",True,False,ranaroussi/qtpylib
|
||||
Quantdom,Python > Trading & Backtesting,2019-03-12,https://github.com/constverum/Quantdom,Python-based framework for backtesting trading strategies & analyzing financial markets [GUI :neckbeard:],True,False,constverum/Quantdom
|
||||
freqtrade,Python > Trading & Backtesting,2024-02-17,https://github.com/freqtrade/freqtrade,"Free, open source crypto trading bot",True,False,freqtrade/freqtrade
|
||||
algorithmic-trading-with-python,Python > Trading & Backtesting,2021-06-01,https://github.com/chrisconlan/algorithmic-trading-with-python,"Free `pandas` and `scikit-learn` resources for trading simulation, backtesting, and machine learning on financial data.",True,False,chrisconlan/algorithmic-trading-with-python
|
||||
DeepDow,Python > Trading & Backtesting,2024-01-24,https://github.com/jankrepl/deepdow,Portfolio optimization with deep learning,True,False,jankrepl/deepdow
|
||||
Qlib,Python > Trading & Backtesting,2023-11-21,https://github.com/microsoft/qlib,"An AI-oriented Quantitative Investment Platform by Microsoft. Full ML pipeline of data processing, model training, back-testing; and covers the entire chain of quantitative investment: alpha seeking, risk modeling, portfolio optimization, and order execution.",True,False,microsoft/qlib
|
||||
machine-learning-for-trading,Python > Trading & Backtesting,2023-03-05,https://github.com/stefan-jansen/machine-learning-for-trading,Code and resources for Machine Learning for Algorithmic Trading,True,False,stefan-jansen/machine-learning-for-trading
|
||||
AlphaPy,Python > Trading & Backtesting,2024-02-10,https://github.com/ScottfreeLLC/AlphaPy,"Automated Machine Learning [AutoML] with Python, scikit-learn, Keras, XGBoost, LightGBM, and CatBoost",True,False,ScottfreeLLC/AlphaPy
|
||||
jesse,Python > Trading & Backtesting,2024-01-01,https://github.com/jesse-ai/jesse,An advanced crypto trading bot written in Python,True,False,jesse-ai/jesse
|
||||
rqalpha,Python > Trading & Backtesting,2024-01-22,https://github.com/ricequant/rqalpha,"A extendable, replaceable Python algorithmic backtest && trading framework supporting multiple securities.",True,False,ricequant/rqalpha
|
||||
FinRL-Library,Python > Trading & Backtesting,2024-02-14,https://github.com/AI4Finance-LLC/FinRL-Library,A Deep Reinforcement Learning Library for Automated Trading in Quantitative Finance. NeurIPS 2020.,True,False,AI4Finance-LLC/FinRL-Library
|
||||
bulbea,Python > Trading & Backtesting,2017-03-19,https://github.com/achillesrasquinha/bulbea,Deep Learning based Python Library for Stock Market Prediction and Modelling.,True,False,achillesrasquinha/bulbea
|
||||
ib_nope,Python > Trading & Backtesting,2021-04-22,https://github.com/ajhpark/ib_nope,Automated trading system for NOPE strategy over IBKR TWS.,True,False,ajhpark/ib_nope
|
||||
OctoBot,Python > Trading & Backtesting,2024-02-16,https://github.com/Drakkar-Software/OctoBot,"Open source cryptocurrency trading bot for high frequency, arbitrage, TA and social trading with an advanced web interface.",True,False,Drakkar-Software/OctoBot
|
||||
bta-lib,Python > Trading & Backtesting,2020-03-11,https://github.com/mementum/bta-lib,Technical Analysis library in pandas for backtesting algotrading and quantitative analysis.,True,False,mementum/bta-lib
|
||||
Stock-Prediction-Models,Python > Trading & Backtesting,2021-01-05,https://github.com/huseinzol05/Stock-Prediction-Models,Gathers machine learning and deep learning models for Stock forecasting including trading bots and simulations.,True,False,huseinzol05/Stock-Prediction-Models
|
||||
TuneTA,Python > Trading & Backtesting,2023-10-13,https://github.com/jmrichardson/tuneta,TuneTA optimizes technical indicators using a distance correlation measure to a user defined target feature such as next day return.,True,False,jmrichardson/tuneta
|
||||
AutoTrader,Python > Trading & Backtesting,2023-09-26,https://github.com/kieran-mackle/AutoTrader,A Python-based development platform for automated trading systems - from backtesting to optimisation to livetrading.,True,False,kieran-mackle/AutoTrader
|
||||
fast-trade,Python > Trading & Backtesting,2024-01-25,https://github.com/jrmeier/fast-trade,A library built with backtest portability and performance in mind for backtest trading strategies.,True,False,jrmeier/fast-trade
|
||||
qf-lib,Python > Trading & Backtesting,2023-12-14,https://github.com/quarkfin/qf-lib,QF-Lib is a Python library that provides high quality tools for quantitative finance.,True,False,quarkfin/qf-lib
|
||||
tda-api,Python > Trading & Backtesting,2023-06-05,https://github.com/alexgolec/tda-api,"Gather data and trade equities, options, and ETFs via TDAmeritrade.",True,False,alexgolec/tda-api
|
||||
vectorbt,Python > Trading & Backtesting,2024-02-03,https://github.com/polakowo/vectorbt,"Find your trading edge, using a powerful toolkit for backtesting, algorithmic trading, and research.",True,False,polakowo/vectorbt
|
||||
Lean,Python > Trading & Backtesting,2024-02-16,https://github.com/QuantConnect/Lean,"Lean Algorithmic Trading Engine by QuantConnect (Python, C#).",True,False,QuantConnect/Lean
|
||||
fast-trade,Python > Trading & Backtesting,2024-01-25,https://github.com/jrmeier/fast-trade,Low code backtesting library utilizing pandas and technical analysis indicators.,True,False,jrmeier/fast-trade
|
||||
pysystemtrade,Python > Trading & Backtesting,2024-02-08,https://github.com/robcarver17/pysystemtrade,"pysystemtrade is the open source version of Robert Carver's backtesting and trading engine that implements systems according to the framework outlined in his book ""Systematic Trading"", which is further developed on his [blog](https://qoppac.blogspot.com/).",True,False,robcarver17/pysystemtrade
|
||||
pytrendseries,Python > Trading & Backtesting,2024-01-09,https://github.com/rafa-rod/pytrendseries,"Detect trend in time series, drawdown, drawdown within a constant look-back window , maximum drawdown, time underwater.",True,False,rafa-rod/pytrendseries
|
||||
PyLOB,Python > Trading & Backtesting,2023-01-01,https://github.com/DrAshBooth/PyLOB,Fully functioning fast Limit Order Book written in Python.,True,False,DrAshBooth/PyLOB
|
||||
PyBroker,Python > Trading & Backtesting,2024-01-20,https://github.com/edtechre/pybroker,Algorithmic Trading with Machine Learning.,True,False,edtechre/pybroker
|
||||
OctoBot Script,Python > Trading & Backtesting,2024-01-14,https://github.com/Drakkar-Software/OctoBot-Script,A quant framework to create cryptocurrencies strategies - from backtesting to optimisation to livetrading.,True,False,Drakkar-Software/OctoBot-Script
|
||||
hftbacktest,Python > Trading & Backtesting,2024-02-14,https://github.com/nkaz001/hftbacktest,"A high-frequency trading and market-making backtesting tool accounts for limit orders, queue positions, and latencies, utilizing full tick data for trades and order books.",True,False,nkaz001/hftbacktest
|
||||
vnpy,Python > Trading & Backtesting,2023-12-09,https://github.com/vnpy/vnpy,VeighNa is a Python-based open source quantitative trading system development framework.,True,False,vnpy/vnpy
|
||||
Intelligent Trading Bot,Python > Trading & Backtesting,2023-12-28,https://github.com/asavinov/intelligent-trading-bot,Automatically generating signals and trading based on machine learning and feature engineering,True,False,asavinov/intelligent-trading-bot
|
||||
fastquant,Python > Trading & Backtesting,2023-09-15,https://github.com/enzoampil/fastquant,fastquant allows you to easily backtest investment strategies with as few as 3 lines of python code.,True,False,enzoampil/fastquant
|
||||
nautilus_trader,Python > Trading & Backtesting,2024-02-09,https://github.com/nautechsystems/nautilus_trader,A high-performance algorithmic trading platform and event-driven backtester.,True,False,nautechsystems/nautilus_trader
|
||||
pyfolio,Python > Risk Analysis,2020-02-28,https://github.com/quantopian/pyfolio,Portfolio and risk analytics in Python.,True,False,quantopian/pyfolio
|
||||
empyrical,Python > Risk Analysis,2020-10-14,https://github.com/quantopian/empyrical,Common financial risk and performance metrics.,True,False,quantopian/empyrical
|
||||
fecon235,Python > Risk Analysis,2018-12-03,https://github.com/rsvp/fecon235,"Computational tools for financial economics include: Gaussian Mixture model of leptokurtotic risk, adaptive Boltzmann portfolios.",True,False,rsvp/fecon235
|
||||
finance,Python > Risk Analysis,,https://pypi.org/project/finance/,Financial Risk Calculations. Optimized for ease of use through class construction and operator overload.,False,False,
|
||||
qfrm,Python > Risk Analysis,,https://pypi.org/project/qfrm/,"Quantitative Financial Risk Management: awesome OOP tools for measuring, managing and visualizing risk of financial instruments and portfolios.",False,False,
|
||||
visualize-wealth,Python > Risk Analysis,2015-06-10,https://github.com/benjaminmgross/visualize-wealth,Portfolio construction and quantitative analysis.,True,False,benjaminmgross/visualize-wealth
|
||||
VisualPortfolio,Python > Risk Analysis,2017-02-28,https://github.com/wegamekinglc/VisualPortfolio,This tool is used to visualize the performance of a portfolio.,True,False,wegamekinglc/VisualPortfolio
|
||||
universal-portfolios,Python > Risk Analysis,2024-01-16,https://github.com/Marigold/universal-portfolios,Collection of algorithms for online portfolio selection.,True,False,Marigold/universal-portfolios
|
||||
FinQuant,Python > Risk Analysis,2023-09-03,https://github.com/fmilthaler/FinQuant,"A program for financial portfolio management, analysis and optimisation.",True,False,fmilthaler/FinQuant
|
||||
Empyrial,Python > Risk Analysis,2024-02-08,https://github.com/ssantoshp/Empyrial,Portfolio's risk and performance analytics and returns predictions.,True,False,ssantoshp/Empyrial
|
||||
risktools,Python > Risk Analysis,2023-11-12,https://github.com/bbcho/risktools-dev,Risk tools for use within the crude and crude products trading space with partial implementation of R's PerformanceAnalytics.,True,False,bbcho/risktools-dev
|
||||
Riskfolio-Lib,Python > Risk Analysis,2024-02-08,https://github.com/dcajasn/Riskfolio-Lib,Portfolio Optimization and Quantitative Strategic Asset Allocation in Python.,True,False,dcajasn/Riskfolio-Lib
|
||||
alphalens,Python > Factor Analysis,2020-04-27,https://github.com/quantopian/alphalens,Performance analysis of predictive alpha factors.,True,False,quantopian/alphalens
|
||||
Spectre,Python > Factor Analysis,2023-11-28,https://github.com/Heerozh/spectre,GPU-accelerated Factors analysis library and Backtester,True,False,Heerozh/spectre
|
||||
Jupyter Quant,Python > Quant Research Environment,2024-02-16,https://github.com/gnzsnz/jupyter-quant,"A dockerized Jupyter quant research environment with preloaded tools for quant analysis, statsmodels, pymc, arch, py_vollib, zipline-reloaded, PyPortfolioOpt, etc.",True,False,gnzsnz/jupyter-quant
|
||||
ARCH,Python > Time Series,2024-01-05,https://github.com/bashtage/arch,ARCH models in Python.,True,False,bashtage/arch
|
||||
statsmodels,Python > Time Series,,http://statsmodels.sourceforge.net,"Python module that allows users to explore data, estimate statistical models, and perform statistical tests.",False,False,
|
||||
dynts,Python > Time Series,2016-11-02,https://github.com/quantmind/dynts,Python package for timeseries analysis and manipulation.,True,False,quantmind/dynts
|
||||
PyFlux,Python > Time Series,2018-12-16,https://github.com/RJT1990/pyflux,Python library for timeseries modelling and inference (frequentist and Bayesian) on models.,True,False,RJT1990/pyflux
|
||||
tsfresh,Python > Time Series,2024-01-28,https://github.com/blue-yonder/tsfresh,Automatic extraction of relevant features from time series.,True,False,blue-yonder/tsfresh
|
||||
hasura/quandl-metabase,Python > Time Series,,https://platform.hasura.io/hub/projects/anirudhm/quandl-metabase-time-series,Hasura quickstart to visualize Quandl's timeseries datasets with Metabase.,False,False,
|
||||
Facebook Prophet,Python > Time Series,2023-10-18,https://github.com/facebook/prophet,Tool for producing high quality forecasts for time series data that has multiple seasonality with linear or non-linear growth.,True,False,facebook/prophet
|
||||
tsmoothie,Python > Time Series,2023-11-23,https://github.com/cerlymarco/tsmoothie,A python library for time-series smoothing and outlier detection in a vectorized way.,True,False,cerlymarco/tsmoothie
|
||||
pmdarima,Python > Time Series,2024-02-16,https://github.com/alkaline-ml/pmdarima,"A statistical library designed to fill the void in Python's time series analysis capabilities, including the equivalent of R's auto.arima function.",True,False,alkaline-ml/pmdarima
|
||||
gluon-ts,Python > Time Series,2024-02-07,https://github.com/awslabs/gluon-ts,vProbabilistic time series modeling in Python.,True,False,awslabs/gluon-ts
|
||||
exchange_calendars,Python > Calendars,2024-02-15,https://github.com/gerrymanoim/exchange_calendars,Stock Exchange Trading Calendars.,True,False,gerrymanoim/exchange_calendars
|
||||
bizdays,Python > Calendars,2024-02-12,https://github.com/wilsonfreitas/python-bizdays,Business days calculations and utilities.,True,False,wilsonfreitas/python-bizdays
|
||||
pandas_market_calendars,Python > Calendars,2024-02-10,https://github.com/rsheftel/pandas_market_calendars,Exchange calendars to use with pandas for trading applications.,True,False,rsheftel/pandas_market_calendars
|
||||
yfinance,Python > Data Sources,2024-02-10,https://github.com/ranaroussi/yfinance,Yahoo! Finance market data downloader (+faster Pandas Datareader),True,False,ranaroussi/yfinance
|
||||
findatapy,Python > Data Sources,2023-12-01,https://github.com/cuemacro/findatapy,"Python library to download market data via Bloomberg, Quandl, Yahoo etc.",True,False,cuemacro/findatapy
|
||||
googlefinance,Python > Data Sources,2018-09-23,https://github.com/hongtaocai/googlefinance,Python module to get real-time stock data from Google Finance API.,True,False,hongtaocai/googlefinance
|
||||
yahoo-finance,Python > Data Sources,2021-12-15,https://github.com/lukaszbanasiak/yahoo-finance,Python module to get stock data from Yahoo! Finance.,True,False,lukaszbanasiak/yahoo-finance
|
||||
pandas-datareader,Python > Data Sources,2023-10-24,https://github.com/pydata/pandas-datareader,"Python module to get data from various sources (Google Finance, Yahoo Finance, FRED, OECD, Fama/French, World Bank, Eurostat...) into Pandas datastructures such as DataFrame, Panel with a caching mechanism.",True,False,pydata/pandas-datareader
|
||||
pandas-finance,Python > Data Sources,2023-07-04,https://github.com/davidastephens/pandas-finance,High level API for access to and analysis of financial data.,True,False,davidastephens/pandas-finance
|
||||
pyhoofinance,Python > Data Sources,2016-10-07,https://github.com/innes213/pyhoofinance,Rapidly queries Yahoo Finance for multiple tickers and returns typed data for analysis.,True,False,innes213/pyhoofinance
|
||||
yfinanceapi,Python > Data Sources,2020-05-26,https://github.com/Karthik005/yfinanceapi,Finance API for Python.,True,False,Karthik005/yfinanceapi
|
||||
yql-finance,Python > Data Sources,2015-08-29,https://github.com/slawek87/yql-finance,"yql-finance is simple and fast. API returns stock closing prices for current period of time and current stock ticker (i.e. APPL, GOOGL).",True,False,slawek87/yql-finance
|
||||
ystockquote,Python > Data Sources,2017-03-10,https://github.com/cgoldberg/ystockquote,Retrieve stock quote data from Yahoo Finance.,True,False,cgoldberg/ystockquote
|
||||
wallstreet,Python > Data Sources,2022-12-30,https://github.com/mcdallas/wallstreet,Real time stock and option data.,True,False,mcdallas/wallstreet
|
||||
stock_extractor,Python > Data Sources,2016-09-10,https://github.com/ZachLiuGIS/stock_extractor,General Purpose Stock Extractors from Online Resources.,True,False,ZachLiuGIS/stock_extractor
|
||||
Stockex,Python > Data Sources,2021-09-15,https://github.com/cttn/Stockex,Python wrapper for Yahoo! Finance API.,True,False,cttn/Stockex
|
||||
finsymbols,Python > Data Sources,2017-07-23,https://github.com/skillachie/finsymbols,"Obtains stock symbols and relating information for SP500, AMEX, NYSE, and NASDAQ.",True,False,skillachie/finsymbols
|
||||
FRB,Python > Data Sources,2018-12-22,https://github.com/avelkoski/FRB,Python Client for FRED® API.,True,False,avelkoski/FRB
|
||||
inquisitor,Python > Data Sources,2019-10-10,https://github.com/econdb/inquisitor,Python Interface to Econdb.com API.,True,False,econdb/inquisitor
|
||||
yfi,Python > Data Sources,2016-02-12,https://github.com/nickelkr/yfi,Yahoo! YQL library.,True,False,nickelkr/yfi
|
||||
chinesestockapi,Python > Data Sources,,https://pypi.org/project/chinesestockapi/,Python API to get Chinese stock price.,False,False,
|
||||
exchange,Python > Data Sources,2015-07-07,https://github.com/akarat/exchange,Get current exchange rate.,True,False,akarat/exchange
|
||||
ticks,Python > Data Sources,2016-01-08,https://github.com/jamescnowell/ticks,Simple command line tool to get stock ticker data.,True,False,jamescnowell/ticks
|
||||
pybbg,Python > Data Sources,2015-01-20,https://github.com/bpsmith/pybbg,Python interface to Bloomberg COM APIs.,True,False,bpsmith/pybbg
|
||||
ccy,Python > Data Sources,2023-09-29,https://github.com/lsbardel/ccy,Python module for currencies.,True,False,lsbardel/ccy
|
||||
tushare,Python > Data Sources,,https://pypi.org/project/tushare/,A utility for crawling historical and Real-time Quotes data of China stocks.,False,False,
|
||||
jsm,Python > Data Sources,,https://pypi.org/project/jsm/,Get the japanese stock market data.,False,False,
|
||||
cn_stock_src,Python > Data Sources,2016-02-29,https://github.com/jealous/cn_stock_src,Utility for retrieving basic China stock data from different sources.,True,False,jealous/cn_stock_src
|
||||
coinmarketcap,Python > Data Sources,2023-05-23,https://github.com/barnumbirr/coinmarketcap,Python API for coinmarketcap.,True,False,barnumbirr/coinmarketcap
|
||||
after-hours,Python > Data Sources,2020-06-22,https://github.com/datawrestler/after-hours,Obtain pre market and after hours stock prices for a given symbol.,True,False,datawrestler/after-hours
|
||||
bronto-python,Python > Data Sources,,https://pypi.org/project/bronto-python/,Bronto API Integration for Python.,False,False,
|
||||
pytdx,Python > Data Sources,2020-04-15,https://github.com/rainx/pytdx,Python Interface for retrieving chinese stock realtime quote data from TongDaXin Nodes.,True,False,rainx/pytdx
|
||||
pdblp,Python > Data Sources,2022-05-28,https://github.com/matthewgilbert/pdblp,A simple interface to integrate pandas and the Bloomberg Open API.,True,False,matthewgilbert/pdblp
|
||||
tiingo,Python > Data Sources,2024-02-14,https://github.com/hydrosquall/tiingo-python,"Python interface for daily composite prices/OHLC/Volume + Real-time News Feeds, powered by the Tiingo Data Platform.",True,False,hydrosquall/tiingo-python
|
||||
iexfinance,Python > Data Sources,2021-01-02,https://github.com/addisonlynch/iexfinance,Python Interface for retrieving real-time and historical prices and equities data from The Investor's Exchange.,True,False,addisonlynch/iexfinance
|
||||
pyEX,Python > Data Sources,2024-02-05,https://github.com/timkpaine/pyEX,"Python interface to IEX with emphasis on pandas, support for streaming data, premium data, points data (economic, rates, commodities), and technical indicators.",True,False,timkpaine/pyEX
|
||||
alpaca-trade-api,Python > Data Sources,2024-01-12,https://github.com/alpacahq/alpaca-trade-api-python,Python interface for retrieving real-time and historical prices from Alpaca API as well as trade execution.,True,False,alpacahq/alpaca-trade-api-python
|
||||
metatrader5,Python > Data Sources,,https://pypi.org/project/MetaTrader5/,API Connector to MetaTrader 5 Terminal,False,False,
|
||||
akshare,Python > Data Sources,2024-02-14,https://github.com/jindaxiang/akshare,"AkShare is an elegant and simple financial data interface library for Python, built for human beings! <https://akshare.readthedocs.io>",True,False,jindaxiang/akshare
|
||||
yahooquery,Python > Data Sources,2023-12-16,https://github.com/dpguthrie/yahooquery,Python interface for retrieving data through unofficial Yahoo Finance API.,True,False,dpguthrie/yahooquery
|
||||
investpy,Python > Data Sources,2022-10-02,https://github.com/alvarobartt/investpy,Financial Data Extraction from Investing.com with Python! <https://investpy.readthedocs.io/>,True,False,alvarobartt/investpy
|
||||
yliveticker,Python > Data Sources,2021-04-29,https://github.com/yahoofinancelive/yliveticker,Live stream of market data from Yahoo Finance websocket.,True,False,yahoofinancelive/yliveticker
|
||||
bbgbridge,Python > Data Sources,2020-01-07,https://github.com/ran404/bbgbridge,Easy to use Bloomberg Desktop API wrapper for Python.,True,False,ran404/bbgbridge
|
||||
alpha_vantage,Python > Data Sources,2023-11-11,https://github.com/RomelTorres/alpha_vantage,A python wrapper for Alpha Vantage API for financial data.,True,False,RomelTorres/alpha_vantage
|
||||
FinanceDataReader,Python > Data Sources,2024-01-31,https://github.com/FinanceData/FinanceDataReader,"Open Source Financial data reader for U.S, Korean, Japanese, Chinese, Vietnamese Stocks",True,False,FinanceData/FinanceDataReader
|
||||
pystlouisfed,Python > Data Sources,2024-01-09,https://github.com/TomasKoutek/pystlouisfed,"Python client for Federal Reserve Bank of St. Louis API - FRED, ALFRED, GeoFRED and FRASER.",True,False,TomasKoutek/pystlouisfed
|
||||
python-bcb,Python > Data Sources,2023-07-22,https://github.com/wilsonfreitas/python-bcb,Python interface to Brazilian Central Bank web services.,True,False,wilsonfreitas/python-bcb
|
||||
market-prices,Python > Data Sources,2024-02-15,https://github.com/maread99/market_prices,Create meaningful OHLCV datasets from knowledge of [exchange-calendars](https://github.com/gerrymanoim/exchange_calendars) (works out-the-box with data from Yahoo Finance).,True,False,maread99/market_prices
|
||||
tardis-python,Python > Data Sources,2023-08-21,https://github.com/tardis-dev/tardis-python,Python interface for Tardis.dev high frequency crypto market data,True,False,tardis-dev/tardis-python
|
||||
lake-api,Python > Data Sources,2023-12-03,https://github.com/crypto-lake/lake-api,Python interface for Crypto Lake high frequency crypto market data,True,False,crypto-lake/lake-api
|
||||
tessa,Python > Data Sources,2023-10-16,https://github.com/ymyke/tessa,"simple, hassle-free access to price information of financial assets (currently based on yfinance and pycoingecko), including search and a symbol class.",True,False,ymyke/tessa
|
||||
pandaSDMX,Python > Data Sources,2023-02-25,https://github.com/dr-leo/pandaSDMX,"Python package that implements SDMX 2.1 (ISO 17369:2013), a format for exchange of statistical data and metadata used by national statistical agencies, central banks, and international organisations.",True,False,dr-leo/pandaSDMX
|
||||
cif,Python > Data Sources,2022-06-18,https://github.com/LenkaV/CIF,"Python package that include few composite indicators, which summarize multidimensional relationships between individual economic indicators.",True,False,LenkaV/CIF
|
||||
finagg,Python > Data Sources,2024-02-08,https://github.com/theOGognf/finagg,"finagg is a Python package that provides implementations of popular and free financial APIs, tools for aggregating historical data from those APIs into SQL databases, and tools for transforming aggregated data into features useful for analysis and AI/ML.",True,False,theOGognf/finagg
|
||||
xlwings,Python > Excel Integration,,https://www.xlwings.org/,Make Excel fly with Python.,False,False,
|
||||
openpyxl,Python > Excel Integration,,https://openpyxl.readthedocs.io/en/latest/,Read/Write Excel 2007 xlsx/xlsm files.,False,False,
|
||||
xlrd,Python > Excel Integration,2021-08-19,https://github.com/python-excel/xlrd,Library for developers to extract data from Microsoft Excel spreadsheet files.,True,False,python-excel/xlrd
|
||||
xlsxwriter,Python > Excel Integration,,https://xlsxwriter.readthedocs.io/,Write files in the Excel 2007+ XLSX file format.,False,False,
|
||||
xlwt,Python > Excel Integration,2018-09-16,https://github.com/python-excel/xlwt,"Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform.",True,False,python-excel/xlwt
|
||||
DataNitro,Python > Excel Integration,,https://datanitro.com/,"DataNitro also offers full-featured Python-Excel integration, including UDFs. Trial downloads are available, but users must purchase a license.",False,False,
|
||||
xlloop,Python > Excel Integration,,http://xlloop.sourceforge.net,XLLoop is an open source framework for implementing Excel user-defined functions (UDFs) on a centralised server (a function server).,False,False,
|
||||
expy,Python > Excel Integration,,http://www.bnikolic.co.uk/expy/expy.html,"The ExPy add-in allows easy use of Python directly from within an Microsoft Excel spreadsheet, both to execute arbitrary code and to define new Excel functions.",False,False,
|
||||
pyxll,Python > Excel Integration,,https://www.pyxll.com,PyXLL is an Excel add-in that enables you to extend Excel using nothing but Python code.,False,False,
|
||||
D-Tale,Python > Visualization,2024-01-31,https://github.com/man-group/dtale,Visualizer for pandas dataframes and xarray datasets.,True,False,man-group/dtale
|
||||
mplfinance,Python > Visualization,2024-02-08,https://github.com/matplotlib/mplfinance,"matplotlib utilities for the visualization, and visual analysis, of financial data.",True,False,matplotlib/mplfinance
|
||||
finplot,Python > Visualization,2024-02-17,https://github.com/highfestiva/finplot,Performant and effortless finance plotting for Python.,True,False,highfestiva/finplot
|
||||
finvizfinance,Python > Visualization,2023-11-02,https://github.com/lit26/finvizfinance,Finviz analysis python library.,True,False,lit26/finvizfinance
|
||||
market-analy,Python > Visualization,2023-12-06,https://github.com/maread99/market_analy,Analysis and interactive charting using [market-prices](https://github.com/maread99/market_prices) and bqplot.,True,False,maread99/market_analy
|
||||
xts,R > Numerical Libraries & Data Structures,2024-02-06,https://github.com/joshuaulrich/xts,"eXtensible Time Series: Provide for uniform handling of R's different time-based data classes by extending zoo, maximizing native format information preservation and allowing for user level customization and extension, while simplifying cross-class interoperability.",True,False,joshuaulrich/xts
|
||||
data.table,R > Numerical Libraries & Data Structures,2024-02-17,https://github.com/Rdatatable/data.table,"Extension of data.frame: Fast aggregation of large data (e.g. 100GB in RAM), fast ordered joins, fast add/modify/delete of columns by group using no copies at all, list columns and a fast file reader (fread). Offers a natural and flexible syntax, for faster development.",True,False,Rdatatable/data.table
|
||||
sparseEigen,R > Numerical Libraries & Data Structures,2018-12-22,https://github.com/dppalomar/sparseEigen,Sparse pricipal component analysis.,True,False,dppalomar/sparseEigen
|
||||
TSdbi,R > Numerical Libraries & Data Structures,,http://tsdbi.r-forge.r-project.org/,Provides a common interface to time series databases.,False,False,
|
||||
tseries,R > Numerical Libraries & Data Structures,,https://cran.r-project.org/web/packages/tseries/index.html,Time Series Analysis and Computational Finance.,False,True,
|
||||
zoo,R > Numerical Libraries & Data Structures,,https://cran.r-project.org/web/packages/zoo/index.html,S3 Infrastructure for Regular and Irregular Time Series (Z's Ordered Observations).,False,True,
|
||||
tis,R > Numerical Libraries & Data Structures,,https://cran.r-project.org/web/packages/tis/index.html,"Functions and S3 classes for time indexes and time indexed series, which are compatible with FAME frequencies.",False,True,
|
||||
tfplot,R > Numerical Libraries & Data Structures,,https://cran.r-project.org/web/packages/tfplot/index.html,Utilities for simple manipulation and quick plotting of time series data.,False,True,
|
||||
tframe,R > Numerical Libraries & Data Structures,,https://cran.r-project.org/web/packages/tframe/index.html,A kernel of functions for programming time series methods in a way that is relatively independently of the representation of time.,False,True,
|
||||
IBrokers,R > Data Sources,,https://cran.r-project.org/web/packages/IBrokers/index.html,Provides native R access to Interactive Brokers Trader Workstation API.,False,True,
|
||||
Rblpapi,R > Data Sources,2022-12-02,https://github.com/Rblp/Rblpapi,An R Interface to 'Bloomberg' is provided via the 'Blp API'.,True,False,Rblp/Rblpapi
|
||||
Quandl,R > Data Sources,,https://www.quandl.com/tools/r,Get Financial Data Directly Into R.,False,False,
|
||||
Rbitcoin,R > Data Sources,2016-10-25,https://github.com/jangorecki/Rbitcoin,"Unified markets API interface (bitstamp, kraken, btce, bitmarket).",True,False,jangorecki/Rbitcoin
|
||||
GetTDData,R > Data Sources,2023-05-15,https://github.com/msperlin/GetTDData,Downloads and aggregates data for Brazilian government issued bonds directly from the website of Tesouro Direto.,True,False,msperlin/GetTDData
|
||||
GetHFData,R > Data Sources,2020-06-30,https://github.com/msperlin/GetHFData,Downloads and aggregates high frequency trading data for Brazilian instruments directly from Bovespa ftp site.,True,False,msperlin/GetHFData
|
||||
Reddit WallstreetBets API,R > Data Sources,,https://dashboard.nbshare.io/apps/reddit/api/,Provides daily top 50 stocks from reddit (subreddit) Wallstreetbets and their sentiments via the API.,False,False,
|
||||
td,R > Data Sources,2022-12-05,https://github.com/eddelbuettel/td,Interfaces the 'twelvedata' API for stocks and (digital and standard) currencies.,True,False,eddelbuettel/td
|
||||
rbcb,R > Data Sources,2024-01-23,https://github.com/wilsonfreitas/rbcb,R interface to Brazilian Central Bank web services.,True,False,wilsonfreitas/rbcb
|
||||
rb3,R > Data Sources,2023-09-11,https://github.com/ropensci/rb3,A bunch of downloaders and parsers for data delivered from B3.,True,False,ropensci/rb3
|
||||
simfinapi,R > Data Sources,2023-04-12,https://github.com/matthiasgomolka/simfinapi,Makes 'SimFin' data (<https://simfin.com/>) easily accessible in R.,True,False,matthiasgomolka/simfinapi
|
||||
RQuantLib,R > Financial Instruments and Pricing,,http://dirk.eddelbuettel.com/code/rquantlib.html,RQuantLib connects GNU R with QuantLib.,False,False,
|
||||
quantmod,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/quantmod/index.html,Quantitative Financial Modelling Framework.,False,True,
|
||||
Rmetrics,R > Financial Instruments and Pricing,,https://www.rmetrics.org,The premier open source software solution for teaching and training quantitative finance.,False,False,
|
||||
fAsianOptions,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/fAsianOptions/index.html,EBM and Asian Option Valuation.,False,True,
|
||||
fAssets,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/fAssets/index.html,Analysing and Modelling Financial Assets.,False,True,
|
||||
fBasics,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/fBasics/index.html,Markets and Basic Statistics.,False,True,
|
||||
fBonds,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/fBonds/index.html,Bonds and Interest Rate Models.,False,True,
|
||||
fExoticOptions,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/fExoticOptions/index.html,Exotic Option Valuation.,False,True,
|
||||
fOptions,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/fOptions/index.html,Pricing and Evaluating Basic Options.,False,True,
|
||||
fPortfolio,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/fPortfolio/index.html,Portfolio Selection and Optimization.,False,True,
|
||||
portfolio,R > Financial Instruments and Pricing,2021-07-09,https://github.com/dgerlanc/portfolio,Analysing equity portfolios.,True,False,dgerlanc/portfolio
|
||||
sparseIndexTracking,R > Financial Instruments and Pricing,2023-05-28,https://github.com/dppalomar/sparseIndexTracking,Portfolio design to track an index.,True,False,dppalomar/sparseIndexTracking
|
||||
covFactorModel,R > Financial Instruments and Pricing,2019-03-25,https://github.com/dppalomar/covFactorModel,Covariance matrix estimation via factor models.,True,False,dppalomar/covFactorModel
|
||||
riskParityPortfolio,R > Financial Instruments and Pricing,2022-11-15,https://github.com/dppalomar/riskParityPortfolio,Blazingly fast design of risk parity portfolios.,True,False,dppalomar/riskParityPortfolio
|
||||
sde,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/sde/index.html,Simulation and Inference for Stochastic Differential Equations.,False,True,
|
||||
YieldCurve,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/YieldCurve/index.html,Modelling and estimation of the yield curve.,False,True,
|
||||
SmithWilsonYieldCurve,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/SmithWilsonYieldCurve/index.html,Constructs a yield curve by the Smith-Wilson method from a table of LIBOR and SWAP rates.,False,True,
|
||||
ycinterextra,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/ycinterextra/index.html,Yield curve or zero-coupon prices interpolation and extrapolation.,False,True,
|
||||
AmericanCallOpt,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/AmericanCallOpt/index.html,This package includes pricing function for selected American call options with underlying assets that generate payouts.,False,True,
|
||||
VarSwapPrice,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/VarSwapPrice/index.html,Pricing a variance swap on an equity index.,False,True,
|
||||
RND,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/RND/index.html,Risk Neutral Density Extraction Package.,False,True,
|
||||
LSMonteCarlo,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/LSMonteCarlo/index.html,American options pricing with Least Squares Monte Carlo method.,False,True,
|
||||
OptHedging,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/OptHedging/index.html,Estimation of value and hedging strategy of call and put options.,False,True,
|
||||
tvm,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/tvm/index.html,Time Value of Money Functions.,False,True,
|
||||
OptionPricing,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/OptionPricing/index.html,Option Pricing with Efficient Simulation Algorithms.,False,True,
|
||||
credule,R > Financial Instruments and Pricing,2015-08-05,https://github.com/blenezet/credule,Credit Default Swap Functions.,True,False,blenezet/credule
|
||||
derivmkts,R > Financial Instruments and Pricing,,https://cran.r-project.org/web/packages/derivmkts/index.html,Functions and R Code to Accompany Derivatives Markets.,False,True,
|
||||
FinCal,R > Financial Instruments and Pricing,2017-04-12,https://github.com/felixfan/FinCal,"Package for time value of money calculation, time series analysis and computational finance.",True,False,felixfan/FinCal
|
||||
r-quant,R > Financial Instruments and Pricing,2014-02-19,https://github.com/artyyouth/r-quant,R code for quantitative analysis in finance.,True,False,artyyouth/r-quant
|
||||
options.studies,R > Financial Instruments and Pricing,2015-12-17,https://github.com/taylorizing/options.studies,options trading studies functions for use with options.data package and shiny.,True,False,taylorizing/options.studies
|
||||
PortfolioAnalytics,R > Financial Instruments and Pricing,2022-11-13,https://github.com/braverock/PortfolioAnalytics,"Portfolio Analysis, Including Numerical Methods for Optimizationof Portfolios.",True,False,braverock/PortfolioAnalytics
|
||||
fmbasics,R > Financial Instruments and Pricing,2019-12-03,https://github.com/imanuelcostigan/fmbasics,Financial Market Building Blocks.,True,False,imanuelcostigan/fmbasics
|
||||
R-fixedincome,R > Financial Instruments and Pricing,2023-06-27,https://github.com/wilsonfreitas/R-fixedincome,Fixed income tools for R.,True,False,wilsonfreitas/R-fixedincome
|
||||
backtest,R > Trading,,https://cran.r-project.org/web/packages/backtest/index.html,Exploring Portfolio-Based Conjectures About Financial Instruments.,False,True,
|
||||
pa,R > Trading,,https://cran.r-project.org/web/packages/pa/index.html,Performance Attribution for Equity Portfolios.,False,True,
|
||||
TTR,R > Trading,2024-02-13,https://github.com/joshuaulrich/TTR,Technical Trading Rules.,True,False,joshuaulrich/TTR
|
||||
QuantTools,R > Trading,,https://quanttools.bitbucket.io/_site/index.html,Enhanced Quantitative Trading Modelling.,False,False,
|
||||
blotter,R > Trading,2023-02-04,https://github.com/braverock/blotter,"Transaction infrastructure for defining instruments, transactions, portfolios and accounts for trading systems and simulation. Provides portfolio support for multi-asset class and multi-currency portfolios. Actively maintained and developed.",True,False,braverock/blotter
|
||||
quantstrat,R > Backtesting,2023-09-14,https://github.com/braverock/quantstrat,Transaction-oriented infrastructure for constructing trading systems and simulation. Provides support for multi-asset class and multi-currency portfolios for backtesting and other financial research.,True,False,braverock/quantstrat
|
||||
PerformanceAnalytics,R > Risk Analysis,2024-02-15,https://github.com/braverock/PerformanceAnalytics,Econometric tools for performance and risk analysis.,True,False,braverock/PerformanceAnalytics
|
||||
FactorAnalytics,R > Factor Analysis,2024-02-16,https://github.com/braverock/FactorAnalytics,"The FactorAnalytics package contains fitting and analysis methods for the three main types of factor models used in conjunction with portfolio construction, optimization and risk management, namely fundamental factor models, time series factor models and statistical factor models.",True,False,braverock/FactorAnalytics
|
||||
Expected Returns,R > Factor Analysis,2023-08-31,https://github.com/JustinMShea/ExpectedReturns,"Solutions for enhancing portfolio diversification and replications of seminal papers with R, most of which are discussed in one of the best investment references of the recent decade, Expected Returns: An Investors Guide to Harvesting Market Rewards by Antti Ilmanen.",True,False,JustinMShea/ExpectedReturns
|
||||
tseries,R > Time Series,,https://cran.r-project.org/web/packages/tseries/index.html,Time Series Analysis and Computational Finance.,False,True,
|
||||
fGarch,R > Time Series,,https://cran.r-project.org/web/packages/fGarch/index.html,Rmetrics - Autoregressive Conditional Heteroskedastic Modelling.,False,True,
|
||||
timeSeries,R > Time Series,,https://cran.r-project.org/web/packages/timeSeries/index.html,Rmetrics - Financial Time Series Objects.,False,True,
|
||||
rugarch,R > Time Series,2023-09-20,https://github.com/alexiosg/rugarch,Univariate GARCH Models.,True,False,alexiosg/rugarch
|
||||
rmgarch,R > Time Series,2022-03-05,https://github.com/alexiosg/rmgarch,Multivariate GARCH Models.,True,False,alexiosg/rmgarch
|
||||
tidypredict,R > Time Series,2021-09-28,https://github.com/edgararuiz/tidypredict,Run predictions inside the database <https://tidypredict.netlify.com/>.,True,False,edgararuiz/tidypredict
|
||||
tidyquant,R > Time Series,2024-01-04,https://github.com/business-science/tidyquant,Bringing financial analysis to the tidyverse.,True,False,business-science/tidyquant
|
||||
timetk,R > Time Series,2024-01-04,https://github.com/business-science/timetk,A toolkit for working with time series in R.,True,False,business-science/timetk
|
||||
tibbletime,R > Time Series,2023-01-24,https://github.com/business-science/tibbletime,"Built on top of the tidyverse, tibbletime is an extension that allows for the creation of time aware tibbles through the setting of a time index.",True,False,business-science/tibbletime
|
||||
matrixprofile,R > Time Series,2022-11-25,https://github.com/matrix-profile-foundation/matrixprofile,Time series data mining library built on top of the novel Matrix Profile data structure and algorithms.,True,False,matrix-profile-foundation/matrixprofile
|
||||
garchmodels,R > Time Series,2022-08-11,https://github.com/AlbertoAlmuinha/garchmodels,A parsnip backend for GARCH models.,True,False,AlbertoAlmuinha/garchmodels
|
||||
timeDate,R > Calendars,,https://cran.r-project.org/web/packages/timeDate/index.html,Chronological and Calendar Objects,False,True,
|
||||
bizdays,R > Calendars,2024-02-12,https://github.com/wilsonfreitas/R-bizdays,Business days calculations and utilities,True,False,wilsonfreitas/R-bizdays
|
||||
QUANTAXIS,Matlab > FrameWorks,2023-01-10,https://github.com/yutiansut/quantaxis,Integrated Quantitative Toolbox with Matlab.,True,False,yutiansut/quantaxis
|
||||
QuantLib.jl,Julia,2020-02-18,https://github.com/pazzo83/QuantLib.jl,Quantlib implementation in pure Julia.,True,False,pazzo83/QuantLib.jl
|
||||
Ito.jl,Julia,2017-03-21,https://github.com/aviks/Ito.jl,A Julia package for quantitative finance.,True,False,aviks/Ito.jl
|
||||
TALib.jl,Julia,2017-08-22,https://github.com/femtotrader/TALib.jl,A Julia wrapper for TA-Lib.,True,False,femtotrader/TALib.jl
|
||||
IncTA.jl,Julia,2024-01-18,https://github.com/femtotrader/IncTA.jl,Julia Incremental Technical Analysis Indicators,True,False,femtotrader/IncTA.jl
|
||||
Miletus.jl,Julia,2023-12-07,https://github.com/JuliaComputing/Miletus.jl,"A financial contract definition, modeling language, and valuation framework.",True,False,JuliaComputing/Miletus.jl
|
||||
Temporal.jl,Julia,2021-12-28,https://github.com/dysonance/Temporal.jl,Flexible and efficient time series class & methods.,True,False,dysonance/Temporal.jl
|
||||
Indicators.jl,Julia,2022-12-06,https://github.com/dysonance/Indicators.jl,Financial market technical analysis & indicators on top of Temporal.,True,False,dysonance/Indicators.jl
|
||||
Strategems.jl,Julia,2021-04-06,https://github.com/dysonance/Strategems.jl,Quantitative systematic trading strategy development and backtesting.,True,False,dysonance/Strategems.jl
|
||||
TimeSeries.jl,Julia,2023-12-07,https://github.com/JuliaStats/TimeSeries.jl,Time series toolkit for Julia.,True,False,JuliaStats/TimeSeries.jl
|
||||
MarketTechnicals.jl,Julia,2021-07-12,https://github.com/JuliaQuant/MarketTechnicals.jl,Technical analysis of financial time series on top of TimeSeries.,True,False,JuliaQuant/MarketTechnicals.jl
|
||||
MarketData.jl,Julia,2024-01-06,https://github.com/JuliaQuant/MarketData.jl,Time series market data.,True,False,JuliaQuant/MarketData.jl
|
||||
TimeFrames.jl,Julia,2019-02-16,https://github.com/femtotrader/TimeFrames.jl,A Julia library that defines TimeFrame (essentially for resampling TimeSeries).,True,False,femtotrader/TimeFrames.jl
|
||||
DataFrames.jl,Julia,2024-01-25,https://github.com/JuliaData/DataFrames.jl,In-memory tabular data in Julia,True,False,JuliaData/DataFrames.jl
|
||||
TSFrames.jl,Julia,2023-07-25,https://github.com/xKDR/TSFrames.jl,Handle timeseries data on top of the powerful and mature DataFrames.jl,True,False,xKDR/TSFrames.jl
|
||||
Strata,Java,,http://strata.opengamma.io/,Modern open-source analytics and market risk library designed and written in Java.,False,False,
|
||||
JQuantLib,Java,,http://www.jquantlib.org,"JQuantLib is a free, open-source, comprehensive framework for quantitative finance, written in 100% Java.",False,False,
|
||||
finmath.net,Java,,http://finmath.net,Java library with algorithms and methodologies related to mathematical finance.,False,False,
|
||||
quantcomponents,Java,2015-10-07,https://github.com/lsgro/quantcomponents,Free Java components for Quantitative Finance and Algorithmic Trading.,True,False,lsgro/quantcomponents
|
||||
DRIP,Java,,https://lakshmidrip.github.io/DRIP,"Fixed Income, Asset Allocation, Transaction Cost Analysis, XVA Metrics Libraries.",False,False,
|
||||
ta4j,Java,2024-01-05,https://github.com/ta4j/ta4j,A Java library for technical analysis.,True,False,ta4j/ta4j
|
||||
finance.js,JavaScript,2018-10-11,https://github.com/ebradyjobory/finance.js,A JavaScript library for common financial calculations.,True,False,ebradyjobory/finance.js
|
||||
portfolio-allocation,JavaScript,2022-08-11,https://github.com/lequant40/portfolio_allocation_js,"PortfolioAllocation is a JavaScript library designed to help constructing financial portfolios made of several assets: bonds, commodities, cryptocurrencies, currencies, exchange traded funds (ETFs), mutual funds, stocks...",True,False,lequant40/portfolio_allocation_js
|
||||
Ghostfolio,JavaScript,2024-02-16,https://github.com/ghostfolio/ghostfolio,"Wealth management software to keep track of financial assets like stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.",True,False,ghostfolio/ghostfolio
|
||||
IndicatorTS,JavaScript,2024-02-03,https://github.com/cinar/indicatorts,"Indicator is a TypeScript module providing various stock technical analysis indicators, strategies, and a backtest framework for trading.",True,False,cinar/indicatorts
|
||||
ccxt,JavaScript,2024-02-17,https://github.com/ccxt/ccxt,A JavaScript / Python / PHP cryptocurrency trading API with support for more than 100 bitcoin/altcoin exchanges.,True,False,ccxt/ccxt
|
||||
PENDAX,JavaScript,2023-08-31,https://github.com/CompendiumFi/PENDAX-SDK,"Javascript SDK for Trading/Data API and Websockets for FTX, FTXUS, OKX, Bybit, & More.",True,False,CompendiumFi/PENDAX-SDK
|
||||
QUANTAXIS_Webkit,JavaScript > Data Visualization,2017-07-30,https://github.com/yutiansut/QUANTAXIS_Webkit,An awesome visualization center based on quantaxis.,True,False,yutiansut/QUANTAXIS_Webkit
|
||||
quantfin,Haskell,2019-04-06,https://github.com/boundedvariation/quantfin,quant finance in pure haskell.,True,False,boundedvariation/quantfin
|
||||
Haxcel,Haskell,2022-09-13,https://github.com/MarcusRainbow/Haxcel,Excel Addin for Haskell.,True,False,MarcusRainbow/Haxcel
|
||||
Ffinar,Haskell,2021-11-26,https://github.com/MarcusRainbow/Ffinar,A financial maths library in Haskell.,True,False,MarcusRainbow/Ffinar
|
||||
QuantScale,Scala,2014-01-14,https://github.com/choucrifahed/quantscale,Scala Quantitative Finance Library.,True,False,choucrifahed/quantscale
|
||||
Scala Quant,Scala,2017-05-06,https://github.com/frankcash/Scala-Quant,Scala library for working with stock data from IFTTT recipes or Google Finance.,True,False,frankcash/Scala-Quant
|
||||
Jiji,Ruby,2019-01-22,https://github.com/unageanu/jiji2,Open Source Forex algorithmic trading framework using OANDA REST API.,True,False,unageanu/jiji2
|
||||
Tai,Elixir/Erlang,2022-10-04,https://github.com/fremantle-capital/tai,"Open Source composable, real time, market data and trade execution toolkit.",True,False,fremantle-capital/tai
|
||||
Workbench,Elixir/Erlang,2022-06-06,https://github.com/fremantle-industries/workbench,From Idea to Execution - Manage your trading operation across a globally distributed cluster,True,False,fremantle-industries/workbench
|
||||
Prop,Elixir/Erlang,2022-06-06,https://github.com/fremantle-industries/prop,"An open and opinionated trading platform using productive & familiar open source libraries and tools for strategy research, execution and operation.",True,False,fremantle-industries/prop
|
||||
Kelp,Golang,2021-11-26,https://github.com/stellar/kelp,Kelp is an open-source Golang algorithmic cryptocurrency trading bot that runs on centralized exchanges and Stellar DEX (command-line usage and desktop GUI).,True,False,stellar/kelp
|
||||
marketstore,Golang,2022-11-07,https://github.com/alpacahq/marketstore,DataFrame Server for Financial Timeseries Data.,True,False,alpacahq/marketstore
|
||||
IndicatorGo,Golang,2024-01-15,https://github.com/cinar/indicator,"IndicatorGo is a Golang module providing various stock technical analysis indicators, strategies, and a backtest framework for trading.",True,False,cinar/indicator
|
||||
TradeFrame,CPP,2023-10-02,https://github.com/rburkholder/trade-frame,C++ 17 based framework/library (with sample applications) for testing options based automated trading ideas using DTN IQ real time data feed and Interactive Brokers (TWS API) for trade execution. Comes with built-in [Option Greeks/IV](https://github.com/rburkholder/trade-frame/tree/master/lib/TFOptions) calculation library.,True,False,rburkholder/trade-frame
|
||||
QuantLib,Frameworks,,https://www.quantlib.org,The QuantLib project is aimed at providing a comprehensive software framework for quantitative finance.,False,False,
|
||||
JQuantLib,Frameworks,,http://www.jquantlib.org,Java port.,False,False,
|
||||
RQuantLib,Frameworks,,http://dirk.eddelbuettel.com/code/rquantlib.html,R port.,False,False,
|
||||
QuantLibAddin,Frameworks,,https://www.quantlib.org/quantlibaddin/,Excel support.,False,False,
|
||||
QuantLibXL,Frameworks,,https://www.quantlib.org/quantlibxl/,Excel support.,False,False,
|
||||
QLNet,Frameworks,2024-02-16,https://github.com/amaggiulli/qlnet,.Net port.,True,False,amaggiulli/qlnet
|
||||
PyQL,Frameworks,2023-11-08,https://github.com/enthought/pyql,Python port.,True,False,enthought/pyql
|
||||
QuantLib.jl,Frameworks,2020-02-18,https://github.com/pazzo83/QuantLib.jl,Julia port.,True,False,pazzo83/QuantLib.jl
|
||||
QuantLib-Python Documentation,Frameworks,,https://quantlib-python-docs.readthedocs.io/,Documentation for the Python bindings for the QuantLib library,False,False,
|
||||
QuantLib with Automatic Differention enabled,Frameworks,2024-01-09,https://github.com/auto-differentiation/quantlib-xad,Integration of Automatic Differentiation with the QuantLib library,True,False,auto-differentiation/quantlib-xad
|
||||
TA-Lib,Frameworks,,https://ta-lib.org,perform technical analysis of financial market data.,False,False,
|
||||
Portfolio Optimizer,Frameworks,,https://portfoliooptimizer.io/,Portfolio Optimizer is a Web API for portfolio analysis and optimization.,False,False,
|
||||
QuantConnect,CSharp,2024-02-16,https://github.com/QuantConnect/Lean,Lean Engine is an open-source fully managed C# algorithmic trading engine built for desktop and cloud usage.,True,False,QuantConnect/Lean
|
||||
StockSharp,CSharp,2024-02-17,https://github.com/StockSharp/StockSharp,"Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options).",True,False,StockSharp/StockSharp
|
||||
TDAmeritrade.DotNetCore,CSharp,2023-03-10,https://github.com/NVentimiglia/TDAmeritrade.DotNetCore,"Free, open-source .NET Client for the TD Ameritrade Trading Platform. Helps developers integrate TD Ameritrade API into custom trading solutions.",True,False,NVentimiglia/TDAmeritrade.DotNetCore
|
||||
QuantMath,Rust,2020-05-28,https://github.com/MarcusRainbow/QuantMath,Financial maths library for risk-neutral pricing and risk,True,False,MarcusRainbow/QuantMath
|
||||
Barter,Rust,2023-04-20,https://github.com/barter-rs/barter-rs,Open-source Rust framework for building event-driven live-trading & backtesting systems,True,False,barter-rs/barter-rs
|
||||
LFEST,Rust,2024-01-18,https://github.com/MathisWellmann/lfest-rs,Simulated perpetual futures exchange to trade your strategy against.,True,False,MathisWellmann/lfest-rs
|
||||
TradeAggregation,Rust,2024-01-28,https://github.com/MathisWellmann/trade_aggregation-rs,Aggregate trades into user-defined candles using information driven rules.,True,False,MathisWellmann/trade_aggregation-rs
|
||||
SlidingFeatures,Rust,2023-07-06,https://github.com/MathisWellmann/sliding_features-rs,Chainable tree-like sliding windows for signal processing and technical analysis.,True,False,MathisWellmann/sliding_features-rs
|
||||
RustQuant,Rust,2024-02-17,https://github.com/avhz/RustQuant,Quantitative finance library written in Rust.,True,False,avhz/RustQuant
|
||||
finalytics,Rust,2024-01-15,https://github.com/Nnamdi-sys/finalytics,A rust library for financial data analysis.,True,False,Nnamdi-sys/finalytics
|
||||
Derman Papers,"Reproducing Works, Training & Books",2017-10-21,https://github.com/MarcosCarreira/DermanPapers,Notebooks that replicate original quantitative finance papers from Emanuel Derman.,True,False,MarcosCarreira/DermanPapers
|
||||
ML-Quant,"Reproducing Works, Training & Books",,https://www.ml-quant.com/,"Top Quant resources like ArXiv (sanity), SSRN, RePec, Journals, Podcasts, Videos, and Blogs.",False,False,
|
||||
volatility-trading,"Reproducing Works, Training & Books",2023-04-10,https://github.com/jasonstrimpel/volatility-trading,A complete set of volatility estimators based on Euan Sinclair's Volatility Trading.,True,False,jasonstrimpel/volatility-trading
|
||||
quant,"Reproducing Works, Training & Books",2015-07-14,https://github.com/paulperry/quant,"Quantitative Finance and Algorithmic Trading exhaust; mostly ipython notebooks based on Quantopian, Zipline, or Pandas.",True,False,paulperry/quant
|
||||
fecon235,"Reproducing Works, Training & Books",2018-12-03,https://github.com/rsvp/fecon235,Open source project for software tools in financial economics. Many jupyter notebook to verify theoretical ideas and practical methods interactively.,True,False,rsvp/fecon235
|
||||
Quantitative-Notebooks,"Reproducing Works, Training & Books",2020-07-02,https://github.com/LongOnly/Quantitative-Notebooks,"Educational notebooks on quantitative finance, algorithmic trading, financial modelling and investment strategy",True,False,LongOnly/Quantitative-Notebooks
|
||||
QuantEcon,"Reproducing Works, Training & Books",,https://quantecon.org/,"Lecture series on economics, finance, econometrics and data science; QuantEcon.py, QuantEcon.jl, notebooks",False,False,
|
||||
FinanceHub,"Reproducing Works, Training & Books",2021-05-25,https://github.com/Finance-Hub/FinanceHub,Resources for Quantitative Finance,True,False,Finance-Hub/FinanceHub
|
||||
Python_Option_Pricing,"Reproducing Works, Training & Books",2017-07-26,https://github.com/dedwards25/Python_Option_Pricing,"An libary to price financial options written in Python. Includes: Black Scholes, Black 76, Implied Volatility, American, European, Asian, Spread Options.",True,False,dedwards25/Python_Option_Pricing
|
||||
python-training,"Reproducing Works, Training & Books",2023-11-27,https://github.com/jpmorganchase/python-training,J.P. Morgan's Python training for business analysts and traders.,True,False,jpmorganchase/python-training
|
||||
Stock_Analysis_For_Quant,"Reproducing Works, Training & Books",2024-02-13,https://github.com/LastAncientOne/Stock_Analysis_For_Quant,"Different Types of Stock Analysis in Excel, Matlab, Power BI, Python, R, and Tableau.",True,False,LastAncientOne/Stock_Analysis_For_Quant
|
||||
algorithmic-trading-with-python,"Reproducing Works, Training & Books",2021-06-01,https://github.com/chrisconlan/algorithmic-trading-with-python,Source code for Algorithmic Trading with Python (2020) by Chris Conlan.,True,False,chrisconlan/algorithmic-trading-with-python
|
||||
MEDIUM_NoteBook,"Reproducing Works, Training & Books",2023-12-17,https://github.com/cerlymarco/MEDIUM_NoteBook,Repository containing notebooks of [cerlymarco](https://github.com/cerlymarco)'s posts on Medium.,True,False,cerlymarco/MEDIUM_NoteBook
|
||||
QuantFinance,"Reproducing Works, Training & Books",2024-02-13,https://github.com/PythonCharmers/QuantFinance,Training materials in quantitative finance.,True,False,PythonCharmers/QuantFinance
|
||||
IPythonScripts,"Reproducing Works, Training & Books",2018-11-18,https://github.com/mgroncki/IPythonScripts,"Tutorials about Quantitative Finance in Python and QuantLib: Pricing, xVAs, Hedging, Portfolio Optimisation, Machine Learning and Deep Learning.",True,False,mgroncki/IPythonScripts
|
||||
Computational-Finance-Course,"Reproducing Works, Training & Books",2023-01-03,https://github.com/LechGrzelak/Computational-Finance-Course,Materials for the course of Computational Finance.,True,False,LechGrzelak/Computational-Finance-Course
|
||||
Machine-Learning-for-Asset-Managers,"Reproducing Works, Training & Books",2022-09-07,https://github.com/emoen/Machine-Learning-for-Asset-Managers,"Implementation of code snippets, exercises and application to live data from Machine Learning for Asset Managers (Elements in Quantitative Finance) written by Prof. Marcos López de Prado.",True,False,emoen/Machine-Learning-for-Asset-Managers
|
||||
Python-for-Finance-Cookbook,"Reproducing Works, Training & Books",2023-01-18,https://github.com/PacktPublishing/Python-for-Finance-Cookbook,"Python for Finance Cookbook, published by Packt.",True,False,PacktPublishing/Python-for-Finance-Cookbook
|
||||
modelos_vol_derivativos,"Reproducing Works, Training & Books",2023-08-19,https://github.com/ysaporito/modelos_vol_derivativos,"""Modelos de Volatilidade para Derivativos"" book's Jupyter notebooks",True,False,ysaporito/modelos_vol_derivativos
|
||||
NMOF,"Reproducing Works, Training & Books",2023-12-29,https://github.com/enricoschumann/NMOF,"Functions, examples and data from the first and the second edition of ""Numerical Methods and Optimization in Finance"" by M. Gilli, D. Maringer and E. Schumann (2019, ISBN:978-0128150658).",True,False,enricoschumann/NMOF
|
||||
py4fi2nd,"Reproducing Works, Training & Books",2023-10-15,https://github.com/yhilpisch/py4fi2nd,"Jupyter Notebooks and code for Python for Finance (2nd ed., O'Reilly) by Yves Hilpisch.",True,False,yhilpisch/py4fi2nd
|
||||
aiif,"Reproducing Works, Training & Books",2023-10-09,https://github.com/yhilpisch/aiif,Jupyter Notebooks and code for the book Artificial Intelligence in Finance (O'Reilly) by Yves Hilpisch.,True,False,yhilpisch/aiif
|
||||
py4at,"Reproducing Works, Training & Books",2023-10-09,https://github.com/yhilpisch/py4at,Jupyter Notebooks and code for the book Python for Algorithmic Trading (O'Reilly) by Yves Hilpisch.,True,False,yhilpisch/py4at
|
||||
dawp,"Reproducing Works, Training & Books",2021-02-22,https://github.com/yhilpisch/dawp,Jupyter Notebooks and code for Derivatives Analytics with Python (Wiley Finance) by Yves Hilpisch.,True,False,yhilpisch/dawp
|
||||
dx,"Reproducing Works, Training & Books",2020-12-17,https://github.com/yhilpisch/dx,DX Analytics | Financial and Derivatives Analytics with Python.,True,False,yhilpisch/dx
|
||||
QuantFinanceBook,"Reproducing Works, Training & Books",2022-08-28,https://github.com/LechGrzelak/QuantFinanceBook,Quantitative Finance book.,True,False,LechGrzelak/QuantFinanceBook
|
||||
rough_bergomi,"Reproducing Works, Training & Books",2018-09-17,https://github.com/ryanmccrickerd/rough_bergomi,A Python implementation of the rough Bergomi model.,True,False,ryanmccrickerd/rough_bergomi
|
||||
frh-fx,"Reproducing Works, Training & Books",2018-05-24,https://github.com/ryanmccrickerd/frh-fx,A python implementation of the fast-reversion Heston model of Mechkov for FX purposes.,True,False,ryanmccrickerd/frh-fx
|
||||
Value Investing Studies,"Reproducing Works, Training & Books",2021-10-26,https://github.com/euclidjda/value-investing-studies,A collection of data analysis studies that examine the performance and characteristics of value investing over long periods of time.,True,False,euclidjda/value-investing-studies
|
||||
Machine Learning Asset Management,"Reproducing Works, Training & Books",2021-12-17,https://github.com/firmai/machine-learning-asset-management,Machine Learning in Asset Management (by @firmai).,True,False,firmai/machine-learning-asset-management
|
||||
Deep Learning Machine Learning Stock,"Reproducing Works, Training & Books",2023-11-03,https://github.com/LastAncientOne/Deep-Learning-Machine-Learning-Stock,Deep Learning and Machine Learning stocks represent a promising long-term or short-term opportunity for investors and traders.,True,False,LastAncientOne/Deep-Learning-Machine-Learning-Stock
|
||||
Technical Analysis and Feature Engineering,"Reproducing Works, Training & Books",2024-02-16,https://github.com/jo-cho/Technical_Analysis_and_Feature_Engineering,Feature Engineering and Feature Importance of Machine Learning in Financial Market.,True,False,jo-cho/Technical_Analysis_and_Feature_Engineering
|
||||
Differential Machine Learning and Axes that matter by Brian Huge and Antoine Savine,"Reproducing Works, Training & Books",2022-10-05,https://github.com/differential-machine-learning/notebooks,"Implement, demonstrate, reproduce and extend the results of the Risk articles 'Differential Machine Learning' (2020) and 'PCA with a Difference' (2021) by Huge and Savine, and cover implementation details left out from the papers.",True,False,differential-machine-learning/notebooks
|
||||
systematictradingexamples,"Reproducing Works, Training & Books",2020-07-22,https://github.com/robcarver17/systematictradingexamples,Examples of code related to book [Systematic Trading](www.systematictrading.org) and [blog](http://qoppac.blogspot.com),True,False,robcarver17/systematictradingexamples
|
||||
pysystemtrade_examples,"Reproducing Works, Training & Books",2018-02-21,https://github.com/robcarver17/pysystemtrade_examples,Examples using pysystemtrade for Robert Carver's [blog](http://qoppac.blogspot.com).,True,False,robcarver17/pysystemtrade_examples
|
||||
ML_Finance_Codes,"Reproducing Works, Training & Books",2020-06-13,https://github.com/mfrdixon/ML_Finance_Codes,Machine Learning in Finance: From Theory to Practice Book,True,False,mfrdixon/ML_Finance_Codes
|
||||
Hands-On Machine Learning for Algorithmic Trading,"Reproducing Works, Training & Books",2023-01-18,https://github.com/packtpublishing/hands-on-machine-learning-for-algorithmic-trading,"Hands-On Machine Learning for Algorithmic Trading, published by Packt",True,False,packtpublishing/hands-on-machine-learning-for-algorithmic-trading
|
||||
financialnoob-misc,"Reproducing Works, Training & Books",2023-06-06,https://github.com/financialnoob/misc,Codes from @financialnoob's posts,True,False,financialnoob/misc
|
||||
MesoSim Options Trading Strategy Library,"Reproducing Works, Training & Books",2023-11-24,https://github.com/deltaray-io/strategy-library,Free and public Options Trading strategy library for MesoSim. ,True,False,deltaray-io/strategy-library
|
||||
Quant-Finance-With-Python-Code,"Reproducing Works, Training & Books",2023-11-16,https://github.com/lingyixu/Quant-Finance-With-Python-Code,Repo for code examples in Quantitative Finance with Python by Chris Kelliher,True,False,lingyixu/Quant-Finance-With-Python-Code
|
||||
QuantFinanceTraining,"Reproducing Works, Training & Books",2023-12-12,https://github.com/JoaoJungblut/QuantFinanceTraining,"This repository contains codes that were executed during my training in the CQF (Certificate in Quantitative Finance). The codes are organized by class, facilitating navigation and reference.",True,False,JoaoJungblut/QuantFinanceTraining
|
||||
Statistical-Learning-based-Portfolio-Optimization,"Reproducing Works, Training & Books",2023-11-27,https://github.com/YannickKae/Statistical-Learning-based-Portfolio-Optimization,"This R Shiny App utilizes the Hierarchical Equal Risk Contribution (HERC) approach, a modern portfolio optimization method developed by Raffinot (2018).",True,False,YannickKae/Statistical-Learning-based-Portfolio-Optimization
|
||||
|
@@ -0,0 +1,28 @@
|
||||
---
|
||||
title: "Projects"
|
||||
format:
|
||||
html:
|
||||
df-print: kable
|
||||
include-in-header:
|
||||
- text: |
|
||||
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7994446359957143"
|
||||
crossorigin="anonymous"></script>
|
||||
---
|
||||
|
||||
Compilation of projects providing access to the date of last commit or publication date.
|
||||
|
||||
```{r message=FALSE, warning=FALSE, echo=FALSE, table.cap="Projects"}
|
||||
#| label: tbl-projects
|
||||
#| tbl-cap: Projects
|
||||
#| results: asis
|
||||
|
||||
library(tidyverse)
|
||||
|
||||
df <- readr::read_csv("projects.csv")
|
||||
dt <- df |>
|
||||
filter(!is.na(last_commit)) |>
|
||||
mutate(project=paste0("<a href='", url, "'>", project, "</a>")) |>
|
||||
select(project, section, last_commit) |>
|
||||
arrange(desc(last_commit), section)
|
||||
htmltools::tagList(DT::datatable(dt, list(pageLength = 50), escape = FALSE))
|
||||
```
|
||||
Reference in New Issue
Block a user