2018-12-17 16:05:36 -08:00
# StockData.py
# Andrew Dinh
# Python 3.6.1
2018-12-18 17:45:33 -08:00
# Description: Returns all available dates and prices for each stock requested.
2018-12-17 16:05:36 -08:00
2018-12-19 21:32:14 -08:00
'''
Available API ' s: Can it do mutual funds?
IEX : No
Alpha Vantage ( AV ) : Yes
Tiingo : Yes
Barchart : No
'''
2018-12-17 16:05:36 -08:00
# Alpha Vantage API Key: O42ICUV58EIZZQMU
2018-12-19 21:32:14 -08:00
# Barchart API Key: a17fab99a1c21cd6f847e2f82b592838 # Possible other one? f40b136c6dc4451f9136bb53b9e70ffa
2018-12-17 16:05:36 -08:00
# Tiingo API Key: 2e72b53f2ab4f5f4724c5c1e4d5d4ac0af3f7ca8
2018-12-23 09:24:18 -08:00
# Tradier API Key: n26IFFpkOFRVsB5SNTVNXicE5MPD
2018-12-17 16:05:36 -08:00
# If you're going to take these API keys and abuse it, you should really reconsider your life priorities
apiAV = ' O42ICUV58EIZZQMU '
2018-12-19 21:32:14 -08:00
#apiBarchart = 'a17fab99a1c21cd6f847e2f82b592838' # 150 getHistory queries per day
apiBarchart = ' f40b136c6dc4451f9136bb53b9e70ffa '
apiTiingo = ' 2e72b53f2ab4f5f4724c5c1e4d5d4ac0af3f7ca8 '
2018-12-23 09:24:18 -08:00
apiTradier = ' n26IFFpkOFRVsB5SNTVNXicE5MPD '
2018-12-19 21:32:14 -08:00
'''
Monthly Bandwidth = 5 GB
Hourly Requests = 500
Daily Requests = 20 , 000
Symbol Requests = 500
'''
2018-12-17 16:05:36 -08:00
2019-01-17 08:50:19 -08:00
import requests , json
2018-12-18 14:35:51 -08:00
from datetime import datetime
2018-12-18 11:53:14 -08:00
2019-01-16 08:54:06 -08:00
class StockData :
2018-12-18 17:45:33 -08:00
2019-01-16 08:54:06 -08:00
def __init__ ( self , newName = ' ' , newAbsFirstLastDates = [ ] , newFinalDatesAndClose = [ ] , newFinalDatesAndClose2 = [ ] , newAllLists = [ ] ) :
2018-12-18 11:53:14 -08:00
self . name = newName # Name of stock
self . absFirstLastDates = newAbsFirstLastDates # Absolute first and last dates from all sources
2019-01-16 08:54:06 -08:00
self . finalDatesAndClose = newFinalDatesAndClose # All available dates with corresponding close values
self . finalDatesAndClose2 = newFinalDatesAndClose2 # After some consideration, I decided to keep what I had already done here and make a new list that's the same except dates are in datetime format
2018-12-21 09:59:40 -08:00
self . allLists = newAllLists
2018-12-18 14:35:51 -08:00
'''
2019-01-16 08:54:06 -08:00
Format :
2018-12-18 14:35:51 -08:00
# List from each source containing: [firstDate, lastDate, allDates, values, timeFrame]
# firstDate & lastDate = '2018-12-18' (year-month-date)
allDates = [ ' 2018-12-17 ' , ' 2018-12-14 ' ] ( year - month - date )
values ( close ) = [ ' 164.6307 ' , 164.6307 ]
timeFrame = [ days , weeks , years ]
'''
2018-12-21 09:59:40 -08:00
def set ( self , newName , newFirstLastDates , newAbsFirstLastDates , newFinalDatesAndClose , newAllLists ) :
2018-12-18 11:53:14 -08:00
self . name = newName # Name of stock
2018-12-21 09:59:40 -08:00
self . firstLastDates = newFirstLastDates # Dates that at least 2 sources have (or should it be all?) - Maybe let user decide
2018-12-18 11:53:14 -08:00
self . absFirstLastDates = newAbsFirstLastDates # Absolute first and last dates from all sources
2018-12-21 09:59:40 -08:00
self . finalDatesAndClose = newFinalDatesAndClose
self . allLists = newAllLists
def setName ( self , newName ) :
self . name = newName
2019-01-16 08:54:06 -08:00
def returnName ( self ) :
return self . name
def returnAllLists ( self ) :
return self . allLists
def returnAbsFirstLastDates ( self ) :
return self . absFirstLastDates
def returnAllLists ( self ) :
2018-12-31 16:37:51 -08:00
return self . allLists
2019-01-16 08:54:06 -08:00
def returnFinalDatesAndClose ( self ) :
return self . finalDatesAndClose
def returnFinalDatesAndClose2 ( self ) :
return self . finalDatesAndClose2
2018-12-31 16:37:51 -08:00
2018-12-18 11:53:14 -08:00
def getIEX ( self ) :
2018-12-18 17:45:33 -08:00
url = ' ' . join ( ( ' https://api.iextrading.com/1.0/stock/ ' , self . name , ' /chart/5y ' ) )
2018-12-17 17:49:13 -08:00
#link = "https://api.iextrading.com/1.0/stock/spy/chart/5y"
2018-12-18 14:35:51 -08:00
print ( " \n Sending request to: " , url )
2018-12-17 17:49:13 -08:00
f = requests . get ( url )
json_data = f . text
2018-12-21 09:59:40 -08:00
#print(json_data)
if ( json_data == ' Unknown symbol ' ) :
print ( " IEX not available " )
return ' Not available '
2018-12-17 17:49:13 -08:00
loaded_json = json . loads ( json_data )
2018-12-18 11:53:14 -08:00
listIEX = [ ]
2018-12-18 14:35:51 -08:00
print ( " \n Finding first and last date " )
# Adding (firstDate, lastDate) to listIEX
2018-12-18 11:53:14 -08:00
# Find firstDate (comes first)
firstLine = loaded_json [ 0 ]
#print("firstLine:", firstLine)
firstDate = firstLine [ ' date ' ]
#print("firstDate:",firstDate)
# Find lastDate (comes last)
lastLine = loaded_json [ - 1 ] # Returns last value of the list (Equivalent to len(loaded_json)-1)
2018-12-17 17:49:13 -08:00
#print("lastLine:", lastLine)
2018-12-18 11:53:14 -08:00
lastDate = lastLine [ ' date ' ]
#print("last date:", lastDate)
listIEX . append ( firstDate )
listIEX . append ( lastDate )
2018-12-18 14:35:51 -08:00
print ( listIEX [ 0 ] , ' , ' , listIEX [ 1 ] )
2018-12-18 11:53:14 -08:00
2018-12-18 14:35:51 -08:00
print ( " \n Finding all dates given " )
2018-12-18 11:53:14 -08:00
allDates = [ ]
# for i in range(0, len(loaded_json), 1): # If you want to do oldest first
2018-12-18 14:35:51 -08:00
for i in range ( len ( loaded_json ) - 1 , - 1 , - 1 ) :
2018-12-18 11:53:14 -08:00
line = loaded_json [ i ]
date = line [ ' date ' ]
allDates . append ( date )
listIEX . append ( allDates )
2018-12-19 21:32:14 -08:00
#print(listIEX[2])
print ( len ( listIEX [ 2 ] ) , " dates " )
2018-12-18 14:35:51 -08:00
print ( " \n Finding close values for each date " )
values = [ ]
# for i in range(0, len(loaded_json), 1): # If you want to do oldest first
for i in range ( len ( loaded_json ) - 1 , - 1 , - 1 ) :
line = loaded_json [ i ]
value = line [ ' close ' ]
values . append ( value )
listIEX . append ( values )
#print(listIEX[3])
2018-12-19 21:32:14 -08:00
print ( len ( listIEX [ 3 ] ) , " close values " )
2018-12-18 14:35:51 -08:00
print ( " \n Finding time frame given [days, weeks, years] " )
timeFrame = [ ]
d1 = datetime . strptime ( firstDate , " % Y- % m- %d " )
d2 = datetime . strptime ( lastDate , " % Y- % m- %d " )
timeFrameDays = abs ( ( d2 - d1 ) . days )
#print(timeFrameDays)
timeFrameYears = float ( timeFrameDays / 365 )
timeFrameWeeks = float ( timeFrameDays / 7 )
timeFrame . append ( timeFrameDays )
timeFrame . append ( timeFrameWeeks )
timeFrame . append ( timeFrameYears )
listIEX . append ( timeFrame )
print ( listIEX [ 4 ] )
2018-12-18 11:53:14 -08:00
return listIEX
2018-12-17 17:49:13 -08:00
2018-12-18 14:35:51 -08:00
def getAV ( self ) :
listAV = [ ]
2019-01-22 10:49:58 -08:00
#url = ''.join(('https://www.alphavantage.co/query?function=TIME_SERIES_MONTHLY&symbol=', self.name, '&apikey=', apiAV))
2018-12-17 17:49:13 -08:00
# https://www.alphavantage.co/query?function=TIME_SERIES_MONTHLY&symbol=MSFT&apikey=demo
2019-01-22 10:49:58 -08:00
#url = ''.join(('https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=', self.name, '&outputsize=full&apikey=', apiAV))
# https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&outputsize=full&apikey=demo
url = ' ' . join ( ( ' https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol= ' , self . name , ' &outputsize=full&apikey= ' , apiAV ) )
# https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=MSFT&outputsize=full&apikey=demo
2018-12-18 14:35:51 -08:00
print ( " \n Sending request to: " , url )
2019-01-22 10:49:58 -08:00
print ( " (This will take a while) " )
2018-12-17 16:05:36 -08:00
f = requests . get ( url )
json_data = f . text
loaded_json = json . loads ( json_data )
2018-12-21 09:59:40 -08:00
#print(loaded_json)
#print(type(loaded_json)) # Dictionary
#print(len(loaded_json))
if len ( loaded_json ) == 1 :
print ( " Alpha Vantage not available " )
return ' Not available '
2018-12-17 17:49:13 -08:00
#print(loaded_json['Monthly Time Series'])
2019-01-22 10:49:58 -08:00
dailyTimeSeries = loaded_json [ ' Time Series (Daily) ' ]
2018-12-17 17:49:13 -08:00
#print(monthlyTimeSeries)
2019-01-22 10:49:58 -08:00
listOfDates = list ( dailyTimeSeries )
2018-12-17 17:49:13 -08:00
#print(listOfDates)
2018-12-18 14:35:51 -08:00
firstDate = listOfDates [ - 1 ]
lastDate = listOfDates [ 0 ]
#print("firstDate:", firstDate)
#print("lastDate:", lastDate)
listAV . append ( firstDate )
listAV . append ( lastDate )
listAV . append ( listOfDates )
print ( " \n Finding first and last date " )
print ( listAV [ 0 ] , ' , ' , listAV [ 1 ] )
print ( " \n Finding all dates given " )
#print(listAV[2])
2018-12-19 21:32:14 -08:00
print ( len ( listAV [ 2 ] ) , " dates " )
2018-12-18 14:35:51 -08:00
print ( " \n Finding close values for each date " )
values = [ ]
for i in range ( 0 , len ( listOfDates ) , 1 ) :
temp = listOfDates [ i ]
2019-01-22 10:49:58 -08:00
loaded_json2 = dailyTimeSeries [ temp ]
#value = loaded_json2['4. close']
value = loaded_json2 [ ' 5. adjusted close ' ]
2018-12-18 14:35:51 -08:00
values . append ( value )
listAV . append ( values )
#print(listOfDates[0])
#i = listOfDates[0]
#print(monthlyTimeSeries[i])
#print(listAV[3])
2018-12-19 21:32:14 -08:00
print ( len ( listAV [ 3 ] ) , " close values " )
2018-12-18 14:35:51 -08:00
print ( " \n Finding time frame given [days, weeks, years] " )
timeFrame = [ ]
d1 = datetime . strptime ( firstDate , " % Y- % m- %d " )
d2 = datetime . strptime ( lastDate , " % Y- % m- %d " )
timeFrameDays = abs ( ( d2 - d1 ) . days )
#print(timeFrameDays)
timeFrameYears = float ( timeFrameDays / 365 )
timeFrameWeeks = float ( timeFrameDays / 7 )
timeFrame . append ( timeFrameDays )
timeFrame . append ( timeFrameWeeks )
timeFrame . append ( timeFrameYears )
listAV . append ( timeFrame )
print ( listAV [ 4 ] )
2018-12-17 17:49:13 -08:00
2018-12-18 14:35:51 -08:00
return listAV
def getTiingo ( self ) :
'''
#OR we can use the token directly in the url
2018-12-17 17:49:13 -08:00
headers = {
' Content-Type ' : ' application/json '
}
requestResponse = requests . get ( " https://api.tiingo.com/api/test?token=<TOKEN> " ,
headers = headers )
print ( requestResponse . json ( ) )
'''
token = ' ' . join ( ( ' Token ' , apiTiingo ) )
headers = {
' Content-Type ' : ' application/json ' ,
' Authorization ' : token
}
2018-12-19 15:52:31 -08:00
url = ' ' . join ( ( ' https://api.tiingo.com/tiingo/daily/ ' , self . name ) )
2018-12-18 14:35:51 -08:00
print ( " \n Sending request to: " , url )
2018-12-17 17:49:13 -08:00
requestResponse = requests . get ( url , headers = headers )
#print(requestResponse.json())
loaded_json = requestResponse . json ( )
2018-12-21 09:59:40 -08:00
#print(len(loaded_json))
if len ( loaded_json ) == 1 :
print ( " Tiingo not available " )
return ' Not available '
2018-12-17 17:49:13 -08:00
#print(loaded_json)
'''
list1 = list ( loaded_json )
for i in range ( 0 , len ( list1 ) , 1 ) :
if list1 [ i ] == ' startDate ' :
startNum = i
elif list1 [ i ] == ' endDate ' :
endNum = i
print ( list1 [ startNum ] )
print ( list1 [ endNum ] )
'''
2018-12-18 14:35:51 -08:00
listTiingo = [ ]
print ( " \n Finding first and last date " )
2018-12-17 17:49:13 -08:00
firstDate = loaded_json [ ' startDate ' ]
2018-12-18 11:53:14 -08:00
lastDate = loaded_json [ ' endDate ' ]
2018-12-17 17:49:13 -08:00
#print(firstDate)
2018-12-18 11:53:14 -08:00
#print(lastDate)
2018-12-18 14:35:51 -08:00
listTiingo . append ( firstDate )
listTiingo . append ( lastDate )
print ( listTiingo [ 0 ] , ' , ' , listTiingo [ 1 ] )
print ( " \n Finding all dates given " )
2018-12-17 17:49:13 -08:00
dates = [ ]
2018-12-18 14:35:51 -08:00
values = [ ] # Used loop for finding values
url2 = ' ' . join ( ( url , ' /prices?startDate= ' , firstDate , ' &endDate= ' , lastDate ) )
# https://api.tiingo.com/tiingo/daily/<ticker>/prices?startDate=2012-1-1&endDate=2016-1-1
print ( " \n Sending request to: " , url2 )
requestResponse2 = requests . get ( url2 , headers = headers )
loaded_json2 = requestResponse2 . json ( )
#print(loaded_json2)
#print(len(loaded_json2))
for i in range ( len ( loaded_json2 ) - 1 , - 1 , - 1 ) :
line = loaded_json2 [ i ]
dateWithTime = line [ ' date ' ]
temp = dateWithTime . split ( ' T00:00:00.000Z ' )
date = temp [ 0 ]
dates . append ( date )
value = line [ ' close ' ]
values . append ( value )
listTiingo . append ( dates )
#print(listTiingo[2])
2018-12-19 21:32:14 -08:00
print ( len ( listTiingo [ 2 ] ) , " dates " )
2018-12-18 14:35:51 -08:00
print ( " Finding close values for each date " )
# Used loop from finding dates
listTiingo . append ( values )
#print(listTiingo[3])
2018-12-21 09:59:40 -08:00
print ( len ( listTiingo [ 3 ] ) , " close values " )
2018-12-18 14:35:51 -08:00
print ( " Finding time frame given [days, weeks, years] " )
timeFrame = [ ]
d1 = datetime . strptime ( firstDate , " % Y- % m- %d " )
d2 = datetime . strptime ( lastDate , " % Y- % m- %d " )
timeFrameDays = abs ( ( d2 - d1 ) . days )
#print(timeFrameDays)
timeFrameYears = float ( timeFrameDays / 365 )
timeFrameWeeks = float ( timeFrameDays / 7 )
timeFrame . append ( timeFrameDays )
timeFrame . append ( timeFrameWeeks )
timeFrame . append ( timeFrameYears )
listTiingo . append ( timeFrame )
print ( listTiingo [ 4 ] )
return listTiingo
2018-12-17 16:05:36 -08:00
2018-12-17 22:19:20 -08:00
def getFirstLastDate ( self , listOfFirstLastDates ) :
listOfFirstDates = [ ]
listOfLastDates = [ ]
#print(len(listOfFirstLastDates))
for i in range ( 0 , len ( listOfFirstLastDates ) , 1 ) :
2018-12-18 14:35:51 -08:00
firstLastDates = listOfFirstLastDates [ i ]
firstDate = firstLastDates [ 0 ]
lastDate = firstLastDates [ 1 ]
2018-12-17 22:19:20 -08:00
listOfFirstDates . append ( firstDate )
listOfLastDates . append ( lastDate )
#print(listOfFirstDates)
#print(listOfLastDates)
for i in range ( 0 , len ( listOfFirstDates ) , 1 ) :
date = listOfFirstDates [ i ]
if i == 0 :
firstDate = date
2018-12-19 15:52:31 -08:00
yearMonthDay = firstDate . split ( ' - ' )
firstYear = yearMonthDay [ 0 ]
firstMonth = yearMonthDay [ 1 ]
firstDay = yearMonthDay [ 2 ]
2018-12-17 22:19:20 -08:00
else :
2018-12-19 15:52:31 -08:00
yearMonthDay = date . split ( ' - ' )
year = yearMonthDay [ 0 ]
month = yearMonthDay [ 1 ]
day = yearMonthDay [ 2 ]
2018-12-17 22:19:20 -08:00
if year < firstYear or ( year == firstYear and month < firstMonth ) or ( year == firstYear and month == firstMonth and day < firstDay ) :
firstDate = date
firstYear = year
firstMonth = month
firstDay = day
#print(firstDate)
2018-12-21 09:59:40 -08:00
if len ( listOfFirstDates ) > 1 :
for i in range ( 0 , len ( listOfLastDates ) , 1 ) :
date = listOfLastDates [ i ]
if i == 0 :
lastDate = date
yearMonthDay = lastDate . split ( ' - ' )
lastYear = yearMonthDay [ 0 ]
lastMonth = yearMonthDay [ 1 ]
lastDay = yearMonthDay [ 2 ]
else :
yearMonthDay = date . split ( ' - ' )
year = yearMonthDay [ 0 ]
month = yearMonthDay [ 1 ]
day = yearMonthDay [ 2 ]
if year > lastYear or ( year == lastYear and month > lastMonth ) or ( year == lastYear and month == lastMonth and day > lastDay ) :
lastDate = date
lastYear = year
lastMonth = month
lastDay = day
2018-12-17 22:19:20 -08:00
#print(lastDate)
2018-12-18 14:35:51 -08:00
absFirstLastDates = [ ]
absFirstLastDates . append ( firstDate )
absFirstLastDates . append ( lastDate )
return absFirstLastDates
2018-12-18 17:45:33 -08:00
def getFinalDatesAndClose ( self ) :
# finalDates and finalClose will coincide (aka i = 1 will correspond to one another)
2018-12-19 15:52:31 -08:00
finalDatesAndClose = [ ] # Will combine finalDates then finalClose
2018-12-18 17:45:33 -08:00
finalDates = [ ]
finalClose = [ ]
#print(self.absFirstLastDates)
absFirstDate = self . absFirstLastDates [ 0 ]
absLastDate = self . absFirstLastDates [ 1 ]
date = absFirstDate
2018-12-19 15:52:31 -08:00
allLists = self . allLists
while date != absLastDate : # DOESN'T DO LAST DATE
tempListOfClose = [ ]
found = False
for j in range ( 0 , len ( allLists ) , 1 ) : # Look for date in all lists
list1 = allLists [ j ]
listOfDates = list1 [ 2 ]
listOfClose = list1 [ 3 ]
for k in range ( 0 , len ( listOfDates ) , 1 ) :
if listOfDates [ k ] == date :
if found == False :
finalDates . append ( date )
found = True
#print(listOfDates[k])
#print(listOfClose[k])
#print(listOfClose)
tempListOfClose . append ( float ( listOfClose [ k ] ) )
k = len ( listOfDates ) # Dates don't repeat
if found == True :
sum = 0
for r in range ( 0 , len ( tempListOfClose ) , 1 ) :
sum = sum + tempListOfClose [ r ]
close = sum / len ( tempListOfClose )
finalClose . append ( close )
#print(close)
# Go to the next day
yearMonthDay = date . split ( ' - ' )
year = int ( yearMonthDay [ 0 ] )
month = int ( yearMonthDay [ 1 ] )
day = int ( yearMonthDay [ 2 ] )
day = day + 1
if day == 32 and month == 12 : # Next year
day = 1
2018-12-21 09:59:40 -08:00
month = 1
2018-12-19 15:52:31 -08:00
year = year + 1
elif day == 32 : # Next month
month = month + 1
day = 1
if day < 10 :
day = ' ' . join ( ( ' 0 ' , str ( day ) ) )
if month < 10 :
month = ' ' . join ( ( ' 0 ' , str ( month ) ) )
date = ' ' . join ( ( str ( year ) , ' - ' , str ( month ) , ' - ' , str ( day ) ) )
#print(date)
# For last date
finalDates . append ( date )
tempListOfClose = [ ]
for j in range ( 0 , len ( allLists ) , 1 ) : # Look for date in all lists
list1 = allLists [ j ]
listOfDates = list1 [ 2 ]
listOfClose = list1 [ 3 ]
for k in range ( 0 , len ( listOfDates ) , 1 ) :
if listOfDates [ k ] == date :
tempListOfClose . append ( float ( listOfClose [ k ] ) )
k = len ( listOfDates ) # Dates don't repeat
sum = 0
for r in range ( 0 , len ( tempListOfClose ) , 1 ) :
sum = sum + tempListOfClose [ r ]
close = sum / len ( tempListOfClose )
finalClose . append ( close )
#print(finalDates)
#print(finalClose)
# Want lists from most recent to oldest, comment this out if you don't want that
finalDates = list ( reversed ( finalDates ) )
2019-01-16 08:54:06 -08:00
finalClose = list ( reversed ( finalClose ) )
2018-12-19 15:52:31 -08:00
finalDatesAndClose . append ( finalDates )
finalDatesAndClose . append ( finalClose )
return finalDatesAndClose
2018-12-18 17:45:33 -08:00
2019-01-16 08:54:06 -08:00
def datetimeDates ( self ) :
finalDatesAndClose2 = [ ]
finalDatesAndClose = self . finalDatesAndClose
finalDatesStrings = finalDatesAndClose [ 0 ]
finalClose = finalDatesAndClose [ 1 ]
finalDates = [ ]
2019-01-17 08:50:19 -08:00
from Functions import Functions
2019-01-16 08:54:06 -08:00
for i in range ( 0 , len ( finalDatesStrings ) , 1 ) :
temp = Functions . stringToDate ( finalDatesStrings [ i ] )
finalDates . append ( temp )
#print(finalDates)
finalDatesAndClose2 . append ( finalDates )
finalDatesAndClose2 . append ( finalClose )
return ( finalDatesAndClose2 )
2018-12-21 09:59:40 -08:00
def is_connected ( ) :
2019-01-17 08:50:19 -08:00
import socket # To check internet connection
2018-12-21 09:59:40 -08:00
try :
# connect to the host -- tells us if the host is actually
# reachable
socket . create_connection ( ( " www.andrewkdinh.com " , 80 ) )
return True
except OSError :
2018-12-31 16:37:51 -08:00
#pass
print ( " \n No internet connection! " )
2018-12-21 09:59:40 -08:00
return False
2018-12-18 14:35:51 -08:00
def main ( self ) :
2019-01-17 08:50:19 -08:00
import importlib . util , sys # To check whether a package is installed
2018-12-19 16:14:03 -08:00
2018-12-19 21:32:14 -08:00
packages = [ ' requests ' ]
for i in range ( 0 , len ( packages ) , 1 ) :
package_name = packages [ i ]
spec = importlib . util . find_spec ( package_name )
if spec is None :
print ( package_name + " is not installed \n Please type in ' pip install -r requirements.txt ' to install all required packages " )
2018-12-19 16:14:03 -08:00
2018-12-21 09:59:40 -08:00
# Test internet connection
2019-01-16 08:54:06 -08:00
internetConnection = StockData . is_connected ( )
2018-12-21 09:59:40 -08:00
if internetConnection == False :
return
2018-12-18 14:35:51 -08:00
listOfFirstLastDates = [ ]
2018-12-23 09:24:18 -08:00
self . allLists = [ ]
2018-12-18 14:35:51 -08:00
2019-01-22 10:49:58 -08:00
print ( ' \n NOTE: Only IEX and Alpha Vantage support adjusted returns ' )
2018-12-18 14:35:51 -08:00
# IEX
print ( " \n IEX " )
2019-01-16 08:54:06 -08:00
listIEX = StockData . getIEX ( self )
2018-12-18 14:35:51 -08:00
#print(listIEX)
2018-12-21 09:59:40 -08:00
if listIEX != ' Not available ' :
listOfFirstLastDates . append ( ( listIEX [ 0 ] , listIEX [ 1 ] ) )
self . allLists . append ( listIEX )
2018-12-23 09:24:18 -08:00
2018-12-18 14:35:51 -08:00
# Alpha Vantage
print ( " \n Alpha Vantage (AV) " )
2019-01-16 08:54:06 -08:00
listAV = StockData . getAV ( self )
2018-12-18 14:35:51 -08:00
#print(listAV)
2018-12-21 09:59:40 -08:00
if listAV != ' Not available ' :
listOfFirstLastDates . append ( ( listAV [ 0 ] , listAV [ 1 ] ) )
self . allLists . append ( listAV )
2018-12-18 14:35:51 -08:00
2018-12-19 21:32:14 -08:00
# COMMENTED OUT FOR NOW B/C LIMITED
2018-12-19 16:14:03 -08:00
'''
2018-12-19 15:52:31 -08:00
print ( " \n Tiingo " )
2019-01-22 10:49:58 -08:00
print ( " NOTE: Tiingo does not return adjusted returns!! " )
2019-01-16 08:54:06 -08:00
listTiingo = StockData . getTiingo ( self )
2018-12-18 14:35:51 -08:00
#print(listTiingo)
2018-12-21 09:59:40 -08:00
if listTiingo != ' Not available ' :
listOfFirstLastDates . append ( ( listTiingo [ 0 ] , listTiingo [ 1 ] ) )
self . allLists . append ( listTiingo )
2018-12-19 16:14:03 -08:00
'''
2019-01-16 08:54:06 -08:00
2018-12-18 17:45:33 -08:00
#print(self.allLists)
2018-12-19 15:52:31 -08:00
#print(listOfFirstLastDates)
2018-12-21 09:59:40 -08:00
if ( len ( self . allLists ) > 0 ) :
2018-12-23 09:24:18 -08:00
print ( " \n " )
2019-01-22 10:49:58 -08:00
print ( len ( self . allLists ) , " available source(s) for " , self . name )
2019-01-16 08:54:06 -08:00
self . absFirstLastDates = StockData . getFirstLastDate ( self , listOfFirstLastDates )
2018-12-21 09:59:40 -08:00
print ( " \n The absolute first date with close values is: " , self . absFirstLastDates [ 0 ] )
print ( " The absolute last date with close values is: " , self . absFirstLastDates [ 1 ] )
print ( " \n Combining dates and averaging close values " )
2019-01-16 08:54:06 -08:00
self . finalDatesAndClose = StockData . getFinalDatesAndClose ( self ) # Returns [List of Dates, List of Corresponding Close Values]
2018-12-21 09:59:40 -08:00
#print("All dates available:", self.finalDatesAndClose[0])
#print("All close values:\n", self.finalDatesAndClose[1])
finalDates = self . finalDatesAndClose [ 0 ]
finalClose = self . finalDatesAndClose [ 1 ]
print ( len ( finalDates ) , " unique dates: " , finalDates [ len ( finalDates ) - 1 ] , " ... " , finalDates [ 0 ] )
print ( len ( finalClose ) , " close values: " , finalClose [ len ( finalClose ) - 1 ] , " ... " , finalClose [ 0 ] )
2019-01-16 08:54:06 -08:00
print ( " \n Converting list of final dates to datetime " )
self . finalDatesAndClose2 = StockData . datetimeDates ( self )
#print(self.finalDatesAndClose2[0][0])
2018-12-21 09:59:40 -08:00
else :
print ( " No sources have data for " , self . name )
2018-12-18 17:45:33 -08:00
def main ( ) : # For testing purposes
2018-12-23 09:24:18 -08:00
stockName = ' spy '
2019-01-16 08:54:06 -08:00
stock1 = StockData ( stockName )
2018-12-18 17:45:33 -08:00
print ( " Finding available dates and close values for " , stock1 . name )
2019-01-16 08:54:06 -08:00
StockData . main ( stock1 )
2018-12-18 17:45:33 -08:00
2018-12-18 09:59:31 -08:00
if __name__ == " __main__ " :
main ( )