Skip to content

Commit

Permalink
Merge pull request #24 from 6ahodir/master
Browse files Browse the repository at this point in the history
Added major assets, indexes, currencies for showing on the dashboard.
  • Loading branch information
jsmidt committed Jun 6, 2013
2 parents 328bda4 + 0f01d6e commit 075cfd4
Show file tree
Hide file tree
Showing 2 changed files with 187 additions and 7 deletions.
108 changes: 108 additions & 0 deletions quantpy/gui/settings.py
@@ -0,0 +1,108 @@
import os

DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')

# database file location
DB_FILE = os.path.join(DATA_DIR, 'db.sqlite3')

# indexes that are displayed on the dashboard
DASHBOARD_INDEXES = {
#symbol, short name, long name
'^DJI': ('DJIA', 'Dow Jones Industrial Average'), # unfortunately, no data
'^GSPC': ('S&P', 'S&P 500'),
'^IXIC': ('NASDAQ', 'NASDAQ Composite'),
'eurusd=x': ('EUR/USD', 'EUR/USD'),
'^TNX': ('10-Year Bond', 'CBOE Interest Rate 10-Year T-No'),
'gcq13.cmx': ('Gold', 'Gold Aug 13'),
'CLN13.NYM': ('Oil', 'Crude Oil Jul 13'),
}


# http://www.gummy-stuff.org/Yahoo-data.htm
YAHOO_SYMBOL_TAGS = {
"a": "Ask",
"a2": "Average Daily Volume",
"a5": "Ask Size",
"b": "Bid",
"b2": "Ask (Real-time)",
"b3": "Bid (Real-time)",
"b4": "Book Value",
"b6": "Bid Size",
"c": "Change & Percent Change",
"c1": "Change",
"c3": "Commission",
"c6": "Change (Real-time)",
"c8": "After Hours Change (Real-time)",
"d": "Dividend/Share",
"d1": "Last Trade Date",
"d2": "Trade Date",
"e": "Earnings/Share",
"e1": "Error Indication (returned for symbol changed / invalid)",
"e7": "EPS Estimate Current Year",
"e8": "EPS Estimate Next Year",
"e9": "EPS Estimate Next Quarter",
"f6": "Float Shares",
"g": "Day's Low",
"g1": "Holdings Gain Percent",
"g3": "Annualized Gain",
"g4": "Holdings Gain",
"g5": "Holdings Gain Percent (Real-time)",
"g6": "Holdings Gain (Real-time)",
"h": "Day's High",
"i": "More Info",
"i5": "Order Book (Real-time)",
"j": "52-week Low",
"j1": "Market Capitalization",
"j3": "Market Cap (Real-time)",
"j4": "EBITDA",
"j5": "Change From 52-week Low",
"j6": "Percent Change From 52-week Low",
"k": "52-week High",
"k1": "Last Trade (Real-time) With Time",
"k2": "Change Percent (Real-time)",
"k3": "Last Trade Size",
"k4": "Change From 52-week High",
"k5": "Percebt Change From 52-week High",
"l": "Last Trade (With Time)",
"l1": "Last Trade (Price Only)",
"l2": "High Limit",
"l3": "Low Limit",
"m": "Day's Range",
"m2": "Day's Range (Real-time)",
"m3": "50-day Moving Average",
"m4": "200-day Moving Average",
"m5": "Change From 200-day Moving Average",
"m6": "Percent Change From 200-day Moving Average",
"m7": "Change From 50-day Moving Average",
"m8": "Percent Change From 50-day Moving Average",
"n": "Name",
"n4": "Notes",
"o": "Open",
"p": "Previous Close",
"p1": "Price Paid",
"p2": "Change in Percent",
"p5": "Price/Sales",
"p6": "Price/Book",
"q": "Ex-Dividend Date",
"r": "P/E Ratio",
"r1": "Dividend Pay Date",
"r2": "P/E Ratio (Real-time)",
"r5": "PEG Ratio",
"r6": "Price/EPS Estimate Current Year",
"r7": "Price/EPS Estimate Next Year",
"s": "Symbol",
"s1": "Shares Owned",
"s7": "Short Ratio",
"t1": "Last Trade Time",
"t6": "Trade Links",
"t7": "Ticker Trend",
"t8": "1 yr Target Price",
"v": "Volume",
"v1": "Holdings Value",
"v7": "Holdings Value (Real-time)",
"w": "52-week Range",
"w1": "Day's Value Change",
"w4": "Day's Value Change (Real-time)",
"x": "Stock Exchange",
"y": "Dividend Yield"
}
86 changes: 79 additions & 7 deletions quantpy/gui/utils.py
@@ -1,9 +1,14 @@
import xml.etree.ElementTree as ET
import urllib.request

import numpy as np
import pandas as pd

from quantpy.gui import settings


def fetch_news(tickers, kind='company'):
"""Downloads company news headlines from yahoo
"""Download company news headlines from yahoo
'tickers' is a comma separated list of tickers: yhoo,msft,tivo
or just one ticker symbol
Expand All @@ -30,12 +35,79 @@ def fetch_news(tickers, kind='company'):

news = []
for item in root.iter('item'):
news.append({
'description': item.find('description').text,
'link': item.find('link').text,
'pub_date': item.find('pubDate').text,
'title': item.find('title').text,
})
try:
news.append({
'description': item.find('description').text,
'link': item.find('link').text,
'pub_date': item.find('pubDate').text,
'title': item.find('title').text,
})
except AttributeError:
pass

return news


def get_market_updates(symbols, special_tags):
"""
Get current yahoo quote.
'special_tags' is a list of tags. More info about tags can be found at
http://www.gummy-stuff.org/Yahoo-data.htm
Returns a DataFrame
"""
if isinstance(symbols, str):
sym_list = symbols
elif not isinstance(symbols, pd.Series):
symbols = pd.Series(symbols)
sym_list = str.join('+', symbols)
else:
sym_list = str.join('+', symbols)

# Symbol must be in the special_tags for now
if not 's' in special_tags:
special_tags.insert(0, 's')
request = ''.join(special_tags) # code request string
special_tag_names = [settings.YAHOO_SYMBOL_TAGS[x] for x in special_tags]
header = special_tag_names

data = dict(list(zip(
list(special_tag_names), [[] for i in range(len(special_tags))]
)))

urlStr = 'http://finance.yahoo.com/d/quotes.csv?s=%s&f=%s' % (
sym_list, request)

try:
lines = urllib.request.urlopen(urlStr).readlines()
except Exception as e:
s = "Failed to download:\n{0}".format(e)
print(s)
return None

for line in lines:
fields = line.decode('utf-8').strip().split(',')
for i, field in enumerate(fields):
if field[-2:] == '%"':
data[header[i]].append(float(field.strip('"%')))
elif field[0] == '"':
data[header[i]].append(field.strip('"'))
else:
try:
data[header[i]].append(float(field))
except ValueError:
data[header[i]].append(np.nan)

idx = data.pop('Symbol')

return pd.DataFrame(data, index=idx)


def get_dashboard_index_updates():
"""Fetch updates for assets in the settings.DASHBOARD_INDEXES
Return a pandas data frame.
"""
symbols = [x for x in settings.DASHBOARD_INDEXES.keys()]
special_tags = ['s', 'c6', 'd1', 'l1', 'p2'] # settings.YAHOO_SYMBOL_TAGS
return get_market_updates(symbols, special_tags)

0 comments on commit 075cfd4

Please sign in to comment.