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
🔖 Lemnos: A simple, light-weight command-line to-do list manager.

🔖 Lemnos: CLI To-do List Manager This is a simple program that allows one to manage a to-do list via the command-line. Example $ python3 todo.py add

Rohan Sikand 1 Dec 07, 2022
Unpacks things.

$ unp_ unp is a command line tool that can unpack archives easily. It mainly acts as a wrapper around other shell tools that you can find on v

Armin Ronacher 405 Jan 03, 2023
Wik is use to get information about anything on the shell using Wikipedia.

WIK wik is a tool to view wikipedia pages from your terminal. It also let you search for any wikipedia up to date article on one query from your termi

Yash Singh 340 Dec 18, 2022
This project contains the ClonedPerson dataset and code described in our paper "Cloning Outfits from Real-World Images to 3D Characters for Generalizable Person Re-Identification".

ClonedPerson This is the official repository for the ClonedPerson project, which contains the ClonedPerson dataset and code described in our paper "Cl

Yanan Wang 55 Dec 27, 2022
A new kind of Progress Bar, with real time throughput, eta and very cool animations!

A new kind of Progress Bar, with real time throughput, eta and very cool animations!

Rogério Sampaio de Almeida 4.1k Jan 08, 2023
split-manga-pages: a command line utility written in Python that converts your double-page layout manga to single-page layout.

split-manga-pages split-manga-pages is a command line utility written in Python that converts your double-page layout manga (or any images in double p

Christoffer Aakre 3 May 24, 2022
A simple CLI based any Download Tool, that find files and let you stream or download thorugh WebTorrent CLI or Aria or any command tool

Privateer A simple CLI based any Download Tool, that find files and let you stream or download thorugh WebTorrent CLI or Aria or any command tool How

Shreyash Chavan 2 Apr 04, 2022
Find your broken links, so users don't.

PyAnchor Dead links are an annoyance for websites with an extensive amount of content. A side from the negative impact on SEO, dead links are an annoy

Ricky White 61 Dec 14, 2022
Customisable pharmacokinetic model accessible via bash CLI allowing for variable dose calculations as well as intravenous and subcutaneous administration calculations

Pharmacokinetic Modelling Group Project A PharmacoKinetic (PK) modelling function for analysis of injected solute dynamics over time, developed by Gro

1 Oct 24, 2021
Present - A terminal-based presentation tool with colors and effects.

present A terminal-based presentation tool with colors and effects. You can also play a codio (pre-recorded code block) on a slide. present is built o

Vinayak Mehta 4.2k Jan 03, 2023
🌈 Beautify your command line interfaces.

Basics Install: pip install iridi Usage: import iridi # Create gradient text # iridi.print(message, colors, options) # Ask for input with gradient

Conrad Crawford 39 Oct 20, 2022
🏃 Python3 Solutions of All Problems in GCJ 2022 (In Progress)

GoogleCodeJam 2022 Python3 solutions of Google Code Jam 2022. Solution begins with * means it will get TLE in the largest data set. Total computation

kamyu 12 Dec 20, 2022
Investing library and command-line interface inspired by the Bogleheads philosophy

Lakshmi (Screenshot of the lak command in action) Background This project is inspired by Bogleheads forum. Bogleheads focus on a simple but powerful p

Sarvjeet Singh 108 Dec 26, 2022
電通大のCLIツールです

uecli 電通大のCLIツールです。コマンドラインからシラバス検索、成績参照、図書館の貸出リストなどを見ることができます インストール pip install uecli 使い方 シラバスを検索 uecli syllabus search -s 'コンピュータサイエンス' シラバスを取得し、Mar

UEC World Dominators 2 Oct 31, 2021
Command line tool for google dorks

CLI for google dorks This is the command line tool made with pytohn which allows the users to perform Google dorks easily Installation Install google

subrahmanya s hegade 3 Feb 08, 2022
Tmux Based Dropdown Dashboard For Python

sextans It's a private configuration and an ongoing experiment while I use Archlinux. A simple drop down dashboard based on tmux. It includes followin

秋葉 4 Dec 22, 2021
A simple CLI tool for tracking Pikud Ha'oref alarms.

Pikud Ha'oref Alarm Tracking A simple CLI tool for tracking Pikud Ha'oref alarms. Polls the unofficial API endpoint every second for incoming alarms.

Yuval Adam 24 Oct 10, 2022
Navigate torrents in CLI with Mariner.

Navigate torrents in CLI with Mariner. It offers a simple interface for streamlined experience. No more annoying ads and pop-up windows.

2 Oct 20, 2021
Automaton - python script to execute bash command based on changes in size of a file.

automaton python script to execute given command = everytime size of a given file changes,hence everytime a file is modified.(almost) download automa

asrar bhat 1 Jan 03, 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