Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Zeitreihe für Portfolio-Buchwerte

Begonnen von FFM779, Mai 13, 2011, 15:38:18

⏪ vorheriges - nächstes ⏩

FFM779

Hallo zusammen,

ich habe eine kleine Beispiel-Datenbank angehängt, mittels derer das Verständnis meines Problems etwas leichter sein mag.

Ich habe eine Datenbank mit einer Tabelle namens tblTrades, innerhalb derer ich Wertpapier-Transaktionen (Aktien-Käufe und –Verkäufe) erfasse. Diese Tabelle enthält alle Daten, die ich für die Lösung meines Problems benötige.


tblTrades
TradeID – dtDate – sTicker – iQuantity – dPrice
1 – 01/03/2011 – A – 10 – 50.00
2 – 01/03/2011 – B – 10 – 25.00
...


Anmerkung:
iQuantity > 0 - Kauf eines Wertpapiers, iQuantity < 0 - Verkauf eines Wertpapiers

Eine Kombination aus den folgenden zwei Abfragen erlaubt mir die Ermittlung des Buchwerts (also der Betrag, für den die Wertpapiere erworben wurden) meines Aktien-Portfolios zu einem bestimmten Datum in der Vergangenheit (z.B. zum 04.01.2011). Das Ergebnis ist eine einzelne Zahl – die Summe der Buchwerte (Anzahl x jew. Kaufkurs) der einzelnen Aktien, die sich zu dem Datum im Portfolio befunden haben.


qryPortfolioBV
SELECT Sum(T.iQuantity*T.dPrice) AS dBV
FROM qryPortfolioHoldingsDate AS Q LEFT JOIN tblTrades AS T ON Q.sTicker=T.sTicker
WHERE T.dtDate<=#1/4/2011#;

qryPortfolioHoldingsDate
SELECT T.sTicker, sum(T.iQuantity) AS iPosition
FROM tblTrades AS T
WHERE dtDate<=#1/4/2011#
GROUP BY T.sTicker
HAVING sum(T.iQuantity)>0;


Anmerkung:
Sum(T.iQuantity) > 0 - der Trade wurde noch nicht geschlossen, sprich die Aktie ist noch im Portfolio
Sum(T.iQuantity) = 0 - der Trade wurde bereits geschlossen, die Aktie ist nicht mehr im Portfolio

Was ich suche, ist eine Abfrage, welche mir eine Zeitreihe für die Portfolio-Buchwerte liefert – also einen Portfolio-Buchwert für jedes Datum, an dem in der Tabelle tblTrades Wertpapier-Transaktionen erfasst wurden.

In der Vergangenheit hatte ich bereits einmal in einem anderen Forum um Hilfe bei der Erstellung einer Abfrage für ein ähnliches Problem gebeten. Damals ging es darum, eine Zeitreihe des Portfolios bewertet zu aktuellen Kursen (die in einer anderen Tabelle enthalten waren) zu erstellen. Dies wurde mit Hilfe der folgenden zwei Abfragen erreicht (http://www.access-programmers.co.uk/forums/showthread.php?t=134869):


qryPortfolioValue
SELECT qryPortfolioHoldingsWithQuotes.qDate, Sum(qryPortfolioHoldingsWithQuotes.TotalValue) AS SumOfTotalValue
FROM qryPortfolioHoldingsWithQuotes
GROUP BY qryPortfolioHoldingsWithQuotes.qDate;

qryPortfolioHoldingsWithQuotes
SELECT Q.qDate, T.Ticker, Sum(T.Qty) AS TotQty, Q.qCl AS [Last Price], (T.Qty*Q.qCl) AS TotalValue
FROM tblTrades AS T INNER JOIN tblQuotes AS Q ON T.Ticker = Q.qTicker
WHERE (((T.Date)<=[q]![qDate]) AND ((Q.qDate)=[q]![qDate]))
GROUP BY Q.qDate, T.Ticker, Q.qCl, (T.Qty*Q.qCl)
ORDER BY Q.qDate, T.Ticker;


Irgendwie muss das Prinzip doch übertragbar sein – ich komme nur einfach nicht darauf... Ich bin für jede Hilfe dankbar!

Viele Grüße
FFM779

P.S. Ich hatte diese Frage bereits Mitte der Woche in einem anderen, Englisch-sprachigen Forum gestellt, dort jedoch keine wirklich hilfreichen Hinweise erhalten (http://www.access-programmers.co.uk/forums/showthread.php?t=209710).


[Anhang gelöscht durch Administrator]

DF6GL

Hallo,

spontan gesagt, versuch   diese Where-Condition:

.... WHERE dtDate in  ( select dtDate from tblTrades where nz(IQuantity,0) >0 )

FFM779

Hi DF6DL,

vielen Dank für Deine Antwort! Mittels Deiner Hilfe komme ich einen Schritt weiter, zur Lösung fehlt allerdings noch eine weitere zündende Idee...

Die Abfrage qryPortfolioBV habe ich wie folgt abgeändert:


qryTimeSeriesPortfolioBV
SELECT T.dtDate, Sum(T.iQuantity*T.dPrice) AS dBV
FROM qryPortfolioHoldingsDate AS Q LEFT JOIN tblTrades AS T ON Q.sTicker=T.sTicker
WHERE T.dtDate IN (SELECT T.dtDate FROM tblTrades WHERE Nz(T.iQuantity,0) >0)
GROUP BY T.dtDate;


Damit bekomme ich tatsächlich eine Zeitreihe. Allerdings vermag ich es nicht die Abfrage qryPortfolioHoldingsDate korrekt anzupassen. Diese Abfrage ermittelt die Zusammensetzung des Portfolios zu einem bestimmten Datum, indem es die gehandelten Stückzahlen bis zu dem Zeitpunkt aufaddiert und geschlossene Trades (wo sich die gehandelten Stück zu Null aufaddieren) aussortiert.


qryPortfolioHoldingsDate
SELECT T.sTicker, sum(T.iQuantity) AS iPosition
FROM tblTrades AS T
WHERE dtDate<=#1/04/2011#
GROUP BY T.sTicker
HAVING sum(T.iQuantity)>0;


Letztlich soll diese Abfrage für jedes Datum, an dem eine Transaktion in tblTrades erfasst wurde, die zu diesem Zeitpunkt in dem Portfolio enthaltenen Wertpapiere ermitteln, sprich (auf der Grundlage meiner Beispieldaten in der angehängten Datenbank) folgendes Ergebnis ausspucken:


dtDate – sTicker – iQuantity
03.01.2011 – A – 10
03.01.2011 – B – 10
03.01.2011 – C – 15
05.01.2011 – A – 20
05.01.2011 – B – 10
05.01.2011 – C – 15
06.01.2011 – A – 20
06.01.2011 – B – 20
06.01.2011 – C – 15
10.01.2011 – A – 20
10.01.2011 – B – 20
10.01.2011 – D – 50
13.01.2011 – A – 20
13.01.2011 – B – 20
13.01.2011 – D – 75
usw.


Ich bin also nachwievor für Gedankenanstöße dankbar...

Beste Grüße
FFM779

FFM779

Hallo zusammen,

nach langem Knobeln bin ich nunmehr selber auf die Lösung gekommen. Die Kombination der folgenden zwei Abfragen bringt das gewünschte Resultat:


qryTS1b
SELECT Q.qDate, Sum(Q.dBV) AS dBookValue
FROM qryTS2b AS Q
GROUP BY Q.qDate;

qryTS2b
SELECT Q.qDate, T.sTicker, SUM(T.iQuantity) AS Qty, Sum(T.iQuantity*T.dPrice) AS dBV
FROM tblTrades AS T INNER JOIN tblQuotes AS Q ON T.sTicker=Q.qTicker
WHERE ((T.dtDate<=[q]![qDate]) AND (Q.qDate=[q]![qDate]))
GROUP BY Q.qDate, T.sTicker
HAVING sum(iQuantity)<>0
ORDER BY T.sTicker;


VG
FFM779