Investing library and command-line interface inspired by the Bogleheads philosophy

Overview

Lakshmi

pre-commit.ci status

Screenshot of lak in action (Screenshot of the lak command in action)

Background

This project is inspired by Bogleheads forum. Bogleheads focus on a simple but powerful philosophy that allows investors to achieve above-average returns after costs. This tool is built around the same principles to help an average investor manage their investing portfolio.

Lakshmi (meaning "She who leads to one's goal") is one of the principal goddesses in Hinduism. She is the goddess of wealth, fortune, power, health, love, beauty, joy and prosperity.

Introduction

This project consists of a library module (lakshmi) and a command-line tool (lak) that exposes some of the functionality of the library. The library provides useful abstractions and tools to manage your investing portfolio.

Bogleheads wiki is a great resource for introduction to basic investing concepts like asset-allocation, asset-location, etc.

The following features are currently available:

  • Specify and track asset allocation across accounts.
  • Ability to add/edit/delete accounts and assets (funds, stocks, etc.) inside those accounts.
  • Supports manual assets, assets with ticker, Vanguard funds (that don't have associated ticker symbols), EE Bonds and I Bonds.
  • Automatic fetching of market value of various types of assets.
  • Listing current values of assets, asset allocation and asset location.
  • Tracking of tax-lot information for assets.
  • Support for running what-if scenarios to see how it impacts the overall asset allocation.
  • Analysis of portfolio to identify if there is need to rebalance or if there are losses that can be harvested.

Installation

This project can be installed via pip. To install the library and the lak command line tool, run:

pip install lakshmi

Command-line interface

(For detailed help, please see lak user guide)

The simplest way to use this project is via the lak command. To access the up to date help, run:

$ lak --help
Usage: lak [OPTIONS] COMMAND [ARGS]...

  lak is a simple command line tool inspired by Bogleheads philosophy.
  Detailed user guide is available at:
  https://sarvjeets.github.io/lakshmi/docs/lak.html

Options:
  --version          Show the version and exit.
  -r, --refresh      Re-fetch all data instead of using previously cached
                     data. For large portfolios, this would be extremely slow.
  -c, --config PATH  The configuration file.  [env var: LAK_CONFIG; default:
                     ~/.lakrc]
  --help             Show this message and exit.

Commands:
  add      Add new accounts or assets to the portfolio.
  analyze  Analyze the portfolio.
  delete   Delete an account or asset.
  edit     Edit parts of the portfolio.
  info     Print detailed information about an asset or account.
  init     Initializes a new portfolio by adding asset classes.
  list     Command to list various parts of the portfolio.
  whatif   Run hypothetical what if scenarios by modifying the total...

A new portfolio can be created by either:

  1. Copying an existing portfolio file to ~/portfolio.yaml and editing it.

-- OR --

  1. Using the lak commands to create a new portfolio. The following command will open up an editor to input the desired asset allocation:
$ lak init

Accounts (His/Her 401(k), Roth IRAs, Taxable, etc.) can be added via the lak add account command:

$ lak add account
# Use the above command multiple times to add more accounts.

Assets can be added to an account via the lak add asset command. Different kinds of assets can be added to a portfolio. For a complete list, pull up the help for the command:

$ lak add asset --help

Usage: lak add asset [OPTIONS]

  Edit assets in the portfolio.

Options:
  -p, --asset-type [ManualAsset|TickerAsset|VanguardFund|IBonds|EEBonds]
                                  Add this type of asset.  [required]
  -t, --account substr            Add asset to this account (a sub-string that
                                  matches the account name).  [required]
  --help                          Show this message and exit.

TickerAsset represents an asset with a ticker symbol. The value of these assets is updated automatically. To add a TickerAsset:

lak add asset -p TickerAsset -t account_str

where account_str is a sub-string that uniquely matches an account added previously.

That's it. To view all the assets, asset allocation and asset location, run:

lak list assets total aa al

For more detailed information about the tool, please see lak user guide.

Library

The lakshmi library can also be used directly. The modules and classes are well documented and there are numerous examples for using each method or class in the tests accompanying this package. For example, the example portfolio can be constructed and the asset allocation, etc. can be printed by the following piece of code:

from lakshmi import Account, AssetClass, Portfolio
from lakshmi.assets import TaxLot, TickerAsset
from lakshmi.table import Table


def main():
    asset_class = (
        AssetClass('All')
        .add_subclass(0.6, AssetClass('Equity')
                      .add_subclass(0.6, AssetClass('US'))
                      .add_subclass(0.4, AssetClass('Intl')))
        .add_subclass(0.4, AssetClass('Bonds')))
    portfolio = Portfolio(asset_class)

    (portfolio
     .add_account(Account('Schwab Taxable', 'Taxable')
                  .add_asset(TickerAsset('VTI', 1, {'US': 1.0})
                             .set_lots([TaxLot('2021/07/31', 1, 226)]))
                  .add_asset(TickerAsset('VXUS', 1, {'Intl': 1.0})
                             .set_lots([TaxLot('2021/07/31', 1, 64.94)])))
     .add_account(Account('Roth IRA', 'Tax-Exempt')
                  .add_asset(TickerAsset('VXUS', 1, {'Intl': 1.0})))
     .add_account(Account('Vanguard 401(k)', 'Tax-Deferred')
                  .add_asset(TickerAsset('VBMFX', 20, {'Bonds': 1.0}))))

    # Save the portfolio
    # portfolio.Save('portfolio.yaml')
    print('\n' + portfolio.asset_allocation_compact().string() + '\n')
    print(Table(2, coltypes=['str', 'dollars'])
          .add_row(['Total Assets', portfolio.total_value()]).string())
    print('\n' + portfolio.asset_allocation(['US', 'Intl', 'Bonds']).string())
    print('\n' + portfolio.assets().string() + '\n')
    print(portfolio.asset_location().string())


if __name__ == "__main__":
    main()

Contributing

I'm looking for contributors for this project. If you are interested, please contact me over email.

License

Distributed under the MIT License. See LICENSE for more information.

Acknowledgements

This project would not have been possible without my wife Niharika, who encouraged me to start working on this project and continued supporting me throughout the development.

In addition, I am indebted to the following folks whose wisdom has helped me tremendously in my investing journey: John Bogle, Taylor Larimore, Nisiprius, Livesoft, Mel Lindauer and LadyGeek.

The not-so-fine print

The author is not a financial adviser and you agree to treat this tool for informational purposes only. The author does not promise or guarantee that the information provided by this tool is correct, current, or complete, and it may contain technical inaccuracies or errors. The author is not liable for any losses that you might incur by acting on the information provided by this tool. Accordingly, you should confirm the accuracy and completeness of all content, and seek professional advice taking into account your own personal situation, before making any decision based on information from this tool.

In a nutshell:

  • The information provided by this tool is not financial advice.
  • The author is not an expert or financial adviser.
  • Consult a financial and/or tax adviser before taking action.
Comments
  • Init fails

    Init fails

    macOS - M1 Max installed with pip Python 3.9.12

    lak --help returns help correctly.

    lak init fails after a couple of seconds... printing Aborted! and attempting to open a editor to editor-{RANDOM}.txt

    I'm not a python developer but I have to run a few other python CLI tools from time to time.

    bug 
    opened by sirtimbly 5
  • Some assets do not have long names on YT finance

    Some assets do not have long names on YT finance

    When looking up the BTC-USD asset, I get the following traceback:

    Traceback (most recent call last): File "/home/josh/.local/bin/lak", line 8, in <module> sys.exit(lak()) File "/home/josh/.local/lib/python3.8/site-packages/click/core.py", line 1128, in __call__ return self.main(*args, **kwargs) File "/home/josh/.local/lib/python3.8/site-packages/click/core.py", line 1053, in main rv = self.invoke(ctx) File "/home/josh/.local/lib/python3.8/site-packages/click/core.py", line 1659, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/home/josh/.local/lib/python3.8/site-packages/click/core.py", line 1690, in invoke rv.append(sub_ctx.command.invoke(sub_ctx)) File "/home/josh/.local/lib/python3.8/site-packages/click/core.py", line 1395, in invoke return ctx.invoke(self.callback, **ctx.params) File "/home/josh/.local/lib/python3.8/site-packages/click/core.py", line 754, in invoke return __callback(*args, **kwargs) File "/home/josh/.local/lib/python3.8/site-packages/lakshmi/lak.py", line 272, in assets output = portfolio.assets( File "/home/josh/.local/lib/python3.8/site-packages/lakshmi/lakshmi.py", line 636, in assets + [asset.name(), asset.adjusted_value()]) File "/home/josh/.local/lib/python3.8/site-packages/lakshmi/cache.py", line 174, in new_func value = call_func(class_obj, func) File "/home/josh/.local/lib/python3.8/site-packages/lakshmi/cache.py", line 138, in call_func return func(class_obj) File "/home/josh/.local/lib/python3.8/site-packages/lakshmi/assets.py", line 489, in name raise NotFoundError( lakshmi.assets.NotFoundError: Cannot retrieve ticker ("BTC-USD") from Yahoo Finance

    I found that this asset does not actually have a longName field in the ticker object provided by YT API. There are a few other name fields so I've got a PR coming shortly to try to fall back to some other naming fields if the longName field does not exist.

    bug 
    opened by bolapara 4
  • lak analyze rebalance - missing custom class

    lak analyze rebalance - missing custom class

    I added a class called US_Ext for extended market since my 401k plan doesn't have a total market fund but has a s&p 500 and extended market. When I run rebalance, it seems to miss the US_Ext class.

    lak analyze rebalance Class Actual% Desired% Value Difference


    US 83% 59% $189,381.65 -$53,901.82 Bonds 2% 10% $4,820.86 +$18,126.26 Intl 3% 18% $7,061.55 +$34,243.28

    lak list aa shows the US_Ext class

    documentation 
    opened by mhenke 3
  • ERROR: Could not find a version that satisfies the requirement lakshmi

    ERROR: Could not find a version that satisfies the requirement lakshmi

    [email protected]:$ python --version Python 3.8.10 [email protected]:$ pip install lakshmi ERROR: Could not find a version that satisfies the requirement lakshmi (from versions: none) ERROR: No matching distribution found for lakshmi

    pip -V pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)

    opened by mhenke 3
  • Feature: handle zero ratio in `analyze allocate --rebalance`

    Feature: handle zero ratio in `analyze allocate --rebalance`

    It can be convenient to set an asset class allocation ratio to 0, for example to exit a position of a certain fund or market segment.

    It seems like most lak commands handle this just fine, however lak analyze allocate --rebalance does not allow this.

    $ lak analyze allocate --account MyBrokerage --rebalance
    <...>
    AssertionError: Desired ratio of asset class MyZeroAsset cannot be zero.
    

    I think this should work. The MyZeroAsset asset should be rebalanced to 0 and the funds moved to other assets.

    A hacky work around is to set the ratio to to almost zero e.g. 0.00000000000001.

    opened by rapidleft 2
  • Feature: Rebalanced based on a band and within Accounts for portfolio

    Feature: Rebalanced based on a band and within Accounts for portfolio

    Hi,

    I setup my yaml file and everything is working. I was wondering if you could add an option in rebalance to also show suggestions for re-balancing within accounts to obtain the desired % for the portfolio as a whole. The account rebalance could use this strategy. https://www.bogleheads.org/wiki/Tax-efficient_fund_placement#Assigning_asset_classes_to_different_accounts.

    A caveat would you the dollar limits of what is in each account when using the assignment strategy

    command: lak analyze rebalance -strategy

    display: Class | Actual% | Desired% | Account | Value | Difference

    enhancement 
    opened by mhenke 2
  • lakshmi.assets.NotFoundError: Cannot retrieve ticker (

    lakshmi.assets.NotFoundError: Cannot retrieve ticker ("VTI") from Yahoo Finance

    Hi,

    I haven't used lak for awhile. I tried today and received this error: lakshmi.assets.NotFoundError: Cannot retrieve ticker ("VTI") from Yahoo Finance. I used the already setup portfolio for testing.

    Below is the command I ran and the output.

    [email protected]:~$ lak --debug -r list assets total aa al performance Traceback (most recent call last): File "/home/mhenke/.local/bin/lak", line 8, in sys.exit(lak()) File "/home/mhenke/.local/lib/python3.8/site-packages/click/core.py", line 1128, in call return self.main(*args, **kwargs) File "/home/mhenke/.local/lib/python3.8/site-packages/click/core.py", line 1053, in main rv = self.invoke(ctx) File "/home/mhenke/.local/lib/python3.8/site-packages/click/core.py", line 1659, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/home/mhenke/.local/lib/python3.8/site-packages/click/core.py", line 1690, in invoke rv.append(sub_ctx.command.invoke(sub_ctx)) File "/home/mhenke/.local/lib/python3.8/site-packages/click/core.py", line 1395, in invoke return ctx.invoke(self.callback, **ctx.params) File "/home/mhenke/.local/lib/python3.8/site-packages/click/core.py", line 754, in invoke return __callback(*args, **kwargs) File "/home/mhenke/.local/lib/python3.8/site-packages/lakshmi/lak.py", line 328, in assets output = portfolio.assets( File "/home/mhenke/.local/lib/python3.8/site-packages/lakshmi/lakshmi.py", line 712, in assets + [asset.name(), asset.adjusted_value()]) File "/home/mhenke/.local/lib/python3.8/site-packages/lakshmi/assets.py", line 176, in adjusted_value return max(0, self.value() + self.get_what_if()) File "/home/mhenke/.local/lib/python3.8/site-packages/lakshmi/assets.py", line 428, in value return self.shares() * self.price() File "/home/mhenke/.local/lib/python3.8/site-packages/lakshmi/cache.py", line 211, in new_func value = _call_func(class_obj, func) File "/home/mhenke/.local/lib/python3.8/site-packages/lakshmi/cache.py", line 178, in _call_func return func(class_obj) File "/home/mhenke/.local/lib/python3.8/site-packages/lakshmi/assets.py", line 539, in price raise NotFoundError( lakshmi.assets.NotFoundError: Cannot retrieve ticker ("VTI") from Yahoo Finance

    opened by mhenke 1
  • Bump certifi from 2022.9.24 to 2022.12.7

    Bump certifi from 2022.9.24 to 2022.12.7

    Bumps certifi from 2022.9.24 to 2022.12.7.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump lxml from 4.9.0 to 4.9.1

    Bump lxml from 4.9.0 to 4.9.1

    Bumps lxml from 4.9.0 to 4.9.1.

    Changelog

    Sourced from lxml's changelog.

    4.9.1 (2022-07-01)

    Bugs fixed

    • A crash was resolved when using iterwalk() (or canonicalize()) after parsing certain incorrect input. Note that iterwalk() can crash on valid input parsed with the same parser after failing to parse the incorrect input.
    Commits
    • d01872c Prevent parse failure in new test from leaking into later test runs.
    • d65e632 Prepare release of lxml 4.9.1.
    • 86368e9 Fix a crash when incorrect parser input occurs together with usages of iterwa...
    • 50c2764 Delete unused Travis CI config and reference in docs (GH-345)
    • 8f0bf2d Try to speed up the musllinux AArch64 build by splitting the different CPytho...
    • b9f7074 Remove debug print from test.
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump lxml from 4.6.4 to 4.6.5

    Bump lxml from 4.6.4 to 4.6.5

    Bumps lxml from 4.6.4 to 4.6.5.

    Changelog

    Sourced from lxml's changelog.

    4.6.5 (2021-12-12)

    Bugs fixed

    • A vulnerability (GHSL-2021-1038) in the HTML cleaner allowed sneaking script content through SVG images.

    • A vulnerability (GHSL-2021-1037) in the HTML cleaner allowed sneaking script content through CSS imports and other crafted constructs.

    Commits
    • a9611ba Fix a test in Py2.
    • a3eacbc Prepare release of 4.6.5.
    • b7ea687 Update changelog.
    • 69a7473 Cleaner: cover some more cases where scripts could sneak through in specially...
    • 54d2985 Fix condition in test decorator.
    • 4b220b5 Use the non-depcrecated TextTestResult instead of _TextTestResult (GH-333)
    • d85c6de Exclude a test when using the macOS system libraries because it fails with li...
    • cd4bec9 Add macOS-M1 as wheel build platform.
    • fd0d471 Install automake and libtool in macOS build to be able to install the latest ...
    • f233023 Cleaner: Remove SVG image data URLs since they can embed script content.
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump virtualenv from 20.9.0 to 20.10.0

    Bump virtualenv from 20.9.0 to 20.10.0

    Bumps virtualenv from 20.9.0 to 20.10.0.

    Changelog

    Sourced from virtualenv's changelog.

    v20.10.0 (2021-11-01)

    Features - 20.10.0

    - If a ``"venv"`` install scheme exists in ``sysconfig``, virtualenv now uses it to create new virtual environments.
      This allows Python distributors, such as Fedora, to patch/replace the default install scheme without affecting
      the paths in new virtual environments.
      A similar technique `was proposed to Python, for the venv module <https://bugs.python.org/issue45413>`_ - by ``hroncok`` (`[#2208](https://github.com/pypa/virtualenv/issues/2208) <https://github.com/pypa/virtualenv/issues/2208>`_)
    - The activated virtualenv prompt is now always wrapped in parentheses. This
      affects venvs created with the ``--prompt`` attribute, and matches virtualenv's
      behaviour on par with venv. (`[#2224](https://github.com/pypa/virtualenv/issues/2224) <https://github.com/pypa/virtualenv/issues/2224>`_)
    

    Bugfixes - 20.10.0

    • Fix broken prompt set up by activate.bat - by :user:SiggyBar. ([#2225](https://github.com/pypa/virtualenv/issues/2225) <https://github.com/pypa/virtualenv/issues/2225>_)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • add option to use different portfolio file

    add option to use different portfolio file

    As a user, I would like to easily switch between different portfolio.yaml. For example, I have portfolio_mh.yaml which has my portfolio and portfolio_sh.yaml which has my wife's.

    command might be:

    • lak --file portfolio_mh.yaml -r list assets total aa al
    • lak --file portfolio_sh.yaml -r list assets total aa al
    opened by mhenke 1
Releases(v2.8.0)
  • v2.8.0(Sep 29, 2022)

    What's Changed

    • lak commands now don't print stack trace by default. Added a flag --debug to enable printing of the stack trace.

    Full Changelog: https://github.com/sarvjeets/lakshmi/compare/v2.7.0...v2.8.0

    Source code(tar.gz)
    Source code(zip)
  • v2.7.0(Jul 23, 2022)

    Changes in this version

    • Added functionality in lak list lots to optionally print account names and terms for the tax lots.
    • `lak analyze allocate' now supports asset classes with zero desired ratio. Thanks rapidleft.

    New Contributors

    • @rapidleft made their first contribution in https://github.com/sarvjeets/lakshmi/pull/50

    Full Changelog: https://github.com/sarvjeets/lakshmi/compare/v2.6.0...v2.7.0

    Source code(tar.gz)
    Source code(zip)
  • v2.6.0(Jun 22, 2022)

    lak commands that access the whole portfolio (e.g. lak list assets) now uses multiple threads to fetch asset values, thus speeding up fetches considerably.

    Added

    • Added functionality in the cache module to prefetch multiple cached objects in parallel threads.
    • Added prefetch method in assets that calls the newly added functionality in the cache module. Also, added a prefetch method to portfolio that prefetches the prices/names for all the assets in the portfolio in parallel.

    Changed

    • lak command that access the whole portfolio now uses prefetch to speed up refreshing the prices of the portfolio by using multiple threads to do so.

    Full Changelog: https://github.com/sarvjeets/lakshmi/compare/v2.5.0...v2.6.0

    Source code(tar.gz)
    Source code(zip)
  • v2.5.0(Apr 24, 2022)

    What's Changed

    Added

    • A new command lak analyze allocate which suggests how to allocate new cash, while making sure the actual asset allocation remains close to the desired allocation. This command can also be used to get rebalancing suggestions or to withdraw money from the portfolio. In all cases, it will suggest changes that will minimize the relative difference between actual asset allocation and the desired asset allocation.
    • A new recipes doc documenting tips and tricks for using Lakshmi.

    Changed

    • Changed some of the common methods to return percentages rounded to 1 digit rather than 0.
    • Earlier asset classes with no money mapped to them were not returned when returning asset allocation. Now all asset classes are returned regardless of whether they have money mapped or not.

    Full Changelog: https://github.com/sarvjeets/lakshmi/compare/v2.4.1...v2.5.0

    Source code(tar.gz)
    Source code(zip)
  • v2.4.1(Feb 24, 2022)

    This release relaxes Python version requirement from 3.9.5 to 3.7

    What's Changed

    Fixed

    • Relaxed Python requirement to 3.7.

    Full Changelog: https://github.com/sarvjeets/lakshmi/compare/v2.4.0...v2.4.1

    Source code(tar.gz)
    Source code(zip)
  • v2.4.0(Feb 22, 2022)

    This release adds a new command lak list accounts to help see how your assets are distributed across accounts or account types (e.g. taxable, tax-exempt, etc.)

    What's Changed

    Added

    • A new command lak list accounts that allows printing account values and percentages by accounts or by account types.

    Fixed

    • The spinner chars were not showing properly on MS Windows 11. Changed to a simpler spinner.

    Full Changelog: https://github.com/sarvjeets/lakshmi/compare/v2.3.0...v2.4.0

    Source code(tar.gz)
    Source code(zip)
  • v2.3.0(Jan 26, 2022)

    This release adds support for tracking overall portfolio's performance over time.

    What's Changed

    • A new module lakshmi.performance that adds ability to checkpoint portfolio balances and display stats about portfolio's performance over time.
    • New commands in lak that exposes some functionality of the lakshmi.performance module:
      • lak add checkpoint
      • lak edit checkpoint
      • lak delete checkpoint
      • lak list checkpoints
      • lak list performance
      • lak info performance
    • Support in .lakrc to specify where the portfolio performance related data (checkpoints) are stored.

    Fixed

    • Help message now shows default values for lak analyze rebalance.
    • Added validation for I/EE bond purchase dates.

    Full Changelog: https://github.com/sarvjeets/lakshmi/compare/v2.2.0...v2.3.0

    Source code(tar.gz)
    Source code(zip)
  • v2.2.0(Nov 27, 2021)

    What's Changed

    Added

    • New flag in lak + environment variable support for specifying the .lakrc file.
    • Changelog (this file).
    • Contributing guidelines and development instructions for Lakshmi.

    Changed

    • Dependabot is disbled for this project.
    • Optimized away unnecessary calls when force refreshing the cached values (lak -r flag).

    Fixed

    • Incorrect error handling when .lakrc file couldn't be parsed.

    Full Changelog: https://github.com/sarvjeets/lakshmi/compare/v2.1.2...v2.2.0

    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Jul 31, 2021)

Owner
Sarvjeet Singh
Techie, Geek, Introvert, Dreamer, Boglehead, Goofy, Comedian & Dad. Also accused of being a leader in big tech doing cutting edge AI research.
Sarvjeet Singh
A command-line utility that creates projects from cookiecutters (project templates), e.g. Python package projects, VueJS projects.

Cookiecutter A command-line utility that creates projects from cookiecutters (project templates), e.g. creating a Python package project from a Python

18.6k Dec 30, 2022
Analyzing the most strategic words to guess on Wordle, based on letter frequency distributions

wordle-analysis Evaluating different heuristics to determine the most effective solving strategy and building an AI-powered assistant tool to help you

Sejal Dua 9 Feb 27, 2022
ServX | Bash Command as a Service

ServX | Bash Command as a Service Screenshots Instructions for running Run python3 servx.py. COMPATIBILITY TESTED ON ARCHLINUX(x64) & DEBIAN(x64) ONLY

ARPSyndicate 2 Mar 11, 2022
A CLI tool that scans through a directory and organizes all loose files into folders by file type.

Organizer CLI Organizer CLI is a python command line tool that goes through a given directory and organizes all un-folder bound files into folders by

Mulaza Jacinto 6 Dec 14, 2022
PipeCat - A command line Youtube music player written in python.

A command line Youtube music player written in python. It's an app written for Linux. It also supports offline playlists that are stored in a

34 Nov 27, 2022
This is the public repo for the VS Code Extension AT&T i386/IA32 UIUC-ECE391 Syntax Highlighting

AT&T i386 IA32 UIUC ECE391 GCC Highlighter & Snippet & Linter This is the VS Code Extension for UIUC ECE 391, MIT 6.828, and all other AT&T-based i386

Jackgetup 1 Feb 05, 2022
A Tempmail Tool for Terminal and Termux.

A Tempmail Tool for Terminal and Termux.

MAO-COMMUNITY 8 Oct 19, 2022
Tool for HackMyVM platform

HMV-cli It is a tool for the HackMyVM platform. With this tool you will be able to see the machines you have pending, filter by difficulty, download d

bitc0de 11 Sep 19, 2022
A web shell client written in python.

Webshell client A webshell client written in python. Only works well for linux for the time being. Why? Because there are too many heavy webshells. So

tchar 1 Dec 07, 2021
🌌 A Python script to generate blog banners from command line.

Auto Blog Banner Generator A Python script to generate blog banners. This script is used at RavSam. The following image is an example of the blog bann

RavSam 10 Sep 20, 2022
Baseline is a cross-platform library and command-line utility that creates file-oriented baselines of your systems.

Baselining, on steroids! Baseline is a cross-platform library and command-line utility that creates file-oriented baselines of your systems. The proje

Nelson 4 Dec 09, 2022
slipit is a command line utility for creating archives with path traversal elements.

slipit is a command line utility for creating archives with path traversal elements. It is basically a successor of the famous evilarc utility with an extended feature set and improved base functiona

usd AG 35 Dec 23, 2022
A communist shell written in Python

kash A communist shell written in Python It doesn't support escapes, quotes, comment lines, |, &&, , or similar yet. If you need help, get it from

Çınar Yılmaz 1 Dec 10, 2021
Pynavt is a cli tool to create clean architecture app for you including Fastapi, bcrypt and jwt.

Pynavt _____ _ | __ \ | | | |__) | _ _ __ __ ___ _| |_ | ___/ | | | '_ \ / _` \ \ / /

Alejandro Castillo 1 Dec 13, 2021
Command Line Based Todo Script

Todo-CLI Features Full-Fledged Command Line Based Todo List with the following features planned: Interactive Interface OS Notifications Save and Remov

DSC IIEST 5 Nov 17, 2021
Lsp Plugin for working with Python virtual environments

py_lsp.nvim What is py_lsp? py_lsp.nvim is a neovim plugin that helps with using the lsp feature for python development. It tackles the problem about

Patrick Haller 55 Dec 27, 2022
triggercmd is a CLI client for the TRIGGERcmd cloud service.

TriggerCMD CLI client triggercmd is a CLI client for the TRIGGERcmd cloud service. installation the triggercmd package is available in PyPI. to instal

Gustavo Soares 7 Oct 18, 2022
Low-Cost Open Source Ventilator or PAPR

Last updated 2020/04/19 Low-Cost Open-Source Ventilator-ish Device or PAPR NOTE: This is currently an independent project not affiliated with any comm

Johnny Lee 1.7k Dec 21, 2022
Simple subcommand CLIs with argparse

multicommand Simple subcommand CLIs with argparse. multicommand uses only the standard library and is ~150 lines of code (modulo comments and whitespa

Andrew Ross 10 Aug 01, 2022
A Telegram Bot Written In Python To Upload Medias To telegra.ph

Telegraph-Uploader A Telegram Bot Written In Python To Upload Medias To telegra.ph DEPLOY YOU CAN SIMPLY DEPLOY ON HEROKU BY CLICKING THE BUTTON BELOW

Rithunand 31 Dec 03, 2022