Announcement

Collapse
No announcement yet.

Rendite einer Aktie berechnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Rendite einer Aktie berechnen

    Hallo zusammen,

    ich schreibe meiner Master Thesis und mache eine Studie über den Kapitalmarkt. Da muss ich jetzt erst mal die Aktienrenditen berechnen.

    Folgende Tabelle habe ich:

    tbl_values:
    • fld_id
    • fld_aktienkurs
    • fld_marktwert
    • fld_rendite
    • fld_datum
    • tbl_aktien_fld_id
    • fld_anzahl (aktienzahl)

    das Datum hat das Format 2010-09-30 (immer nur Monatsenden) und zu jeder Aktie (insgesmat 1070) habe ich in dieser Tabelle die entsprechenden Werte (im März 1996 diesen Aktienkurs und diesen Marktwert).

    Jetzt möchte ich die Rendite einer Aktie im März berechnen und in das fld_rendite schreiben.

    ich habe es versucht mit:
    UPDATE tbl_values AS v SET fld_rendite = (fld_aktienkurs - (SELECT fld_aktienkurs FROM tbl_values WHERE fld_datum>= DATE_SUB(fld_datum, INTERVAL 40 DAY)) / (SELECT fld_aktienkurs FROM tbl_values WHERE fld_datum>= DATE_SUB(fld_datum, INTERVAL 40 DAY))

    Also eigentlich rechne ich fld_rendite = (Aktienkurs(Januar 1999) - Aktienkurs(Dezember 1998)) / Aktienkurs(Dezember 1998)

    Leider gibt er da einen Fehler aus, ich darf in einem UPDATE nicht auf die gleiche Tabelle einen SELECT machen.

    Kann mir jemand bei meinem Problem helfen? Wie kriege ich meine monatlichen Renditen in meine Tabelle?

    Vielen Dank im Voraus.

  • #2
    Hallo,

    Hinweis: Formatierung von SQL in Beiträgen

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      tut mir leid.

      [highlight=sql]UPDATE tbl_values AS v SET fld_rendite = (fld_aktienkurs - (SELECT fld_aktienkurs FROM tbl_values WHERE fld_datum>= DATE_SUB(fld_datum, INTERVAL 40 DAY)) / (SELECT fld_aktienkurs FROM tbl_values WHERE fld_datum>= DATE_SUB(fld_datum, INTERVAL 40 DAY))[/highlight]

      So sieht also mein SQL-Statement aus, aber es scheint nicht zu funktionieren.

      Vielen Dank für Hilfe!

      Moadin

      Comment


      • #4
        Ich will ja nicht unverschämt sein, aber ein paar Zeilenumbrüche und Einrückungen wären für die Lesbarkeit auch nicht schlecht ...
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Wo Du recht hast, hast Du recht, smile. Ich hoffe das ist jetzt besser so.

          [highlight=sql] UPDATE tbl_values AS v
          SET fld_rendite = (fld_aktienkurs - (
          SELECT fld_aktienkurs
          FROM tbl_values
          WHERE fld_datum>= DATE_SUB(fld_datum, INTERVAL 40 DAY)
          ) / (
          SELECT fld_aktienkurs
          FROM tbl_values
          WHERE fld_datum>= DATE_SUB(fld_datum, INTERVAL 40 DAY)
          )
          [/highlight]

          Comment


          • #6
            Warum hast Du ein Feld in der Tabelle, das aus anderen Feldern der Tabelle berechnet wird? Sowas ist redundant und sollte eigentlich vermieden werden. Im Grund genommen macht man so etwas nur in Performance Szenarien.
            Im Prinzip könntest Du Dir ein SQL Statement schreiben was genau dasselbe macht bzw. eine Stored Procedure. Alternativ könnte mans auch im Client verwirklichen (wo es meiner Meinung nach hin gehört), da es sich hierbei um Business Logik handelt. Und auch diese sollte nur aus Performance Gründen in die DB verschoben werden (wenn überhaupt).

            Comment


            • #7
              Originally posted by Moadin View Post
              Ich hoffe das ist jetzt besser so.
              Aahh ... viel besser ... jetzt kann man auch was erkennen

              Zum Problem: fanderlf hat vollkommen recht. Werte die sich lediglich und ausschließlich aus anderen Inhalten berechnen oder anderweitig zusammensetzen gehören nicht als explizite Felder in die DB. Einzige Ausnahme wären die auch schon angesprochenen Performance-Szenarien aber das dürfte bei deiner Handvoll Werte kein Thema sein.

              Für den Fall das du dies doch tun willst, bleibt dir bei MySQL nur der Umweg über eine temporäre Tabelle. Also ein entsprechendes Select in eine Tabelle schreiben und anschließend das Update aus dieser temporären Tabelle füttern.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Ich habe insgesamt 1070 Aktien, und von jeder Aktie habe ich zwischen 1 und 177 Werten (insgesmat ca 53'000).
                Jeder Wert ist einem Datum zugeordnet und in dieser Tabelle muss ich dann natürlich die Aktienbezeichung irgendwo hinmachen.

                Ich habe folgende Tabellen:

                tbl_unternehmen:
                fld_id
                fld_kurzname
                fld_relevanz

                tbl_aktien:
                fld_id
                fld_valorennummer
                fld_name
                tbl_unternehmen_fld_id

                und eben meine
                tbl_values:
                fld_id
                fld_aktienkurs
                fld_marktwert
                fld_anzahl
                fld_rendite
                fld_datum
                tbl_aktien_fld_id

                Ich muss von jeder Aktie (die zu einer Valorennummer gehört) die Rendite bestimmen, anschliessend die Gesamtrendite über ein Unternehmen (die besitzen meistens mehrere Arten von Aktien (Inhaber, Namen, ...)) und zum Schluss noch die Summe ... aber das wäre jetzt zu viel auf einmal.

                Mein Problem "beschränkt" sich auf die Rendite, der Bezug auf das Datum vorher unter berücksichtigung der tbl_aktien_fld_id.

                Ich hoffe, ich habe mich verständlich ausgedrückt, ist gar nicht so einfach, das niederzuschreiben, merke ich grade.

                Comment


                • #9
                  Ich habe es jetzt über eine Hiflstabelle gelöst. Man kann bei einem UPDATE Befehl keine Aliase verwenden, schade.

                  [highlight=sql]
                  INSERT INTO tbl_temp_rendite (tbl_values_fld_id, fld_rendite)
                  SELECT a.fld_id, (a.fld_aktienkurs -
                  (
                  SELECT b.fld_aktienkurs
                  FROM tbl_values AS b
                  WHERE b.tbl_aktien_fld_id = a.tbl_aktien_fld_id
                  AND b.fld_datum >= SUBDATE(a.fld_datum, INTERVAL 31 DAY)
                  AND b.fld_datum < a.fld_datum
                  ))/(
                  SELECT b.fld_aktienkurs
                  FROM tbl_values AS b
                  WHERE b.tbl_aktien_fld_id = a.tbl_aktien_fld_id
                  AND b.fld_datum >= SUBDATE(a.fld_datum, INTERVAL 31 DAY)
                  AND b.fld_datum < a.fld_datum
                  )
                  FROM tbl_values as a [/highlight]

                  jetzt habe ich zwar erst ein Teilproblem gelöst, aber das wird schon werden.

                  liebe Grüsse

                  Moadin

                  Comment


                  • #10
                    Aber es ist doch nur eine Abfrage oO Warum eine extra Tabelle? Reicht nicht auch ein View oder sonstwas? Wenns schon unbedingt in der DB sein muss.

                    Comment


                    • #11
                      Originally posted by fanderlf View Post
                      Aber es ist doch nur eine Abfrage oO Warum eine extra Tabelle? Reicht nicht auch ein View oder sonstwas? Wenns schon unbedingt in der DB sein muss.
                      Ich brauche nachher diese Renditen um ein sogenanntes Beta zu berechnen, welches ich dann benötige um eine Size Premium zu bestimmen. Wenn ich also die Renditen nicht irgendwo speichere, habe ich nachher ein Problem mit meinen SQL-Statements, könnte ich mir vorstellen.

                      Ich hab jetzt schon ein Problem mit der Anzahl Aktien, weil die ja auch unterschiedlich sein können (Aktiensplitting) und so die Rendite dann plötzlich horrend hoch oder tief sein wird. Also muss ich das auch noch berücksichtigen, wenn ich die durchschnittliche Rendite einer Aktie über 16 Jahre berechnen will.

                      Hättest Du eine schnellere und einfachere Lösung? Ich wäre Dir sehr dankbar. Sitze schon recht lange an diesem Problem.

                      Comment


                      • #12
                        Naja das geht ja dann schon Richtung Versionisierung der Daten im Endeffekt. Also Du müsstest praktisch nicht nur eine Aktie speichern, sondern auch den Verlauf der Werte der Aktie. Natürlich wird das ganze Szenario dann wieder um einiges komplexer.
                        Aber Du hast damit den Vorteil, dass Du später auch noch andere Auswertungen über dieselben (alten) Daten fahren kannst.
                        Aber ich denke ich würde das so aufziehen und die Auswertung definitiv clientseitig machen, weil man dort VIEL flexibler ist.
                        Für die Performance könnte man so etwas wie einen ApplicationServer einsetzen, der z.B. oft verwendete Ergebnisse cached und nur auf die DB zugreift wenn es wirklich nötig ist. Aber auch das ist natürlich einiges komplexer als dein bisheriges Programm.
                        Es kommt natürlich auch drauf an wie umfangreich Dein Programm wird. Soll es wirklich nur ein Programm zur Auswertung genau dieser einen Sache sein, dann hätte ich jetzt nicht wirklich große Magenschmerzen. Aber möchte man in Zukunft vielleicht noch andere Auswertungen dazubauen oder einfach nur den Algorithmus zur Auswertung ändern können, würde ich schon den ein oder anderen Gedanken an so etwas verschwenden

                        Hoffe das hilft etwas meine Denkweise zu verstehen

                        Grüße aus Bayern!!!

                        Comment


                        • #13
                          ein Griezi nach Bayern,

                          ja, ich muss den Verlauf der Werte einer Aktie haben. Ich brauche ja die Rendite von drei Monaten, die werden dann gemittelt und das jeweilige Unternehmen wird dann in eine der zehn Gruppen gesteckt, welche entstehen nach Marktwert.
                          Das ist eine Studie von Ibbotson aus den Staaten und die mach ich jetzt für die Schweiz. Aber das ist wirklich recht schwer, diese doofen Splittings, nicht sauber geführten Datenblätter (ich hab sie von der schweizer Börse erhalten, leider aber erst seit 1996 und nicht wie gewünscht ab 1986).

                          So, ich gehe jetzt ins Bett, mit einem ruhigen Gewissen, dass ich das Problem Rendite erledigt habe. Das nächste steht bevor. Werde mich wieder melden. hoffe dann auf konstruktive Lösungen, denn das nächste Problem wird schwieriger zu lösen sein, smile.

                          Griessli us Basel

                          Comment

                          Working...
                          X