class Test(unittest.TestCase): ''' All StockPrice tests should be done with stock=TEST1 pricingDate=9/12/69 marketId=TEST1 ''' def setUp(self): self.stockPrice = StockPrice() def testSP_SetTicker(self): equity = Equity() equity.ticker = 'TEST1' self.stockPrice.equity = equity self.stockPrice.pricingDate = Date.Date(month=9,day=12,year=2011) self.failUnlessEqual(self.stockPrice.equity.ticker, 'TEST1', 'StockPrice ticker returned wrong value') def testSP_Save(self): self.stockPrice.equity = Equity.objects.get(ticker='TEST1') self.stockPrice.pricingDate = Date.Date(month=9,day=12,year=2011) self.stockPrice.marketId = 'TEST1' self.stockPrice.mid = 123.45 self.stockPrice.save() def testSP_Load(self): #Assumes just one Test1 record self.stockPrice = StockPrice.objects.get(equity__ticker='TEST1', marketId='TEST1',\ pricingDate=Date.Date(month=9,day=12,year=2011)) #print self.stockPrice.mid self.failUnlessEqual(self.stockPrice.mid, 123.45, 'StockPrice loaded value incorrect') def testSP_Value_SetValue(self): self.stockPrice.mid = 10.123 self.failUnlessEqual(self.stockPrice.mid, 10.123, 'StockPrice value not stored') def testSP_Date_SetDate(self): self.stockPrice.date = Date.Date(month=9,day=12,year=2011) self.failUnlessEqual(self.stockPrice.date, Date.Date(month=9,day=12,year=2011), 'StockPrice date not stored') def testLargeLoad(self): #TODO: Fix test pass
def testSingleStockPriceScenario(self): stockPriceA = StockPrice() equity = Equity() equity.ticker = 'TEST1' stockPriceA.equity = equity stockPriceA.pricingDate = Date.Date(month=9,day=12,year=2011) stockPriceA.mid = 100.0 scenarioBase = MarketDataScenario.MarketDataScenario() scenarioBase.name = 'Base' scenarioBase.marketData = stockPriceA #print "Base:" + str(scenarioBase) scenarioUp = MarketDataScenario.MarketDataScenario() scenarioUp.name = 'Up' stockPriceB = copy.copy(stockPriceA) stockPriceB.mid = stockPriceB.mid * 1.01 scenarioUp.marketData = stockPriceB
def NPV(self, pricingDate=None, marketId=''): if pricingDate == None: raise ErrorHandling.ParameterException('pricingDate cannot be None') if self.marketDataContainer == None: raise ErrorHandling.MarketDataMissing('marketDataContainer is None') e = Equity() e.ticker = self.secId s = StockPrice() s.equity = e s.pricingDate = pricingDate s.marketId = marketId stockPrice = self.marketDataContainer.find(s) if stockPrice == None: msg = 'Cannot find market data %s in marketDataContainer' % s raise ErrorHandling.MarketDataMissing(msg) return float(self.amount) * stockPrice.mid
def loadStockPriceFromCSVFile(self, fileName): ''' Downloads prices from fileName. fileName needs to include full path ''' file = open(fileName,'r') for line in file: #print line items = line.split(',') #skip first line which is headers if items[0] == 'date': continue #print items date = items[0] ticker = items[1] mid = float(items[2]) marketId = items[3] dateItems = date.split('/') month = int(dateItems[0]) day = int(dateItems[1]) year = int(dateItems[2]) equities = Equity.objects.filter(ticker=ticker) if len(equities) <> 1: raise ErrorHandling.OtherException('error with ticker %s and return %s' % (ticker, equities)) stockPrice = StockPrice() stockPrice.pricingDate = Date.Date(day=day,month=month,year=year) stockPrice.mid = mid stockPrice.marketId = marketId stockPrice.equity = equities[0] # print 'Saving %s ' % (stockPrice) stockPrice.save()
def loadHistoricalPricesFromYahoo(self, secId, fr, to, marketId): ''' Downloads prices from yahoo for one secId over a time period ''' quotes = ystockquote.get_historical_prices(secId, fr.str_yyyymmdd(), to.str_yyyymmdd()) #print quotes if "Not Found" in str(quotes[1][0]): raise ErrorHandling.MarketDataMissing('%s with pricing date %s' % (secId, fr)) for quote in quotes: #print quote if quote[0] == 'Date': continue year = int(quote[0][0:4]) month = int(quote[0][5:7]) day = int(quote[0][8:10]) mid = float(quote[4]) equities = Equity.objects.filter(ticker=secId) stockPrice = StockPrice() stockPrice.pricingDate = Date.Date(day,month,year) stockPrice.mid = mid stockPrice.equity = equities[0] stockPrice.marketId = marketId #print 'Saving %s ' % (stockPrice) stockPrice.save()
def loadCurrentPriceFromYahoo(self, secId, today, marketId): ''' Loads current price from yahoo and daves it as of today ''' price = ystockquote.get_price(secId) try: if "Not Found" in price or float(price) < 0.000001: raise ErrorHandling.MarketDataMissing('Current price for %s is %s' % (secId,price)) except: raise ErrorHandling.MarketDataMissing('price: %s is bad value' % price) mid = float(price) stockPrice = StockPrice() stockPrice.pricingDate = today stockPrice.mid = mid stockPrice.equity = Equity.objects.get(ticker=secId) stockPrice.marketId = marketId stockPrice.save()
def setUp(self): self.stockPrice = StockPrice()
def dataForProductionStart(self): #Setup initial data for Tim's portfolios as of 7/24/13 productionStartDate = Date(month=7,day=25,year=2013) if not Batch.objects.filter(batchDate=productionStartDate): batch = Batch() batch.batchDate = productionStartDate batch.save() if not Location.objects.filter(name='Manhasset').exists(): location = Location() location.name = 'Manhasset' location.pricingDate = date(month=7,day=25,year=2013) location.save() if not User.objects.filter(username='******').exists(): #Enter email password User.objects.create_user(username='******',email='*****@*****.**',\ password='******') cmt = User.objects.get(username='******') if not UserProfile.objects.filter(user=cmt).exists(): up2 = UserProfile() up2.user = cmt up2.location = Location.objects.get(name='Manhasset') up2.marketId = 'EOD' up2.save() #if it exists then make sure Location is Manhasset else: profile = UserProfile.objects.get(user=cmt) profile.location = Location.objects.get(name='Manhasset') profile.marketId = 'EOD' profile.save() #Setup portfolios portfolioData = (['401K','cmt'],['ChaseIRA','cmt'], ['TDIRA','cmt'],['TDPostTaxIRA','cmt'], ['Just2Trade','cmt'],['TDEmergency','cmt']) for p in portfolioData: if not Portfolio.objects.filter(name=p[0],user=p[1]): portfolio =Portfolio() portfolio.name = p[0] portfolio.user = p[1] portfolio.save() #Setup Equities and Prices as of productionStartDate dataSet = (('NEIAX',32.57),('PTTDX',10.78),('EFA',61.06), ('GSG',32.67),('SAN-E',26.7301),('VWO',40.19), ('VNQ', 71.17)) for data in dataSet: if not Equity.objects.filter(ticker=data[0]).exists(): equity = Equity() equity.ticker = data[0] equity.assetType = Enum.AssetType('EQUITYUS') equity.save() equity = Equity.objects.get(ticker=data[0]) stockPrice = StockPrice() stockPrice.equity = equity stockPrice.pricingDate = productionStartDate stockPrice.marketId = 'EOD' stockPrice.mid = data[1] stockPrice.save() #Setup Bond identifiers and TCBonds as of productionStartDate dataSet = (('PortAuth_4.00_JAN42','73358WGG3',Date(month=1,day=15,year=2012),Date(month=1,day=15,year=2042),0.04,),) for data in dataSet: if not Identifier.objects.filter(name=data[1],type=BondIdentifierType('CUSIP')): identifier = Identifier() identifier.name = data[1] identifier.type = BondIdentifierType('CUSIP') identifier.save() for data in dataSet: if not TCBond.objects.filter(name=data[0]): tcBond = TCBond() tcBond.name = data[0] tcBond.identifiers = Identifier.objects.get(name=data[1],type=BondIdentifierType('CUSIP')) tcBond.startDate = data[2].toPythonDate() tcBond.endDate = data[3].toPythonDate() tcBond.coupon = data[4] tcBond.assetType = Enum.AssetType('NYMUNIBOND') tcBond.save() #Setup OAS for production start date if not BondOAS.objects.filter(tCBond=TCBond.objects.get(name='PortAuth_4.00_JAN42'), marketId='EOD',pricingDate=productionStartDate): bondOAS = BondOAS(tCBond=TCBond.objects.get(name='PortAuth_4.00_JAN42'), marketId='EOD',pricingDate=productionStartDate,mid=0.014) bondOAS.save() #Setup Rates fredLoader = FREDLoader.FREDLoader() fredLoader.loadLiborCurvesForSpecificDates(marketId='EOD', datesToLoadFor=[productionStartDate]) #Setup transactions dataSet = (('401K','INIT','EQUITY','NEIAX',8758.407), ('401K','INIT','EQUITY','PTTDX',10746.441), ('ChaseIRA','INIT','EQUITY','EFA',633.37038), ('TDIRA','INIT','EQUITY','EFA',47), ('TDIRA','INIT','EQUITY','GSG',610), ('TDIRA','INIT','EQUITY','VWO',1050), ('TDIRA','INIT','CASH','Cash',11151.23), ('TDPostTaxIRA','INIT','EQUITY','EFA',560), ('TDPostTaxIRA','INIT','EQUITY','VNQ',170), ('TDPostTaxIRA','INIT','CASH','Cash',951.33), ('Just2Trade','INIT','EQUITY','GSG',300), ('Just2Trade','INIT','EQUITY','VWO',430), ('TDEmergency','INIT','BOND','PortAuth_4.00_JAN42',100), ('TDEmergency','INIT','CASH','Cash',201.01)) for data in dataSet: if not Transaction.objects.filter(portfolio=Portfolio.objects.get(name=data[0]), transactionType=TransactionType(data[1]), positionType=PositionType(data[2]), ticker=data[3], amount=data[4], transactionDate = productionStartDate, effectiveDate = productionStartDate): transaction = Transaction() transaction.portfolio =Portfolio.objects.get(name=data[0]) transaction.transactionType = TransactionType(data[1]) transaction.positionType = PositionType(data[2]) transaction.ticker = data[3] transaction.amount = data[4] transaction.transactionDate = productionStartDate transaction.effectiveDate = productionStartDate transaction.reflectedInPosition = False transaction.save()
def dataForSuccessfulTest(self): ''' This saves all data so that system tests run successfully Pricing date is 9/12/2011 with market data id TEST1 ''' testDatePython = date(month=9,day=12,year=2011) testDate = Date(month=9,day=12,year=2011) testFirstDate = Date(month=8,day=30,year=2011) if not Location.objects.filter(name='Test1').exists(): location = Location() location.name = 'Test1' location.pricingDate = date(month=9,day=12,year=2011) location.save() location = Location.objects.get(name='Test1') if not User.objects.filter(username='******').exists(): user = User.objects.create_user(username='******',email='*****@*****.**',\ password='******') user.is_staff = True user.is_superuser = True user.save() if not User.objects.filter(username='******').exists(): User.objects.create_user(username='******',email='*****@*****.**',\ password='******') if not User.objects.filter(username='******').exists(): User.objects.create_user(username='******',email='*****@*****.**',\ password='******') if not User.objects.filter(username='******').exists(): User.objects.create_user(username='******',email='*****@*****.**',\ password='******') user1 = User.objects.get(username='******') if not UserProfile.objects.filter(user=user1).exists(): up1 = UserProfile() up1.user = user1 up1.location = location up1.marketId = 'EOD' up1.save() user2 = User.objects.get(username='******') if not UserProfile.objects.filter(user=user2).exists(): up2 = UserProfile() up2.user = user2 up2.location = location up2.marketId = 'EOD' up2.save() user3 = User.objects.get(username='******') if not UserProfile.objects.filter(user=user3).exists(): up3 = UserProfile() up3.user = user3 up3.location = location up3.marketId = 'TEST1' up3.save() user4 = User.objects.get(username='******') if not UserProfile.objects.filter(user=user4).exists(): up4 = UserProfile() up4.user = user4 up4.location = location up4.marketId = 'DEMO' up4.save() if not TCBond.objects.filter(name='TEST1').exists(): bond = TCBond() bond.name = 'TEST1' bond.ccy = 'USD' cusip = Enum.BondIdentifierType('CUSIP') if not Identifier.objects.filter(name='123456789', type=cusip): identifier = Identifier() identifier.name='123456789' identifier.type=cusip identifier.save() identifier = Identifier.objects.get(name='123456789', type=cusip) bond.identifiers = identifier bond.startDate = Date(month=9,day=12,year=2010).toPythonDate() bond.endDate = Date(month=9,day=12,year=2020).toPythonDate() bond.coupon = 0.01 bond.basis = '30360' bond.paymentFrequency = Enum.Frequency('S') bond.paymentRollRule = Enum.Roll('MF') bond.paymentCalendar = Calendar.createCalendar('US') bond.assetType = Enum.AssetType('NYMUNIBOND') bond.save() if not Equity.objects.filter(ticker='TEST1').exists(): equity = Equity() equity.ticker = 'TEST1' equity.assetType = Enum.AssetType('EQUITYUS') equity.save() equity = Equity.objects.get(ticker='TEST1') stockPrice = StockPrice() stockPrice.equity = equity stockPrice.pricingDate = testDate stockPrice.marketId = 'TEST1' stockPrice.mid = 123.45 stockPrice.save() equity = Equity.objects.get(ticker='TEST1') stockPrice = StockPrice() stockPrice.equity = equity stockPrice.pricingDate = testFirstDate stockPrice.marketId = 'TEST1' stockPrice.mid = 123.44 stockPrice.save() if not Equity.objects.filter(ticker='TEST2').exists(): equity = Equity() equity.ticker = 'TEST2' equity.assetType = Enum.AssetType('EQUITYUS') equity.save() equity = Equity.objects.get(ticker='TEST2') stockPrice = StockPrice() stockPrice.equity = equity stockPrice.pricingDate = testDate stockPrice.marketId = 'TEST1' stockPrice.mid = 543.21 stockPrice.save() equity = Equity.objects.get(ticker='TEST2') stockPrice = StockPrice() stockPrice.equity = equity stockPrice.pricingDate = testFirstDate stockPrice.marketId = 'TEST1' stockPrice.mid = 543.11 stockPrice.save() if not Portfolio.objects.filter(name='TEST1', user='******').exists(): portfolio =Portfolio() portfolio.name = 'TEST1' portfolio.user = '******' portfolio.save() portfolio =Portfolio.objects.get(name='TEST1', user='******') if not ModelPosition.objects.filter(asOf=testDate, portfolio=portfolio, positionType = Enum.PositionType('EQUITY'), ticker = 'TEST1', amount = 100.0).exists(): position = ModelPosition() position.asOf=testDate position.portfolio = portfolio position.positionType = Enum.PositionType('EQUITY') position.ticker = 'TEST1' position.amount = 100.0 position.save() if not ModelPosition.objects.filter(asOf=testDate, portfolio=portfolio, positionType = Enum.PositionType('EQUITY'), ticker = 'TEST2', amount = 100.0).exists(): position = ModelPosition() position.asOf=testDate position.portfolio = portfolio position.positionType = Enum.PositionType('EQUITY') position.ticker = 'TEST2' position.amount = 100.0 position.save() if not ModelPosition.objects.filter(asOf=testDate, portfolio=portfolio, positionType = Enum.PositionType('BOND'), ticker = 'TEST1', amount = 100.0).exists(): position = ModelPosition() position.asOf=testDate position.portfolio = portfolio position.positionType = Enum.PositionType('BOND') position.ticker = 'TEST1' position.amount = 100.0 position.save() if not ModelPosition.objects.filter(asOf=testFirstDate, portfolio=portfolio, positionType = Enum.PositionType('EQUITY'), ticker = 'TEST1', amount = 100.0).exists(): position = ModelPosition() position.asOf=testFirstDate position.portfolio = portfolio position.positionType = Enum.PositionType('EQUITY') position.ticker = 'TEST1' position.amount = 100.0 position.save() if not ModelPosition.objects.filter(asOf=testFirstDate, portfolio=portfolio, positionType = Enum.PositionType('EQUITY'), ticker = 'TEST2', amount = 100.0).exists(): position = ModelPosition() position.asOf=testFirstDate position.portfolio = portfolio position.positionType = Enum.PositionType('EQUITY') position.ticker = 'TEST2' position.amount = 100.0 position.save() if not ModelPosition.objects.filter(asOf=testFirstDate, portfolio=portfolio, positionType = Enum.PositionType('BOND'), ticker = 'TEST1', amount = 100.0).exists(): position = ModelPosition() position.asOf=testFirstDate position.portfolio = portfolio position.positionType = Enum.PositionType('BOND') position.ticker = 'TEST1' position.amount = 100.0 position.save() if not ModelPosition.objects.filter(asOf=testFirstDate, portfolio=portfolio, positionType = Enum.PositionType('CASH'), ticker = 'Cash', amount = 1000.0).exists(): position = ModelPosition() position.asOf=testFirstDate position.portfolio = portfolio position.positionType = Enum.PositionType('CASH') position.ticker = 'Cash' position.amount = 1000.0 position.save() curve = InterestRateCurve() curve.ccy = 'USD' curve.index = Enum.Index('LIBOR') curve.term = Enum.TimePeriod('M') curve.numTerms = 3 curve.pricingDate =testDate curve.marketId = 'TEST1' curve.addRate(InterestRate(type='Deposit', term=Enum.TimePeriod('M'), numTerms=1,mid=0.01,curve=curve)) curve.addRate(InterestRate(type='Deposit', term=Enum.TimePeriod('M'), numTerms=3,mid=0.01,curve=curve)) curve.addRate(InterestRate(type='Swap', term=Enum.TimePeriod('Y'), numTerms=1,mid=0.01,curve=curve)) curve.addRate(InterestRate(type='Swap', term=Enum.TimePeriod('Y'), numTerms=5,mid=0.01,curve=curve)) curve.addRate(InterestRate(type='Swap', term=Enum.TimePeriod('Y'), numTerms=10,mid=0.01,curve=curve)) curve.addRate(InterestRate(type='Swap', term=Enum.TimePeriod('Y'), numTerms=30,mid=0.01,curve=curve)) curve.save() curve = InterestRateCurve() curve.ccy = 'USD' curve.index = Enum.Index('LIBOR') curve.term = Enum.TimePeriod('M') curve.numTerms = 3 curve.pricingDate = testFirstDate curve.marketId = 'TEST1' curve.addRate(InterestRate(type='Deposit', term=Enum.TimePeriod('M'), numTerms=1,mid=0.01,curve=curve)) curve.addRate(InterestRate(type='Deposit', term=Enum.TimePeriod('M'), numTerms=3,mid=0.01,curve=curve)) curve.addRate(InterestRate(type='Swap', term=Enum.TimePeriod('Y'), numTerms=1,mid=0.01,curve=curve)) curve.addRate(InterestRate(type='Swap', term=Enum.TimePeriod('Y'), numTerms=5,mid=0.01,curve=curve)) curve.addRate(InterestRate(type='Swap', term=Enum.TimePeriod('Y'), numTerms=10,mid=0.01,curve=curve)) curve.addRate(InterestRate(type='Swap', term=Enum.TimePeriod('Y'), numTerms=30,mid=0.01,curve=curve)) curve.save() if not SwaptionVolatilitySurface.objects.filter(ccy=Enum.Currency('USD'), index=Enum.Index('LIBOR'), term=Enum.TimePeriod('M'), numTerms=3, pricingDate=testDate, marketId='TEST1'): #Special case where I just append the vols. Should use a function vols = SwaptionVolatilitySurface(ccy=Enum.Currency('USD'), index=Enum.Index('LIBOR'), term=Enum.TimePeriod('M'), numTerms=3, pricingDate=testDate, marketId='TEST1') volPoints = [] volPoints.append(SwaptionVolatility(expiryTerm=Enum.TimePeriod('Y'), expiryNumTerms=1, underlyingTerm=Enum.TimePeriod('Y'), underlyingNumTerms=3, mid=0.40, surface=vols)) volPoints.append(SwaptionVolatility(expiryTerm=Enum.TimePeriod('Y'), expiryNumTerms=3, underlyingTerm=Enum.TimePeriod('Y'), underlyingNumTerms=3, mid=0.45, surface=vols)) volPoints.append(SwaptionVolatility(expiryTerm=Enum.TimePeriod('Y'), expiryNumTerms=1, underlyingTerm=Enum.TimePeriod('Y'), underlyingNumTerms=5, mid=0.5, surface=vols)) volPoints.append(SwaptionVolatility(expiryTerm=Enum.TimePeriod('Y'), expiryNumTerms=3, underlyingTerm=Enum.TimePeriod('Y'), underlyingNumTerms=5, mid=0.55, surface=vols)) vols.addVolatilities(volPoints) vols.save() if not BondOAS.objects.filter(tCBond=TCBond.objects.get(name='TEST1'),pricingDate=testDate, marketId='TEST1'): bondOAS = BondOAS(tCBond=TCBond.objects.get(name='TEST1'),pricingDate=testDate, marketId='TEST1',mid=0.0012) bondOAS.save() #done for only one test BondPositionTest.testLoadAndSaveMarketData if not BondOAS.objects.filter(tCBond=TCBond.objects.get(name='TEST1'),pricingDate=Date(month=1,day=1,year=2009), marketId='EOD'): bondOAS = BondOAS(tCBond=TCBond.objects.get(name='TEST1'),pricingDate=Date(month=1,day=1,year=2009), marketId='EOD',mid=0.01) bondOAS.save() #now load zero oas for all dates we do testing timePeriods = VARUtilities.VARTimePeriodsAndSteps() timePeriods.generate(start = Date(month=8,day=30,year=2011), end = Date(month=9,day=12,year=2011), num = 1, term = Enum.TimePeriod('D'), calendar = Calendar.US()) for timeStep in timePeriods.timeSteps: if not BondOAS.objects.filter(tCBond=TCBond.objects.get(name='TEST1'), pricingDate=timeStep, marketId='TEST1'): bondOAS = BondOAS(tCBond=TCBond.objects.get(name='TEST1'), pricingDate=timeStep, marketId='TEST1',mid=0.0) bondOAS.save() fileLoader = MarketDataLoader.EquityPriceLoader() fileLoader.loadStockPriceFromCSVFile(ROOT_PATH+'/misc/data/StockPricesForHVaRTests.csv') fileLoader.loadInterestRateFromCSVFile(ROOT_PATH+'/misc/data/InterestRatesForHVaRTests.csv') if not HvarConfiguration.objects.filter(name='TEST1').exists(): config = HvarConfiguration() config.name = 'TEST1' config.startDate = Date(month=8,day=30,year=2011).toPythonDate() config.endDate = Date(month=9,day=12,year=2011).toPythonDate() config.stepSize = 1 config.stepUnit = Enum.TimePeriod('D') config.calendar = Calendar.US() config.confLevel = 0.95 config.marketId = 'TEST1' config.save()