Package: lakshmi
Lakshmi(Screenshot of thelakcommand in action)BackgroundThis project is inspired byBogleheads forum. Bogleheads focus on a simple butpowerful philosophythat allows investors to achieve above-average
returns after costs. This tool is built around the same principles to help
anaverageinvestor 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.IntroductionThis 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 wikiis 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, ETFs, etc.)
inside those accounts. The market value of these assets is automatically
updated.Support for running what-if scenarios to see how it impacts the overall asset
allocation.Suggests which funds to allocate new money to (or withdraw money from) to
keep the actual asset allocation close to the desired asset allocation.Suggests how to rebalance the funds in a given account to bring the actual
asset allocation close to the desired asset allocation.Ability to track portfolio performance
(IRR)
and cash flows.Supports manual assets, assets with ticker, Vanguard funds (that don't
have associated ticker symbols),EE BondsandI Bonds.Listing current values of assets, asset allocation and asset location.Tracking of tax-lot information for assets.Analysis of portfolio to identify if there is need to rebalance or
if there are losses that can beharvested.InstallationThis project can be installed viapip.
To install the library and the lak command line tool, run:pip install lakshmiCommand-line interfaceFor detailed help on the CLI, please seelak user guide.
For tips and tricks, please refer toLakshmi Recipes.The simplest way to use this project is via thelakcommand. 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]
  --debug            If set, prints stack track when an exception is raised.
  --help             Show this message and exit.

Commands:
  add      Add new entities to the portfolio.
  analyze  Analyze the portfolio.
  delete   Delete different entities from the portfolio.
  edit     Edit parts of the portfolio.
  info     Print detailed information about parts of the portfolio.
  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...The following section gives a quick summary of how to create a new portfolio.
For detailed help, please readcreating a portfoliosection of thelak user guide.A new portfolio can be created by either:Copying anexistingportfolio file to ~/portfolio.yaml and editing it, ORUsing thelakcommands to create a new portfolio.The following command will open up an editor to input the desired asset
allocation:$ lak initAccounts (His/Her 401(k), Roth IRAs, Taxable, etc.) can be added via
thelak add accountcommand:$ lak add account
# Use the above command multiple times to add more accounts.Assets can be added to an account via thelak add assetcommand. 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]

  Add a new asset to 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 substring 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_strwhere 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 alLibraryThelakshmilibrary can also be used directly. The modules and classes are
well documented and there are numerous examples for using each method or class
in thetestsaccompanying this package. Theexample portfoliocan be constructed and the asset
allocation, etc. can be printed by the following piece of python code:fromlakshmiimportAccount,AssetClass,Portfoliofromlakshmi.assetsimportTaxLot,TickerAssetfromlakshmi.tableimportTabledefmain():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()DevelopmentHere are the steps to download the source code and start developing on
Lakshmi:# Fork and clone this repo.$gitclonehttps://github.com/yourusername/lakshmi.git
$cdlakshmi# All development is done on the 'develop' branch$gitcheckoutdevelop# Setting up a virtual environment is strongly recommended. Install virtualenv# by one of the following:# pip install virtualenv --user  # If you have pip installed# sudo apt-get install python-virtualenv # Ubuntu# sudo pacman -S python-virtualenv  # Arch linux$virtualenvvenv# Activate the virtual environment$sourcevenv/bin/activate# Install all the dependencies$pipinstall-rrequirements.txt# Run unittests$python-munittest# Install pre-commit hooks to run it automatically on commits$pre-commitinstall# Run pre-commit manually$pre-commitrun--all-files# Create your own bug or feature branch and start developing. Remember to# run tests (and add them when necessary) and pre-commit hooks on changes.LicenseDistributed under the MIT License. SeeLICENSEfor more information.AcknowledgementsI am indebted to the following folks whose wisdom has helped me
tremendously in my investing journey:John Bogle,Taylor Larimore,Nisiprius,Livesoft,Mel LindauerandLadyGeek.This project would not have been possible without my wifeNiharika, who helped me come up with the initial idea
and encouraged me to start working on this project.The not-so-fine printThe 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.