{"id":34033076,"url":"https://github.com/tfukaza/harvest","last_synced_at":"2026-03-17T22:40:30.505Z","repository":{"id":39758684,"uuid":"380357668","full_name":"tfukaza/harvest","owner":"tfukaza","description":"Simple and intuitive Python framework for algorithmic trading. Easily create bots to live and paper trade stocks, crypto, and options!","archived":false,"fork":false,"pushed_at":"2026-03-11T05:10:37.000Z","size":3655,"stargazers_count":146,"open_issues_count":9,"forks_count":28,"subscribers_count":12,"default_branch":"main","last_synced_at":"2026-03-11T10:49:28.383Z","etag":null,"topics":["algorithmic-trading","backtesting","cryptocurrency","options","paper-trading","python","stock","trading","trading-bot"],"latest_commit_sha":null,"homepage":"https://tfukaza.github.io/harvest-website","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tfukaza.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2021-06-25T21:29:38.000Z","updated_at":"2026-03-11T04:53:45.000Z","dependencies_parsed_at":"2024-05-19T19:25:19.970Z","dependency_job_id":"cc895126-1dc9-484c-bdaf-d56634e62e4d","html_url":"https://github.com/tfukaza/harvest","commit_stats":{"total_commits":829,"total_committers":9,"mean_commits":92.11111111111111,"dds":0.3606755126658625,"last_synced_commit":"bbaeebcf80d3629226b5d253d08f5a894c9431f1"},"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/tfukaza/harvest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tfukaza%2Fharvest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tfukaza%2Fharvest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tfukaza%2Fharvest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tfukaza%2Fharvest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tfukaza","download_url":"https://codeload.github.com/tfukaza/harvest/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tfukaza%2Fharvest/sbom","scorecard":{"id":875967,"data":{"date":"2025-08-11","repo":{"name":"github.com/tfukaza/harvest","commit":"51d8c08f12b394051462f230058fb121339d153a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.5,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":4,"reason":"Found 3/7 approved changesets -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":3,"reason":"4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/deploy.yml:1","Warn: no topLevel permission defined: .github/workflows/parse_docstring.yml:1","Warn: no topLevel permission defined: .github/workflows/run-tests.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/tfukaza/harvest/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/tfukaza/harvest/deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/tfukaza/harvest/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/parse_docstring.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/tfukaza/harvest/parse_docstring.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/parse_docstring.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/tfukaza/harvest/parse_docstring.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/parse_docstring.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/tfukaza/harvest/parse_docstring.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tests.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/tfukaza/harvest/run-tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tests.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/tfukaza/harvest/run-tests.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/run-tests.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/tfukaza/harvest/run-tests.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/run-tests.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/tfukaza/harvest/run-tests.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yml:21","Warn: pipCommand not pinned by hash: .github/workflows/parse_docstring.yml:20","Warn: pipCommand not pinned by hash: .github/workflows/parse_docstring.yml:21","Warn: pipCommand not pinned by hash: .github/workflows/parse_docstring.yml:22","Warn: pipCommand not pinned by hash: .github/workflows/run-tests.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/run-tests.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/run-tests.yml:33","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   7 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-24T06:00:13.932Z","repository_id":39758684,"created_at":"2025-08-24T06:00:13.932Z","updated_at":"2025-08-24T06:00:13.932Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30633585,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T22:38:22.569Z","status":"ssl_error","status_checked_at":"2026-03-17T22:38:11.804Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithmic-trading","backtesting","cryptocurrency","options","paper-trading","python","stock","trading","trading-bot"],"created_at":"2025-12-13T19:01:42.045Z","updated_at":"2026-03-17T22:40:30.496Z","avatar_url":"https://github.com/tfukaza.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Header](docs/banner.png)\u003cbr /\u003e\nHarvest is a simple yet flexible Python framework for algorithmic trading. Paper trade and live trade stocks, cryptos, and options![^1][^2] Visit [**here**](https://tfukaza.github.io/harvest-website) for tutorials and documentation.\n\n\u003cbr /\u003e\n\n\n[![codecov](https://codecov.io/gh/tfukaza/harvest/branch/main/graph/badge.svg?token=NQMXTBK2UO)](https://codecov.io/gh/tfukaza/harvest)\n![run tests](https://github.com/tfukaza/harvest/actions/workflows/run-tests.yml/badge.svg)\n[![Code style: Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n---\n\n**⚠️WARNING⚠️**\nHarvest is currently at **v0.3**. The program is unstable and contains many bugs. Use with caution, and contributions are greatly appreciated.\n- 🪲 [File a bug report](https://github.com/tfukaza/harvest/issues/new?assignees=\u0026labels=bug\u0026template=bug_report.md\u0026title=%5B%F0%9F%AA%B0BUG%5D)\n- 💡 [Submit a feature suggestion](https://github.com/tfukaza/harvest/issues/new?assignees=\u0026labels=enhancement%2C+question\u0026template=feature-request.md\u0026title=%5B%F0%9F%92%A1Feature+Request%5D)\n- 📝 [Request documentation](https://github.com/tfukaza/harvest/issues/new?assignees=\u0026labels=documentation\u0026template=documentation.md\u0026title=%5B%F0%9F%93%9DDocumentation%5D)\n\n# See for yourself!\nThe example below is an algorithm to trade Twitter stocks using the moving average crossover strategy.\n```python\nfrom harvest.algo import *\nfrom harvest.trader import *\n\nclass Watch(BaseAlgo):\n    def config(self):\n        self.watchlist = [\"TWTR\"]\n        self.interval = \"5MIN\"\n\n    def main(self):\n        sma_long = self.sma(period=50)\n        sma_short = self.sma(period=20)\n        if self.crossover(sma_long, sma_short):\n            self.buy()\n        elif self.crossover(sma_short, sma_long):\n            self.sell()\n```\nTo paper trade using this algorithm, run the following command:\n```bash\nharvest start -s yahoo -b paper\n```\nTo live trade using Robinhood, run:\n```bash\nharvest start -s robinhood -b robinhood\n```\nWith Harvest, the process of testing and deploying your strategies is a piece of cake 🍰\n\n# Installation\nThe only requirement is to have **Python 3.12 or newer**.\n\nOnce you're ready, install [uv](https://docs.astral.sh/uv/). If you want the Harvest CLI available on your machine, install it with:\n```bash\nuv tool install harvest-python\n```\n\nIf you are adding Harvest to another Python project, use:\n```bash\nuv add harvest-python\n```\n\nNext, install the dependencies necessary for the brokerage of your choice:\n```bash\nuv add 'harvest-python[BROKER]'\n```\nReplace `BROKER` with a brokerage/data source of your choice in lowercase:\n- Robinhood\n- Alpaca\n- Webull\n- Kraken\n- Polygon\n\nIf you installed Harvest as a tool, you can run commands directly:\n```bash\nharvest start -s yahoo -b paper\n```\n\nIf you added Harvest to a project, run commands with `uv run`, for example:\n```bash\nuv run harvest start -s yahoo -b paper\n```\n\nNow you're all set.\n\n# Contributing\nContributions are greatly appreciated. Check out the [CONTRIBUTING](CONTRIBUTING.md) document for details, and [ABOUT](ABOUT.md) for the long-term goals of this project.\n\n# Disclaimer\n- Harvest is not officially associated with Robinhood, Alpaca, Webull, Kraken, Polygon, or Yahoo.\n- Many of the brokers were also not designed to be used for algo-trading. Excessive access to their API can result in your account getting locked.\n- Tutorials and documentation solely exist to provide technical references of the code. They are not recommendations of any specific securities or strategies.\n- Use Harvest at your own responsibility. Developers of Harvest take no responsibility for any financial losses you incur by using Harvest. By using Harvest, you certify you understand that Harvest is a software in early development and may contain bugs and unexpected behaviors.\n\n# Linter\n- Trunk is a wrapper around linters. see `trunk.yaml` for details on which linters are enabled\n- Currently we run `ruff` which supports isort, pylint, black\n- For the best experience, please install the proper extensions under vscode \"recommended extensions\"\n- To run lint checks manually, use `trunk check`, to run formatters, use `trunk fmt`\n- To run lint \u0026 format checks automatically, install the extensions recommended and save\n\n[^1]: What assets you can trade depends on the broker you are using.\n[^2]: Backtesting is also available, but it is not supported for options.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftfukaza%2Fharvest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftfukaza%2Fharvest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftfukaza%2Fharvest/lists"}