Пример #1
0
 def insert_company(self):
     print( "Insert new company information" )
     mdb_query = Query()
     iex = Iex()
     #Get all symbols in MongoDB
     mdb_symbols = mdb_query.get_symbols()
     #Get companies already in MongoDB
     mdb_companies = mdb_query.get_company( mdb_symbols['symbol'].tolist() )
     #Initial call to print 0% progress
     printProgressBar(0, len(mdb_symbols.index), prefix = 'Progress:', suffix = '', length = 50)
     #Loop through symbols
     for index, mdb_symbol in mdb_symbols.iterrows():
         #Insert if no mdb company data exists
         if mdb_companies.empty:
             #Get company data from IEX
             iex_company = iex.get_company( mdb_symbol["symbol"] )
             #Update progress bar
             printProgressBar(index+1, len(mdb_symbols.index), prefix = 'Progress:', suffix = "Inserting company for " + mdb_symbol["symbol"] + "      ", length = 50)
             self.db.iex_company.insert_many( iex_company.to_dict('records') )
             continue
         #Skip company if already in MongoDB
         if not mdb_companies[ mdb_companies['symbol'] == mdb_symbol['symbol'] ].empty:
             #Update progress bar
             printProgressBar(index+1, len(mdb_symbols.index), prefix = 'Progress:', suffix = "No new data for " + mdb_symbol["symbol"] + "      ", length = 50)
             continue
         #Get company data from IEX
         iex_company = iex.get_company( mdb_symbol["symbol"] )
         #Insert if company data exists
         if not iex_company.empty:
             #Update progress bar
             printProgressBar(index+1, len(mdb_symbols.index), prefix = 'Progress:', suffix = "Inserting company for " + mdb_symbol["symbol"] + "      ", length = 50)
             self.db.iex_company.insert_many( iex_company.to_dict('records') )
         else:
             #Update progress bar
             printProgressBar(index+1, len(mdb_symbols.index), prefix = 'Progress:', suffix = "No data for " + mdb_symbol["symbol"] + "      ", length = 50)
Пример #2
0
 def insert_financials(self):
     print( "Insert new financials" )
     mdb_query = Query()
     iex = Iex()
     #Get all symbols in MongoDB
     mdb_symbols = mdb_query.get_active_companies()
     #Get current date
     currDate = datetime.datetime.now().strftime("%Y-%m-%d")
     #Get latest financials in MongoDB for each symbol
     mdb_financials = mdb_query.get_financials( mdb_symbols.tolist(), currDate, "latest" )
     #Initial call to print 0% progress
     printProgressBar(0, len(mdb_symbols.index), prefix = 'Progress:', suffix = '', length = 50)
     #Loop through symbols
     for index, mdb_symbol in mdb_symbols.iteritems():
         #Get financials from IEX
         iex_financials = iex.get_financials( mdb_symbol )
         #Get matching financial in MongoDB
         mdb_financial = mdb_financials[ mdb_financials['symbol'] == mdb_symbol ]
         #Select financials more recent than MongoDB
         if not mdb_financial.empty and not iex_financials.empty:
             mask = iex_financials['reportDate'] > mdb_financial['reportDate'].iloc[0]
             iex_financials = iex_financials.loc[mask]
         #Insert if financials exist
         if not iex_financials.empty:
             #Update progress bar
             printProgressBar(index+1, len(mdb_symbols.index), prefix = 'Progress:', suffix = "Inserting financials for " + mdb_symbol + "      ", length = 50)
             self.db.iex_financials.insert_many( iex_financials.to_dict('records') )
         else:
             #Update progress bar
             printProgressBar(index+1, len(mdb_symbols.index), prefix = 'Progress:', suffix = "No new data for " + mdb_symbol + "      ", length = 50)
Пример #3
0
 def insert_dividends(self):
     print( "Insert new dividends" )
     mdb_query = Query()
     iex = Iex()
     #Get all symbols in MongoDB
     #mdb_symbols = mdb_query.get_active_companies()
     #Get current date
     currDate = datetime.datetime.now().strftime("%Y-%m-%d")
 
     #Get existing portfolios
     portfolios = mdb_query.get_portfolios(currDate)[["portfolioID","inceptionDate"]]
     #Loop through portfolios
     mdb_symbols = pandas.DataFrame()
     for portfolio_index, portfolio_row in portfolios.iterrows():
         #Get portfolioID and inceptionDate
         portfolio = portfolio_row['portfolioID']
         inceptionDate = portfolio_row['inceptionDate']
         #Default to calculating holdings from inception
         date = inceptionDate
         #Get current holdings table
         holdings = mdb_query.get_holdings(portfolio, inceptionDate, "after")
         #print( holdings )
         mdb_symbols = mdb_symbols.append(holdings, ignore_index=True, sort=False)
         #print( mdb_symbols )
     mdb_symbols = mdb_symbols[mdb_symbols['symbol'] != 'USD']
     mdb_symbols = mdb_symbols['symbol'].unique().tolist()
     #print( mdb_symbols )
     #quit()
 
     #Get latest dividend in MongoDB for each symbol
     mdb_dividends = mdb_query.get_dividends( mdb_symbols, currDate, "latest" )
     #Initial call to print 0% progress
     printProgressBar(0, len(mdb_symbols), prefix = 'Progress:', suffix = '', length = 50)
     #flag = False
     #Loop through symbols
     for index, mdb_symbol in enumerate(mdb_symbols):
         #if mdb_symbol["symbol"] == "ZZZZZZZZZ":
         #    flag = True
         #if not flag:
         #    continue
         #Get 1m of dividends from IEX
         iex_dividends = iex.get_dividends( mdb_symbol, ref_range='1m' )
         #Get matching dividend in MongoDB
         mdb_dividend = mdb_dividends[ mdb_dividends['symbol'] == mdb_symbol ]
         #Select dividends more recent than MongoDB
         if not mdb_dividend.empty and not iex_dividends.empty:
             mask = iex_dividends['exDate'] > mdb_dividend['exDate'].iloc[0]
             iex_dividends = iex_dividends.loc[mask]
         #Insert if dividends exist
         if not iex_dividends.empty:
             #Update progress bar
             printProgressBar(index+1, len(mdb_symbols), prefix = 'Progress:', suffix = "Inserting dividend for " + mdb_symbol + "      ", length = 50)
             #print( iex_dividends )
             self.db.iex_dividends.insert_many( iex_dividends.to_dict('records') )
         else:
             #Update progress bar
             printProgressBar(index+1, len(mdb_symbols), prefix = 'Progress:', suffix = "No new data for " + mdb_symbol + "      ", length = 50)
Пример #4
0
 def insert_stats(self):
     print( "Insert new stats" )
     mdb_query = Query()
     iex = Iex()
     #Get all symbols in MongoDB
     mdb_symbols_full = mdb_query.get_active_companies()
     #mdb_symbols_full = mdb_symbols_full[mdb_symbols_full == 'A']
     #Get current date
     currDate = datetime.datetime.now().strftime("%Y-%m-%d")
     #Initial call to print 0% progress
     printProgressBar(0, len(mdb_symbols_full.index), prefix = 'Progress:', suffix = '', length = 50)
     idx_min = 0
     query_num = 100
     #flag = True
     while idx_min < len(mdb_symbols_full.index):
         #if idx_min > 1:
         #    break
         idx_max = idx_min + query_num
         if idx_max > len(mdb_symbols_full.index):
             idx_max = len(mdb_symbols_full.index)
         mdb_symbols = mdb_symbols_full.iloc[ idx_min:idx_max ]
         mdb_symbols.reset_index(drop=True, inplace=True)
         #Get latest price in MongoDB for each symbol up to 50 days ago
         mdb_stats = mdb_query.get_stats( mdb_symbols.tolist(), currDate, "latest" )
         #Loop through symbols
         for index, mdb_symbol in mdb_symbols.iteritems():
             #Get stat from IEX
             #print( mdb_symbol )
             #print( mdb_symbol["symbol"] )
             #if mdb_symbol == "BAH":
             #    flag = False
             #if flag:
             #    continue
             iex_stat = iex.get_stats( mdb_symbol )
             #Get matching stat in MongoDB
             if not mdb_stats.empty:
                 mdb_stat = mdb_stats[ mdb_stats['symbol'] == mdb_symbol ]
             else:
                 mdb_stat = mdb_stats
             #Select stats more recent than MongoDB
             if not iex_stat.empty and not mdb_stat.empty:
                 mask = iex_stat['date'] > mdb_stat['date'].iloc[0]
                 iex_stat = iex_stat.loc[mask]
             #Insert if stats exist
             #print( iex_stat )
             if not iex_stat.empty:
                 #Update progress bar
                 printProgressBar(idx_min+index+1, len(mdb_symbols_full.index), prefix = 'Progress:', suffix = "Inserting stat for " + mdb_symbol + "      ", length = 50)
                 self.db.iex_stats.insert_many( iex_stat.to_dict('records') )
             else:
                 #Update progress bar
                 printProgressBar(idx_min+index+1, len(mdb_symbols_full.index), prefix = 'Progress:', suffix = "No new data for " + mdb_symbol + "      ", length = 50)
         idx_min = idx_min + query_num
Пример #5
0
 def insert_quotes(self):
     print( "Insert new quotes" )
     mdb_query = Query()
     iex = Iex()
     #Get all symbols in MongoDB
     mdb_symbols_full = mdb_query.get_active_companies()
     #Get current date
     currDate = datetime.datetime.now().strftime("%Y-%m-%d")
     #Initial call to print 0% progress
     printProgressBar(0, len(mdb_symbols_full.index), prefix = 'Progress:', suffix = '', length = 50)
     idx_min = 0
     query_num = 100
     while idx_min < len(mdb_symbols_full.index):
         idx_max = idx_min + query_num
         if idx_max > len(mdb_symbols_full.index):
             idx_max = len(mdb_symbols_full.index)
         mdb_symbols = mdb_symbols_full.iloc[ idx_min:idx_max ]
         mdb_symbols.reset_index(drop=True, inplace=True)
         #Get latest price in MongoDB for each symbol up to 50 days ago
         mdb_quotes = mdb_query.get_quotes( mdb_symbols.tolist(), currDate, "latest" )
         #Loop through symbols
         iex_quotes = pandas.DataFrame()
         for index, mdb_symbol in mdb_symbols.iteritems():
             #Get matching quote in MongoDB
             if not mdb_quotes.empty:
                 mdb_quote = mdb_quotes[ mdb_quotes['symbol'] == mdb_symbol ]
             else:
                 mdb_quote = mdb_quotes
             #continue if already up to date
             if not mdb_quote.empty and (mdb_quote['date'].iloc[0] == currDate):
                 #Update progress bar
                 printProgressBar(idx_min+index+1, len(mdb_symbols_full.index), prefix = 'Progress:', suffix = "No new data for " + mdb_symbol + "      ", length = 50)
                 continue
             #Get quote from IEX
             iex_quote = iex.get_quote( mdb_symbol )
             #Select quotes more recent than MongoDB
             if not iex_quote.empty and not mdb_quote.empty:
                 mask = iex_quote['date'] > mdb_quote['date'].iloc[0]
                 iex_quote = iex_quote.loc[mask]
             #Insert if quotes exist
             if not iex_quote.empty:
                 #Update progress bar
                 printProgressBar(idx_min+index+1, len(mdb_symbols_full.index), prefix = 'Progress:', suffix = "Inserting quote for " + mdb_symbol + "      ", length = 50)
                 #Append quote
                 iex_quotes = iex_quotes.append(iex_quote, ignore_index=True, sort=False)
             else:
                 #Update progress bar
                 printProgressBar(idx_min+index+1, len(mdb_symbols_full.index), prefix = 'Progress:', suffix = "No new data for " + mdb_symbol + "      ", length = 50)
         #Bulk insert quotes
         if not iex_quotes.empty:
             self.db.iex_quotes.insert_many( iex_quotes.to_dict('records') )
         idx_min = idx_min + query_num
Пример #6
0
 def insert_balancesheets(self):
     print( "Insert new balance sheets" )
     mdb_query = Query()
     iex = Iex()
     #Get all symbols in MongoDB
     mdb_symbols = mdb_query.get_active_companies()
     #Get current date
     currDate = datetime.datetime.now().strftime("%Y-%m-%d")
     threeMonthsAgo = (pandas.Timestamp(currDate) + pandas.DateOffset(days=-120)).strftime('%Y-%m-%d')
     #Get latest balancesheets in MongoDB for each symbol
     mdb_balancesheets = mdb_query.get_balancesheets( mdb_symbols.tolist(), currDate, "latest" )
     #Initial call to print 0% progress
     printProgressBar(0, len(mdb_symbols.index), prefix = 'Progress:', suffix = '', length = 50)
     #flag = False
     #Loop through symbols
     for index, mdb_symbol in mdb_symbols.iteritems():
         #if mdb_symbol == 'YETI':
         #    flag = True
         #if not flag:
         #    continue
         #Get matching balancesheet in MongoDB
         if not mdb_balancesheets.empty:
             mdb_balancesheet = mdb_balancesheets[ mdb_balancesheets['symbol'] == mdb_symbol ]
         else:
             mdb_balancesheet = mdb_balancesheets
         #Skip is less than 3 months since most recent
         if not mdb_balancesheet.empty: 
             mask = mdb_balancesheet['reportDate'] > threeMonthsAgo
             mdb_recent_balancesheet = mdb_balancesheet.loc[mask]
             if not mdb_recent_balancesheet.empty:
                 #Update progress bar
                 printProgressBar(index+1, len(mdb_symbols.index), prefix = 'Progress:', suffix = "Data too recent for " + mdb_symbol + "      ", length = 50)
                 continue
         #Get balancesheets from IEX
         iex_balancesheets = iex.get_balancesheets( mdb_symbol )
         #Select balancesheets more recent than MongoDB
         if not mdb_balancesheet.empty and not iex_balancesheets.empty:
             mdb_balancesheet = mdb_balancesheet.sort_values(by='reportDate', ascending=False, axis='index')
             mask = iex_balancesheets['reportDate'] > mdb_balancesheet['reportDate'].iloc[0]
             iex_balancesheets = iex_balancesheets.loc[mask]
         #Insert if balancesheets exist
         if not iex_balancesheets.empty:
             #Update progress bar
             printProgressBar(index+1, len(mdb_symbols.index), prefix = 'Progress:', suffix = "Inserting balancesheets for " + mdb_symbol + "      ", length = 50)
             self.db.iex_balancesheets.insert_many( iex_balancesheets.to_dict('records') )
         else:
             #Update progress bar
             printProgressBar(index+1, len(mdb_symbols.index), prefix = 'Progress:', suffix = "No new data for " + mdb_symbol + "      ", length = 50)
Пример #7
0
 def insert_symbols(self):
     print( "Insert new symbols" )
     mdb_query = Query()
     iex = Iex()
     #Get all common stocks from IEX
     symbols = iex.get_symbols(ref_type="cs")
     #Get SPY (S&P500 exchange traded index) from IEX
     symbols_spy = iex.get_symbols(ref_symbol="SPY")
     #Reset indices (probably not necessary)
     symbols.reset_index(drop=True, inplace=True)
     symbols_spy.reset_index(drop=True, inplace=True)
     #Append SPY to stocks
     symbols = symbols.append(symbols_spy, ignore_index=True, sort=False)
     symbols.reset_index(drop=True, inplace=True)
     #Get symbols already in MongoDB
     mdb_symbols = mdb_query.get_symbols()
     #Initial call to print 0% progress
     printProgressBar(0, len(symbols.index), prefix = 'Progress:', suffix = '', length = 50)
     #Loop through symbols
     for index, symbol in symbols.iterrows():
         #Exclude forbidden characters
         forbidden = ["#"]
         if any( x in symbol["symbol"] for x in forbidden):
             #Update progress bar
             printProgressBar(index+1, len(symbols.index), prefix = 'Progress:', suffix = "Symbol contains forbidden character: " + symbol["symbol"] + "                     ", length = 50)
             continue
         #If MongoDB empty insert symbol
         if mdb_symbols.empty:
             #Update progress bar
             printProgressBar(index+1, len(symbols.index), prefix = 'Progress:', suffix = "Inserting new symbol: " + symbol["symbol"] + "                     ", length = 50)
             self.db.iex_symbols.insert_one( symbol.to_dict() )
         else:
             #Is symbol already in MongoDB
             mask = (mdb_symbols['iexId'] == symbol['iexId']) & (mdb_symbols['isEnabled'] == symbol['isEnabled']) & (mdb_symbols['name'] == symbol['name']) & (mdb_symbols['type'] == symbol['type']) 
             #Insert if not in MongoDB
             if mdb_symbols.loc[mask].empty:
                 #Update progress bar
                 printProgressBar(index+1, len(symbols.index), prefix = 'Progress:', suffix = "Inserting new symbol: " + symbol["symbol"] + "                     ", length = 50)
                 self.db.iex_symbols.insert_one( symbol.to_dict() )
             else:
                 #Update progress bar
                 printProgressBar(index+1, len(symbols.index), prefix = 'Progress:', suffix = "Symbol " + symbol["symbol"] + " already exists                     ", length = 50)
Пример #8
0
 def insert_prices(self):
     print( "Insert new charts" )
     mdb_query = Query()
     iex = Iex()
     #Get all symbols in MongoDB
     mdb_symbols_full = mdb_query.get_active_companies()
     mdb_symbols_full = mdb_symbols_full[mdb_symbols_full == 'SPY']
     #Get current date
     currDate = datetime.datetime.now().strftime("%Y-%m-%d")
     #Initial call to print 0% progress
     printProgressBar(0, len(mdb_symbols_full.index), prefix = 'Progress:', suffix = '', length = 50)
     idx_min = 0
     query_num = 100
     #flag = False
     while idx_min < len(mdb_symbols_full.index):
         #if idx_min > 1:
         #    break
         idx_max = idx_min + query_num
         if idx_max > len(mdb_symbols_full.index):
             idx_max = len(mdb_symbols_full.index)
         mdb_symbols = mdb_symbols_full.iloc[ idx_min:idx_max ]
         mdb_symbols.reset_index(drop=True, inplace=True)
         #Get latest price in MongoDB for each symbol up to 50 days ago
         mdb_charts = mdb_query.get_chart( mdb_symbols.tolist(), currDate, "latest" )
         #print( mdb_charts )
         #break
         #Loop through symbols
         for index, mdb_symbol in mdb_symbols.iteritems():
             #Get matching chart in MongoDB
             mdb_chart = mdb_charts[ mdb_charts['symbol'] == mdb_symbol ]
             #Get first date to insert
             date = mdb_chart.date.iloc[0]
             date = (pandas.Timestamp(date) + pandas.DateOffset(days=1)).strftime('%Y-%m-%d')
             iex_chart = pandas.DataFrame()
             while date <= currDate:
                 #Get date in correct format for IEX query
                 iex_date = (pandas.Timestamp(date)).strftime('%Y%m%d')
                 #Get IEX chart
                 iex_chart_day = iex.get_chart( mdb_symbol, ref_range=iex_date )
                 iex_chart = iex_chart.append(iex_chart_day, ignore_index=True, sort=False)
                 #Increment date
                 date = (pandas.Timestamp(date) + pandas.DateOffset(days=1)).strftime('%Y-%m-%d')
             #Get 1y of charts from IEX
             #print( mdb_symbol )
             #print( mdb_symbol["symbol"] )
             #if mdb_symbol["symbol"] == "ZZZZZZZZZ":
             #    flag = True
             #if not flag:
             #    continue
             #iex_chart = iex.get_chart( mdb_symbol, ref_range='5d' )
             #Get matching chart in MongoDB
             #mdb_chart = mdb_charts[ mdb_charts['symbol'] == mdb_symbol ]
             #Select charts more recent than MongoDB
             #if not iex_chart.empty and not mdb_chart.empty:
             #    mask = iex_chart['date'] > mdb_chart['date'].iloc[0]
             #    iex_chart = iex_chart.loc[mask]
             #Insert if charts exist
             #print( iex_chart )
             if not iex_chart.empty:
                 #Update progress bar
                 printProgressBar(idx_min+index+1, len(mdb_symbols_full.index), prefix = 'Progress:', suffix = "Inserting chart for " + mdb_symbol + "      ", length = 50)
                 #Print write error if couldn't insert charts
                 try:
                     print( iex_chart )
                     self.db.iex_charts.insert_many( iex_chart.to_dict('records') )
                 except BulkWriteError as bwe:
                     print( bwe.details )
                     raise
             else:
                 #Update progress bar
                 printProgressBar(idx_min+index+1, len(mdb_symbols_full.index), prefix = 'Progress:', suffix = "No new data for " + mdb_symbol + "      ", length = 50)
         idx_min = idx_min + query_num