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

    mhenke@mhenke-Inspiron-15-3567:$ python --version Python 3.8.10 mhenke@mhenke-Inspiron-15-3567:$ 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.

    mhenke@mhenke-Inspiron-15-3567:~$ 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 lightweight command line interface library for creating commands.

⚙ A lightweight command line interface library for creating cli commands. About | Installation | Usage | Features | Contributors | License About Next:

Serum 16 Sep 25, 2022
A minimal and ridiculously good looking command-line-interface toolkit.

Pyceo Pyceo is a Python package for creating beautiful, composable, and ridiculously good looking command-line-user-interfaces without having to write

Juan-Pablo Scaletti 21 Mar 25, 2022
Command line interface to watch your childhood shows in hindi and english, designed with python

Sweet dreams: Most of your childhood shows Command line interface to watch your

Not Your Surya 3 Feb 13, 2022
Textual: a TUI (Text User Interface) framework for Python inspired by modern web development

Textual Textual is a TUI (Text User Interface) framework for Python inspired by

null 17.1k Jan 4, 2023
A supercharged AWS command line interface (CLI).

SAWS Motivation AWS CLI Although the AWS CLI is a great resource to manage your AWS-powered services, it's tough to remember usage of: 70+ top-level c

Donne Martin 5.1k Jan 5, 2023
Command line interface for testing internet bandwidth using speedtest.net

speedtest-cli Command line interface for testing internet bandwidth using speedtest.net Versions speedtest-cli works with Python 2.4-3.7 Installation

Matt Martz 12.4k Jan 8, 2023
Universal Command Line Interface for Amazon Web Services

This package provides a unified command line interface to Amazon Web Services.

Amazon Web Services 13.3k Jan 7, 2023
command line interface to manage VALORANT skins

A PROPER RELEASE IS COMING SOON, IF YOU KNOW HOW TO USE PYTHON YOU CAN USE IT NOW! valorant skin manager command line interface simple command line in

colinh 131 Dec 25, 2022
Microsoft Azure CLI - Azure Command-Line Interface

A great cloud needs great tools; we're excited to introduce Azure CLI, our next generation multi-platform command line experience for Azure.

Microsoft Azure 3.4k Dec 30, 2022
flora-dev-cli (fd-cli) is command line interface software to interact with flora blockchain.

Install git clone https://github.com/Flora-Network/fd-cli.git cd fd-cli python3 -m venv venv source venv/bin/activate pip install -e . --extra-index-u

null 14 Sep 11, 2022
A command line interface to buy things in stregsystemet

Stregsystemet-CLI This repository is the Stregsystemet CLI, to buy things in Stregsystemet, at AAU. Use of this cli-tool is at your own risk and there

F-klubben 14 Oct 18, 2022
moviepy-cli: Command line interface for MoviePy.

Moviepy-cli is designed to apply several video editing in a single command with Moviepy as an alternative to Video-cli.

Kentaro Wada 23 Jun 29, 2022
Command line interface for unasync

CLI for unasync Command line interface for unasync Getting started Install Run the following command to install the package with pip: pip install unas

Leynier Gutiérrez González 3 Apr 4, 2022
Rover is a command line interface application that allows through browse through mission data, images, metadata from the NASA Official Website

?? rover Rover is a command line interface application that allows through browse through mission data, images, metadata from the NASA Official Websit

Saketha Ramanjam 4 Jan 19, 2022
bsp_tool provides a Command Line Interface for analysing .bsp files

bsp_tool Python library for analysing .bsp files bsp_tool provides a Command Line Interface for analysing .bsp files Current development is focused on

Jared Ketterer 64 Dec 28, 2022
Command-line interface to PyPI Stats API to get download stats for Python packages

pypistats Python 3.6+ interface to PyPI Stats API to get aggregate download statistics on Python packages on the Python Package Index without having t

Hugo van Kemenade 140 Jan 3, 2023
Quo is a Python based toolkit for writing Command-Line Interface(CLI) applications.

Quo is a Python based toolkit for writing Command-Line Interface(CLI) applications. Quo is making headway towards composing speedy and orderly CLI applications while forestalling any disappointments brought about by the failure to execute a CLI API. Simple to code, easy to learn, and does not come with needless baggage.

Secretum Inc. 16 Oct 15, 2022
The command line interface for Gradient - Gradient is an an end-to-end MLOps platform

Gradient CLI Get started: Create Account • Install CLI • Tutorials • Docs Resources: Website • Blog • Support • Contact Sales Gradient is an an end-to

Paperspace 58 Dec 6, 2022
Program Command Line Interface (CLI) Sederhana: Pemesanan Nasi Goreng Hekel

Program ini merupakan aplikasi yang berjalan di dalam command line (terminal). Program ini menggunakan built-in library python yaitu argparse yang dapat menerima parameter saat program ini dijalankan melalui terminal atau CLI.

Habib Abdurrasyid 5 Nov 19, 2021