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 Python package for Misty II development

Misty2py Misty2py is a Python 3 package for Misty II development using Misty's REST API. Read the full documentation here! Installation Poetry To inst

Chris Scarred 1 Mar 07, 2022
stonky is a simple command line dashboard for monitoring stocks.

stonky is a simple command line dashboard for monitoring stocks.

Jessy Williams 228 Dec 14, 2022
lazy_table - a python-tabulate wrapper for producing tables from generators

A python-tabulate wrapper for producing tables from generators. Motivation lazy_table is useful when (i) each row of your table is generated by a poss

Parsiad Azimzadeh 52 Nov 12, 2022
CPOST is a CLI tool to assist with the proper sizing of Clara Deploy pipelines

CPOST (Clara Pipeline Operator Sizing Tool) Tool to measure resource usage of Clara Platform pipeline operators Cpost is a tool that will help you run

NVIDIA Corporation 5 Sep 27, 2021
Access hacksec.in from your command-line

Access hacksec.in from your command-line

hacksec.in 3 Oct 26, 2022
Freaky fast fuzzy Denite/CtrlP matcher for vim/neovim

Freaky fast fuzzy Denite/CtrlP matcher for vim/neovim This is a matcher plugin for denite.nvim and CtrlP.

Raghu 113 Sep 29, 2022
A command line tool to hide and reveal information inside images (works for both PNGs and JPGs)

ImgReRite A command line tool to hide and reveal information inside images (work

Jigyasu 10 Jul 27, 2022
Zecwallet-Python is a simple wrapper around the Zecwallet Command Line LightClient written in Python

A wrapper around Zecwallet Command Line LightClient, written in Python Table of Contents About Installation Usage Examples About Zecw

Priveasy 2 Sep 06, 2022
A simple discord slash command handler for for discord.py.

A simple discord slash command handler for discord.py About ⦿ Installation ⦿ Disclaimer ⦿ Examples ⦿ Documentation ⦿ Discussions Note that master bran

641 Jan 03, 2023
A CLI Spigot plugin manager that adheres to Unix conventions and Python best practices.

Spud A cross-platform, Spigot plugin manager that adheres to the Unix philosophy and Python best practices. Some focuses of the project are: Easy and

Tommy Dougiamas 9 Dec 02, 2022
This is a CLI utility that allows you to view RedFlagDeals.com on the command line.

RFD Description Motivation Installation Usage View Hot Deals View and Sort Hot Deals Search Advanced View Posts Shell Completion bash zsh Description

Dave G 8 Nov 29, 2022
Wordle-solver - A tool that helps people who struggle with vocabulary to enjoy the famous game of WORDLE

Wordle-Solver Wordle-Solver helps people who struggle with vocabulary to enjoy t

Jason Chao 104 Dec 31, 2022
A CLI tools to get you started on any project in any language

Any Template A faster easier to Quick start any programming project. Installation pip3 install any-template Features No third party dependencies. Tem

Adwaith Rajesh 2 Jan 11, 2022
A command-line based, minimal torrent streaming client made using Python and Webtorrent-cli.

ABOUT A command-line based, minimal torrent streaming client made using Python and Webtorrent-cli. Installation pip install -r requirements.txt It use

Janardon Hazarika 17 Dec 11, 2022
A Python-based command prompt concept which includes windows command emulation.

PythonCMD A Python-based command prompt concept which includes windows command emulation. Current features: echo: Input your message and it will be cl

1 Feb 05, 2022
🌈 Generate color palettes based on Neovim colorschemes.

Iris Iris is a Neovim plugin that generates a normalized color palette based on your colorscheme. It is named for the goddess Iris of Greek mythology,

N. G. Scheurich 45 Jul 28, 2022
A supercharged Git/GitHub command line interface (CLI)

A supercharged Git/GitHub command line interface (CLI).

Donne Martin 7.4k Jan 07, 2023
Python command line tool and python engine to label table fields and fields in data files.

Python command line tool and python engine to label table fields and fields in data files. It could help to find meaningful data in your tables and data files or to find Personal identifable informat

APICrafter 22 Dec 05, 2022
Play videos in the terminal.

Termvideo Play videos in the terminal (stdout). python main.py /path/to/video.mp4 Terminal size: -x output_width, -y output_height. Default autodetect

Patrick 11 Jun 13, 2022
Themes for Windows Terminal

Windows Terminal Themes Preview and copy themes for the new Windows Terminal. Use the project at windowsterminalthemes.dev How to use the themes This

Tom 1.1k Jan 03, 2023