mirror of
https://github.com/andrewkdinh/fund-indicators.git
synced 2024-11-21 15:14:20 -08:00
142 lines
5.5 KiB
Python
142 lines
5.5 KiB
Python
# ExpenseRatio.py
|
|
# Andrew Dinh
|
|
# Python 3.6.7
|
|
# Description:
|
|
'''
|
|
Calculates return for each stock from the lists from ExpenseRatio.py
|
|
listOfReturn = [Unadjsted Return, Sharpe Ratio, Sortino Ratio, Treynor Ratio, Jensen's Alpha]
|
|
'''
|
|
|
|
from StockData import StockData
|
|
import datetime
|
|
from Functions import Functions
|
|
|
|
class Return:
|
|
def __init__(self, newListOfReturn = [], newTimeFrame = [], newBeta = 0, newStandardDeviation = 0, newNegativeStandardDeviation = 0, newMarketReturn = 0, newSize = 0, newSizeOfNeg = 0, newFirstLastDates = [], newAllLists = [], newAbsFirstLastDates = ''):
|
|
self.listOfReturn = newListOfReturn
|
|
self.timeFrame = newTimeFrame # [year, months (30 days)]
|
|
self.beta = newBeta
|
|
self.standardDeviation = newStandardDeviation
|
|
self.negativeStandardDeviation = newNegativeStandardDeviation
|
|
self.marketReturn = newMarketReturn
|
|
self.size = newSize
|
|
self.sizeOfNeg = newSizeOfNeg
|
|
self.firstLastDates = newFirstLastDates
|
|
|
|
def getFirstLastDates(self, stock):
|
|
firstLastDates = []
|
|
timeFrame = self.timeFrame
|
|
firstDate = datetime.datetime.now() - datetime.timedelta(days=timeFrame[0]*365)
|
|
firstDate = firstDate - datetime.timedelta(days=timeFrame[1]*30)
|
|
firstDate = ''.join((str(firstDate.year),'-', str(firstDate.month), '-', str(firstDate.day)))
|
|
|
|
lastDate = StockData.returnAbsFirstLastDates(stock)[1]
|
|
#print(lastDate)
|
|
firstLastDates.append(firstDate)
|
|
firstLastDates.append(lastDate)
|
|
return firstLastDates
|
|
|
|
def getFirstLastDates2(self, stock):
|
|
finalDatesAndClose = StockData.returnFinalDatesAndClose(stock)
|
|
finalDatesAndClose2 = StockData.returnFinalDatesAndClose2(stock)
|
|
firstDate = self.firstLastDates[0]
|
|
lastDate = self.firstLastDates[1]
|
|
finalDates = finalDatesAndClose[0]
|
|
|
|
firstDateExists = False
|
|
lastDateExists = False
|
|
for i in range(0, len(finalDates), 1):
|
|
if finalDates[i] == str(firstDate):
|
|
firstDateExists = True
|
|
elif finalDates[i] == lastDate:
|
|
lastDateExists = True
|
|
i = len(finalDates)
|
|
|
|
if firstDateExists == False:
|
|
print("Could not find first date. Changing first date to closest date")
|
|
tempDate = Functions.stringToDate(firstDate) # Change to datetime
|
|
print('Original first date:', tempDate)
|
|
#tempDate = datetime.date(2014,1,17)
|
|
newFirstDate = Functions.getNearest(finalDatesAndClose2[0], tempDate)
|
|
print('New first date:', newFirstDate)
|
|
firstDate = str(newFirstDate)
|
|
|
|
if lastDateExists == False:
|
|
print("Could not find final date. Changing final date to closest date")
|
|
tempDate2 = Functions.stringToDate(lastDate) # Change to datetime
|
|
print('Original final date:', tempDate2)
|
|
#tempDate2 = datetime.date(2014,1,17)
|
|
newLastDate = Functions.getNearest(finalDatesAndClose2[0], tempDate2)
|
|
print('New final date:', newLastDate)
|
|
lastDate = str(newLastDate)
|
|
|
|
firstLastDates = []
|
|
firstLastDates.append(firstDate)
|
|
firstLastDates.append(lastDate)
|
|
return firstLastDates
|
|
|
|
def getUnadjustedReturn(self, stock):
|
|
finalDatesAndClose = StockData.returnFinalDatesAndClose(stock)
|
|
finalDatesAndClose2 = StockData.returnFinalDatesAndClose2(stock)
|
|
firstDate = self.firstLastDates[0]
|
|
lastDate = self.firstLastDates[1]
|
|
finalDates = finalDatesAndClose[0]
|
|
finalClose = finalDatesAndClose[1]
|
|
|
|
for i in range(0, len(finalDates), 1):
|
|
if finalDates[i] == str(firstDate):
|
|
firstClose = finalClose[i]
|
|
elif finalDates[i] == lastDate:
|
|
lastClose = finalClose[i]
|
|
i = len(finalDates)
|
|
|
|
print('Close values:', firstClose, '...', lastClose)
|
|
unadjustedReturn = float(lastClose/firstClose)
|
|
unadjustedReturn = unadjustedReturn * 100
|
|
return unadjustedReturn
|
|
|
|
# def getBeta(self, timeFrame):
|
|
|
|
# def getStandardDeviation(self, timeFrame):
|
|
|
|
def main(self, stock):
|
|
# Find date to start from and last date
|
|
self.timeFrame = []
|
|
self.listOfReturn = []
|
|
|
|
print("\nPlease enter a time frame in years: ", end='')
|
|
#timeFrameYear = int(input())
|
|
timeFrameYear = 5
|
|
print(timeFrameYear)
|
|
self.timeFrame.append(timeFrameYear)
|
|
print("Please enter a time frame in months (30 days): ", end='')
|
|
#timeFrameMonth = int(input())
|
|
timeFrameMonth = 0
|
|
print(timeFrameMonth)
|
|
self.timeFrame.append(timeFrameMonth)
|
|
#print(self.timeFrame)
|
|
self.firstLastDates = Return.getFirstLastDates(self, stock)
|
|
print('Dates: ', self.firstLastDates)
|
|
|
|
print('\nMaking sure dates are within list...')
|
|
self.firstLastDates = Return.getFirstLastDates2(self, stock)
|
|
print('New dates: ', self.firstLastDates)
|
|
|
|
print('\nGetting unadjusted return')
|
|
unadjustedReturn = Return.getUnadjustedReturn(self, stock)
|
|
self.listOfReturn.append(unadjustedReturn)
|
|
print(self.listOfReturn[0])
|
|
print(self.listOfReturn[0]/timeFrameYear, '%')
|
|
|
|
def main():
|
|
stockName = 'spy'
|
|
stock1 = StockData(stockName)
|
|
print("Finding available dates and close values for", stock1.name)
|
|
StockData.main(stock1)
|
|
|
|
stock1Return = Return()
|
|
Return.main(stock1Return, stock1)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|