Prometheus is a Flask (About Flask) powered web app that tells you how your stock portfolio has performed over time, gives insight into how to optimize your asset allocation, and monitors your portfolio for rebalancing or performance enhancing opportunities. It has been tested on the following configuration:
- MacOS X 10.7.5
- Python 2.7.4
Prometheus requires the following in order to run properly:
Prometheus aims to give investors an easy way to:
- construct portfolios of low cost ETFs and mutual funds
- generate customized portfolios based on their individual risk tolerance
- access asset classes that have since only been available to the elite
Prometheus provides a suite of tools to:
- track and monitor portfolio performance and allocation
- compare portfolios across various categories (account, manager, etc.)
- visualize various portfolio metrics
- Database abstraction with SQLAlchemy.
- Web forms validation with WTForms.
- Script support with Flask-Script.
- Bootstrap integration with Flask-Bootstrap
- Markdown parsing with Flask-Markdown
- Database validation with SAValidation
- RESTful API generation with Flask-Restless
Clone the repo
git clone [email protected]:reubano/prometheus.git cd prometheus
Install requirements
sudo easy_install pip sudo pip install -r requirements-local.txt
Run server
./manage.py runserver
Now view the app at http://localhost:5000
Prometheus comes with a built in script manager manage.py
. Use it to start the
server, run tests, and initialize the database.
./manage.py <command> [command-options] [manager-options]
Start server
./manage.py runserver
Run nose tests
./manage.py runtests
Initialize the production database
./manage.py initdb -m Production
-m MODE, --cfgmode=MODE set the configuration mode, must be one of ['Production', 'Development', 'Test'] defaults to 'Development'. See `config.py` for details -f FILE, --cfgfile=FILE set the configuration file (absolute path)
checkstage Checks staged with git pre-commit hook initdb Removes all content from database and initializes it with default values popdb Removes all content from database initializes it, and populates it with sample data popprices Add prices for all securities in the database runserver Runs the Flask development server i.e. app.run() runtests Run nose tests shell Runs a Python shell inside Flask application context. resetdb Remove all content from database and creates new tables testapi Test to see if API is working
Type ./manage.py <command> -h
to view any command's options
./manage.py manage runserver -h
usage: ./manage.py runserver [-h] [-t HOST] [-p PORT] [--threaded] [--processes PROCESSES] [--passthrough-errors] [-d] [-r] Runs the Flask development server i.e. app.run() optional arguments: -h, --help show this help message and exit -t HOST, --host HOST -p PORT, --port PORT --threaded --processes PROCESSES --passthrough-errors -d, --no-debug -r, --no-reload
Start production server on port 1000
./manage.py runserver -p 1000 -m Production
The following configurations settings are in config.py
:
variable | description | default value |
---|---|---|
__APP_NAME__ | application name | 'Prometheus' |
__YOUR_NAME__ | your name | 'Reuben Cummings' |
__YOUR_EMAIL__ | your email address | <user>@gmail.com |
__YOUR_WEBSITE__ | your website | 'http://<user>.github.com' |
__API_BASE__ | api base url | 'http://prometheus-api.herokuapp.com/' |
Prometheus will reference the following environment variables in config.py
if they are set on your system.
SECRET_KEY CSRF_SESSION_KEY RECAPTCHA_PUBLIC_KEY RECAPTCHA_PRIVATE_KEY GOOGLE_ANALYTICS_ACCOUNT
To set an environment variable, do the following:
echo 'export VARIABLE=value' >> ~/.profile
Ideally, you should install modules for every project into a virtual environment. This setup will allow you to install different versions of the same module into different projects without worrying about adverse interactions.
sudo pip install virtualenv virtualenvwrapper
Add the following to your ~/.profile
export WORKON_HOME=$HOME/.virtualenvs export PIP_VIRTUALENV_BASE=$WORKON_HOME export PIP_RESPECT_VIRTUALENV=true source /usr/local/bin/virtualenvwrapper.sh
Create your new virtualenv
mkvirtualenv --no-site-packages prometheus sudo easy_install pip sudo pip install -r requirements-local.txt
Patch pandas to enable dividend and split fetching
patch -p0 < data.py.patch
By default, this project uses the Heroku hosted Prometheus-API. If you would like to host your own API do the following:
Clone the repo
git clone [email protected]:reubano/prometheus-api.git cd prometheus-api
Install requirements
mkvirtualenv --no-site-packages prometheus-api workon prometheus-api sudo pip install -r requirements-local.txt
Run server (pick a different port than the main app)
./manage.py runserver -p 5005
Now that your api is up and running at http://localhost:5005, set the
__API_BASE__
variable in config.py
to the url of your new api.
Getting Gevent up and running is a bit tricky so follow these instructions carefully.
To use gevent
, you first need to install libevent
.
Linux
apt-get install libevent-dev
Mac OS X via homebrew
brew install libevent
Mac OS X via macports
sudo port install libevent
Mac OS X via DMG
download on Rudix
Now that libevent is handy, install the remaining requirements
sudo pip install -r requirements.txt
Or via the following if you installed libevent from macports
sudo CFLAGS="-I /opt/local/include -L /opt/local/lib" pip install gevent sudo pip install -r requirements.txt
Finally, install foreman
sudo gem install foreman
Now, you can run the application locally
foreman start
You can also specify what port you'd prefer to use
foreman start -p 5555
If you haven't signed up for Heroku, go ahead and do that. You should then be able to add your SSH key to Heroku, and also heroku login from the commandline.
Install heroku and create your app
sudo gem install heroku heroku create -s cedar app_name
Now before pushing to Heroku, temporarily remove ``pandas`` from the
requirements file (there is a bug where heroku won't install pandas
unless
numpy
is already installed)
pip freeze -l | sed '/pandas/d' > requirements.txt git commit -am "Remove pandas as requirement" git push heroku master
Replace ``pandas`` and push to Heroku
pip freeze -l > requirements.txt git commit -am "Add pandas as requirement" git push heroku master
Start the web instance and make sure the application is up and running
heroku ps:scale web=1 heroku ps
Now, we can view the application in our web browser
heroku open
And anytime you want to redeploy, it's as simple as git push heroku master
.
Once you are done coding, deactivate your virtualenv with deactivate
.
tree . | sed 's/+----/├──/' | sed '/.pyc/d' | sed '/.DS_Store/d'
prometheus ├──Procfile (heroku process) ├──README.rst (this file) ├──app | ├──__init__.py (main app module) | ├──apollo (visualization engine) | | ├──__init__.py (main apollo module) | | ├──views.py | ├──connection.py (api interface module) | ├──cronus (portfolio analytics engine) | | ├──__init__.py (blank - see sub modules) | | ├──analytics.py | | ├──coredata.py | | ├──forms.py | | ├──sources.py | | ├──views.py | ├──favicon.ico | ├──helper.py (manage/views/forms helper) | ├──hermes (price/event data aggregator) | | ├──__init__.py (main hermes module) | | ├──forms.py | | ├──views.py | ├──LICENSE | ├──MANIFEST.in (pypi includes) | ├──markdown (static pages - auto parsed into html) | | ├──about.md | | ├──api.md | ├──README.rst (symlink for pypi) | ├──setup.py (pypi settings) | ├──templates (Jinja templates) | | ├──barchart.html | | ├──base.html | | ├──entry.html | | ├──footer.html | | ├──home.html | | ├──markdown.html | | ├──page.html | | ├──topnav.html | ├──tests | ├──__init__.py (main tests module) | ├──standard.rc (pylint config) | ├──test.sh (git pre-commit hook) | ├──test_cronus.py | ├──test_hermes.py | ├──test_site.py | ├──trnx.csv ├──config.py (app config) ├──manage.py (flask-script) ├──requirements.txt (python module requirements) ├──runtime.txt (python version) ├──setup.cfg (unit test settings)
First time
- Fork
- Clone
- Code (if you are having problems committing because of git pre-commit
hook errors, just run
./manage.py checkstage
to see what the issues are.) - Use tabs not spaces
- Add upstream
git remote add upstream https://github.com/reubano/prometheus.git
- Rebase
git rebase upstream/master
- Test
./manage.py runtests
- Push
git push origin master
- Submit a pull request
Continuing
- Code (if you are having problems committing because of git pre-commit
hook errors, just run
./manage.py checkstage
to see what the issues are.) - Use tabs not spaces
- Update upstream
git fetch upstream
- Rebase
git rebase upstream/master
- Test
./manage.py runtests
- Push
git push origin master
- Submit a pull request
git shortlog -sn
commits: 405 404 Reuben Cummings 1 Luke Cyca
Prometheus is modeled after Dirk Eddelbuettel's beancounter and smtm.
Flask is a BSD-licensed microframework for Python based on Werkzeug, Jinja2 and good intentions.
Prometheus is distributed under the BSD License, the same as Flask on which this program depends.