Data Explorer zur Insider Trades Analyse

Börsennotierte Unternehmen unterliegen dem Publizitätsgesetz. Damit müssen Vorstandsmitglieder Aktienkäufe und Verkäufe offenlegen.

Für die meisten US Unternehmen findet sich diese Information beispielsweise auf MSN.com : http://investing.money.msn.com/investments/insider-transactions?symbol=MSFT

Bisher war das Abziehen und Analysieren aller Daten nahezu unmöglich bzw. mit großem manuellen Aufwand verbunden. Mit dem neuen Excel Data Explorer Plug In ist die Auswertung um ein Vielfaches einfacher geworden.

Das Ziel der Übung ist eine Analyse der Insidergeschäfte amerikanischer Vorstände und Hedgefonds. Im Folgenden werden meldepflichtige Käufe und Verkäufe nach Volumen in allen Sektoren des S&P 500 der letzten 3 Monate dargestellt:

Insider Trades

Ein Beispiel:

Im Technology Sector haben im letzten Jahr die meisten Eigentümer ihre Aktien abgestoßen.

Auffällig ist das Unternehmen Netflix. Hier gab es größere Investitionen.

netflix

Schaut man sich das genauer an, findet man beispielsweise einen Trade im April 2012 zum Kurs von 85 USD.

Richard Barton

Inzwischen steht Netflix bei 190 USD.

nfstock

Richard Barton und alle die es ihm nachgemacht haben, dürften hier ein sehr gutes Geschäft (+ 223% ) gemacht haben.

Wie kommt man nun an diese Daten?

Im ersten Schritt muss die Datenquelle parametrisiert werden. Dazu wird der Link zur Website für jedes Stock Symbol aufgerufen. http://investing.money.msn.com/investments/insider-transactions?symbol= [symbol]

Zunächst ist daher eine Liste an Stock Symboles erforderlich. Danach kann für jedes Symbol die Website mit den jeweiligen Insider-Trades geladen werden.

Eine initiale Liste aller S&P 500 Unternehmen ist mit dem Data Explorer schnell gefunden:

Insider Trades Data Search

Die Daten werden über einen O-Data Feed angeliefert.

Source

Der schwierigste Part ist nun, für jede Zeile in der Liste aller Unternehmen alle Insider Trades zu laden.

Im Query wird dazu die Web.Contents Methode mit 2 Parametern aufgerufen:

= Table.AddColumn(Source, “Custom”, each Web.Page(Web.Contents(“http://investing.money.msn.com/investments/insider-transactions?view=All“, [Query=[symbol=[Ticker_symbol]]] )))

Wobei [Ticker_Symbol] den Name der Spalte aus der Tabelle mit allen Unternehmen darstellt.

SourceMerge

Danach wird die Tabelle um zusätzlich Daten erweitert:

= Table.ExpandTableColumn(InsertedCustom, “Custom”, {“Data”}, {“Custom.Data”})SourceExpand

Die Erweiterung sollte nun die Spalten für den Kurs, die Transaktion, den Zeitpunkt und den Insider liefern.

SourceExpanded

Zum Schluss sind noch einige Filter und Umrechnungen nötig. Beispielsweise um Volumen die in Millionen USD angegeben wurden, richtig zu berücksichtigen.

Das gesamte Script sieht wie folgt aus.

let
Source = OData.Feed(“http://publicdata.cloudapp.net/wikipedia/Tables/c061f68c/861341bf8e98885945e4bedf/Data“),
InsertedCustom = Table.AddColumn(Source, “Custom”, each Web.Page(Web.Contents(“http://investing.money.msn.com/investments/insider-transactions?view=All“, [Query=[symbol=[Ticker_symbol]]] ))),
#”Expand Custom” = Table.ExpandTableColumn(InsertedCustom, “Custom”, {“Data”}, {“Custom.Data”}),
#”Expand Custom.Data” = Table.ExpandTableColumn(#”Expand Custom”, “Custom.Data”, {“DATE”, “NAME”, “TRANSACTION”, “NUM SHARES”, “PRICE(S)”, “VALUE”, “Kind”, “Name”, “Children”, “Text”}, {“Custom.Data.DATE”, “Custom.Data.NAME”, “Custom.Data.TRANSACTION”, “Custom.Data.NUM SHARES”, “Custom.Data.PRICE(S)”, “Custom.Data.VALUE”, “Custom.Data.Kind”, “Custom.Data.Name”, “Custom.Data.Children”, “Custom.Data.Text”}),
FilteredRows = Table.SelectRows(#”Expand Custom.Data”, each [Custom.Data.DATE] <> null),
HiddenColumns = Table.RemoveColumns(FilteredRows,{“Custom.Data.Kind”, “Custom.Data.Name”, “Custom.Data.Children”, “Custom.Data.Text”}),
FilteredRows1 = Table.SelectRows(HiddenColumns, each [Custom.Data.TRANSACTION] <> “Gift”),
FilteredRows2 = Table.SelectRows(FilteredRows1, each not Text.Contains([Custom.Data.TRANSACTION], “Grant”)),
FilteredRows3 = Table.SelectRows(InsertedCustom3, each [Custom.Data.TRANSACTION] <> “Exercise”),
InsertedCustom1 = Table.AddColumn(FilteredRows2, “MillionIndicator”, each if (Text.Contains([Custom.Data.VALUE], “Mil”)) then 1 else 0),
InsertedCustom3 = Table.AddColumn(InsertedCustom1, “VolumeMixedUnits”, each [Custom.Data.VALUE]),
ReplacedValue = Table.ReplaceValue(InsertedCustom3,”Mil”,””,Replacer.ReplaceText,{“VolumeMixedUnits”}),
FilteredRows4 = Table.SelectRows(ReplacedValue, each [Custom.Data.TRANSACTION] <> “Exercise”),
ChangedType1 = Table.TransformColumns(FilteredRows4,{{“VolumeMixedUnits”, Number.From}}),
InsertedCustom2 = Table.AddColumn(ChangedType1, “Volume”, each if [MillionIndicator] = 1 then [VolumeMixedUnits] * 1000000 else [VolumeMixedUnits]),
ChangedType2 = Table.TransformColumns(InsertedCustom2,{{“Custom.Data.PRICE(S)”, Number.From}}),
InsertedCustom4 = Table.AddColumn(ChangedType2, “NumberOfShares”, each [Volume]/[#"Custom.Data.PRICE(S)"]),
HiddenColumns1 = Table.RemoveColumns(InsertedCustom4,{“Custom.Data.NUM SHARES”, “MillionIndicator”, “VolumeMixedUnits”, “Custom.Data.VALUE”}),
RenamedColumns = Table.RenameColumns(HiddenColumns1,{{“Custom.Data.PRICE(S)”, “Price”}, {“Custom.Data.TRANSACTION”, “Transaction”}, {“Custom.Data.NAME”, “Insider”}, {“Custom.Data.DATE”, “Date”}}),
ChangedType3 = Table.TransformColumns(RenamedColumns,{{“Date”, Date.From}}),
HiddenColumns2 = Table.RemoveColumns(ChangedType3,{“SEC_filings”, “Date_first_added”, “Key”})
in
HiddenColumns2

Der Data Explorer zeigt Anfangs nur 100 Records im Preview an. Man muss sich noch etwas in Geduld üben (bei mir waren es zirka 30 Minuten), bis er die rund 2600 Datensätze geladen hat.

Nun kann man mit gewohnten BI Tools (Power Pivot / Power View) die Daten auswerten.

Fazit:

Der Data Explorer lässt sich sehr kreativ einsetzen. Die Scriptsprache kann man binnen weniger Stunden erlernen und ermöglicht sehr flexiblen Zugriff auf beliebige Datenquellen. Das Investment lohnt sich!

Disclaimer: I hope that the information on these pages is valuable to you. Your use of the information contained in these pages, however, is at your sole risk. All information on these pages is provided “as -is”, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by Ezequiel. Further, Ezequiel shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages.

About these ads
Dieser Beitrag wurde unter Nachlese veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ photo

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s