We examine 13F filings which are quarterly reports filed per SEC regulations by institutional investment managers containing all equity assets under management of at least $100 million in value. Form 13F is required to be filed within 45 days of the end of a calendar quarter (which should be considered as significant information latency).
Form 13F only reports long positions. Short positions are not required to be disclosed and are not reported. Section 13(f) securities generally include equity securities that trade on an exchange (including Nasdaq), certain equity options and warrants, shares of closed-end investment companies, and certain convertible debt securities. The shares of open-end investment companies (i.e. mutual funds) are not Section 13(f) securities. See Official List of Section 13(f) Securities and our caveats section below.
Form 13F does not include neither total portfolio value nor percentage allocation of each stock listed. We remedy that, and also parse the report for easy reading. Our notebook will then develop into a module yi_secform which will do all the work via one function.
As specific example, we focus on Druckenmiller and Paulson as asset managers who have significant positions in GLD, a gold ETF.
Top holdings are easily analyzed by a single Python module: yi_secform
Dependencies:
- Linux, bash [not crucial, cross-platform prefered]
- Python: matplotlib, pandas [recommend Anaconda distribution]
- Modules: numpy, lxml, html5lib, yi_secform
CHANGE LOG
2015-11-16 Update in Appendix for Druckenmiller and Paulson.
2015-08-28 First version.
# NOTEBOOK v4 settings and system details: [00-tpl v4.15.0812]
# Assume that the backend is LINUX (e.g. Ubuntu running bash shell):
print '\n :: TIMESTAMP of last notebook execution:'
!date
print ' :: IPython version:'
!ipython --version
# Automatically RELOAD modified modules:
%load_ext autoreload
%autoreload 2
# 0 disables autoreload.
# DISPLAY options
from IPython.display import Image
# e.g. Image(filename='holt-winters-equations.png', embed=True) # url= also works
from IPython.display import YouTubeVideo
# e.g. YouTubeVideo('1j_HxD4iLn8', start='43', width=600, height=400)
from IPython.display import HTML # useful for snippets
# e.g. HTML('<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350></iframe>')
from IPython.core import page
get_ipython().set_hook('show_in_pager', page.as_hook(page.display_page), 0)
# Or equivalently in config file: "InteractiveShell.display_page = True",
# which will display results in secondary notebook pager frame in a cell.
# MATH display, use %%latex, rather than the following:
# from IPython.display import Math
# from IPython.display import Latex
# Generate PLOTS inside notebook:
%matplotlib inline
import pandas as pd
print ' :: pandas version:'
print pd.__version__
# pandas DataFrames are represented as text by default; enable HTML representation:
# [Deprecated: pd.core.format.set_printoptions( notebook_repr_html=True ) ]
pd.set_option( 'display.notebook_repr_html', False )
print ' :: Working directory (set as $workd):'
workd, = !pwd
print workd + '\n'
:: TIMESTAMP of last notebook execution: Mon Nov 16 18:13:39 PST 2015 :: IPython version: 3.2.1 :: pandas version: 0.16.2 :: Working directory (set as $workd): /home/yaya/Dropbox/ipy/fecon235/nb
import numpy as np
13F filings disclose hedge fund long positions in US equity markets, American Depositary Receipts (ADRs), both put and call options, as well as convertible notes. They do not disclose short sales, cash positions, or any other asset class.
Yet performance results for the clones are somewhat in line with the actual performance of the fund. E.g. Paulson & Co (John Paulson)
Track managers that normally run net long. Tracking global macro funds (Bridgewater, Tudor) or credit funds (Fortress, Cerberus) is misguided because the vast majority of their positions are in asset classes that they don't have to disclose (futures, commodities, bonds, currencies, etc). And while quant funds (RenTec, AQR) often disclose stocks, following them is a folly because you have absolutely no idea why their algorithms bought in the first place.
13F does not reveal international holdings (except for ADR's).
Follow long-term oriented funds to reduce the effect of the delay in 13F disclosures.
Money managers allocate the most capital to their best ideas. Pay attention to "new positions" in their disclosures as these are their most recent ideas.
Always remember that the 13F is not their whole portfolio and that it's a past snapshot.
Monitor all SEC filings, not just 13F's: 13G filings, 13D filings, as well as various Form 3 and Form 4's are filed on a more timely basis and provide a more current look at what managers are buying or selling. They are required to file when they've purchased 5% or more of a company.
Caveats source: http://www.marketfolly.com/2012/10/hedge-fund-13f-filing-pros-and-cons.html
Source: http://www.sec.gov/answers/form13f.htm
You can search for and retrieve Form 13F filings using the SEC's EDGAR database. To find the filings of a particular money manager, enter the money manager's name in the Company Name field. To see all recently filed 13Fs, use the "Latest Filings" search function and enter "13F" in the Form Type box.
Stanley Druckenmiller closed his Duquesne Capital Management hedge fund in 2010 but he still discloses the holdings of his family office (search: “Duquesne Family Office” picking the Information Table in html).
He made headlines because of his new acquisition in gold (the GLD ETF) which now is his largest position (about 22% of his entire portfolio)!
# https cannot be read by lxml, surprisingly.
druck150814='http://www.sec.gov/Archives/edgar/data/1536411/000153641115000006/xslForm13F_X01/form13f_20150630.xml'
# START HERE with a particular URL:
url = druck150814
# Let's display the web page as in the browser to understand the semantics:
HTML("<iframe src=" + url + " width=1400 height=350></iframe>")
# Use pandas to read in the xml page...
# See http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_html.html
# It searches for <table> elements and only for <tr> and <th> rows and <td> elements
# within each <tr> or <th> element in the table.
page = pd.read_html( url )
# Nasty output in full:
#uncomment: page
# page is a list of length 4:
len( page )
4
# But only the last element of page interests us:
df = page[-1]
# which turns out to be a dataframe!
# Let's rename columns for our sanity:
df.columns = [ 'stock', 'class', 'cusip', 'usd', 'size', 'sh_prin', 'putcall', 'discret', 'manager', 'vote1', 'vote2', 'vote3']
# But first three rows are SEC labels, not data,
# so delete them:
df = df[3:]
# Start a new index from 0 instead of 3:
df.reset_index( drop=True )
stock class cusip usd size \ 0 Akamai Tech Inc COM 00971T101 24807 355300 1 Alcoa Inc COM 013817101 40698 3650000 2 Alibaba Group Hldg Ltd SPONS ADS 01609W102 18025 219100 3 Am Int'l Grp Inc COM 026874784 15474 250300 4 BB&T Corp COM 054937107 19575 485600 5 Citigroup Inc COM 172967424 64907 1175000 6 Cognizant Tech Sol's Corp CL A 192446102 14466 236800 7 Ctrip.com Int'l Ltd AM DEP SHS 22943F100 14626 201400 8 Dow Chemical Co COM 260543103 59526 1163300 9 EOG Res's Inc COM 26875P101 27219 310900 10 Eastman Chemical Co COM 277432100 15219 186000 11 EBay Inc COM 278642103 19698 327000 12 Facebook Inc CL A 30303M102 160612 1872700 13 Freeport-McMoRan Inc CL B 35671D857 66045 3547000 14 HDFC Bank Ltd ADR REPS 3 SHS 40415F101 60748 1003600 15 Halliburton Co COM 406216101 66629 1547000 16 Illumina Inc COM 452327109 45091 206500 17 JP Morgan Chase & Co COM 46625H100 52670 777300 18 JD.Com Inc SPON ADR CL A 47215P106 20221 593000 19 Microsoft Corp COM 594918104 61726 1398100 20 Newmont Mining Corp COM 651639106 29898 1279900 21 Noble Energy Inc COM 655044105 13453 315200 22 PNC Fin'l Services Group, Inc COM 693475105 19570 204600 23 Pioneer Nat'l Res's Co COM 723787107 15922 114800 24 SPDR Gold Trust GOLD SHS 78463V907 323626 2880000 25 SunTrust Banks Inc COM 867914103 19664 457100 26 Wells Fargo & Co COM 949746101 94449 1679400 27 Workday Inc CL A 98138H101 25261 330679 28 LyondellBasell Ind's NV SHS - A - N53745100 74219 716950 sh_prin putcall discret manager vote1 vote2 vote3 0 SH NaN DFND NaN 355300 0 0 1 SH NaN DFND NaN 3650000 0 0 2 SH NaN DFND NaN 219100 0 0 3 SH NaN DFND NaN 250300 0 0 4 SH NaN DFND NaN 485600 0 0 5 SH NaN DFND NaN 1175000 0 0 6 SH NaN DFND NaN 236800 0 0 7 SH NaN DFND NaN 201400 0 0 8 SH NaN DFND NaN 1163300 0 0 9 SH NaN DFND NaN 310900 0 0 10 SH NaN DFND NaN 186000 0 0 11 SH NaN DFND NaN 327000 0 0 12 SH NaN DFND NaN 1872700 0 0 13 SH NaN DFND NaN 3547000 0 0 14 SH NaN DFND NaN 1003600 0 0 15 SH NaN DFND NaN 1547000 0 0 16 SH NaN DFND NaN 206500 0 0 17 SH NaN DFND NaN 777300 0 0 18 SH NaN DFND NaN 593000 0 0 19 SH NaN DFND NaN 1398100 0 0 20 SH NaN DFND NaN 1279900 0 0 21 SH NaN DFND NaN 315200 0 0 22 SH NaN DFND NaN 204600 0 0 23 SH NaN DFND NaN 114800 0 0 24 SH NaN DFND NaN 2880000 0 0 25 SH NaN DFND NaN 457100 0 0 26 SH NaN DFND NaN 1679400 0 0 27 SH NaN DFND NaN 330679 0 0 28 SH NaN DFND NaN 716950 0 0
# Delete irrevelant columns:
dflite = df.drop( df.columns[[1, 4, 5, 7, 8, 9, 10, 11]], axis=1 )
# inplac=True only after pandas 0.13
#uncomment: dflite
# usd needs float type since usd was read as string:
dflite[['usd']] = dflite[['usd']].astype( float )
# Gotcha: int as type will fail for NaN
# Type change allows proper sort:
dfusd = dflite.sort( ['usd'], ascending=[False] )
usdsum = sum( dfusd.usd )
# Portfolio total in USD:
usdsum
1484044.0
# New column for percentage of total portfolio:
dfusd['pcent'] = np.round(( dfusd.usd / usdsum ) * 100, 2)
# Top 20 Hits!
dfusd.head( 20 )
stock cusip usd putcall pcent 27 SPDR Gold Trust 78463V907 323626 NaN 21.81 15 Facebook Inc 30303M102 160612 NaN 10.82 29 Wells Fargo & Co 949746101 94449 NaN 6.36 31 LyondellBasell Ind's NV N53745100 74219 NaN 5.00 18 Halliburton Co 406216101 66629 NaN 4.49 16 Freeport-McMoRan Inc 35671D857 66045 NaN 4.45 8 Citigroup Inc 172967424 64907 NaN 4.37 22 Microsoft Corp 594918104 61726 NaN 4.16 17 HDFC Bank Ltd 40415F101 60748 NaN 4.09 11 Dow Chemical Co 260543103 59526 NaN 4.01 20 JP Morgan Chase & Co 46625H100 52670 NaN 3.55 19 Illumina Inc 452327109 45091 NaN 3.04 4 Alcoa Inc 013817101 40698 NaN 2.74 23 Newmont Mining Corp 651639106 29898 NaN 2.01 12 EOG Res's Inc 26875P101 27219 NaN 1.83 30 Workday Inc 98138H101 25261 NaN 1.70 3 Akamai Tech Inc 00971T101 24807 NaN 1.67 21 JD.Com Inc 47215P106 20221 NaN 1.36 14 EBay Inc 278642103 19698 NaN 1.33 28 SunTrust Banks Inc 867914103 19664 NaN 1.33
We sum up our work above in a module for easy execution using one function.
import yi_secform
yi_secform.pcent13f( druck150814, 20 )
# Simply enter the Information Table html URL for a 13F filing,
# and bang... [verifying our output in the previous cell]:
stock cusip usd putcall pcent 27 SPDR Gold Trust 78463V907 323626 NaN 21.81 15 Facebook Inc 30303M102 160612 NaN 10.82 29 Wells Fargo & Co 949746101 94449 NaN 6.36 31 LyondellBasell Ind's NV N53745100 74219 NaN 5.00 18 Halliburton Co 406216101 66629 NaN 4.49 16 Freeport-McMoRan Inc 35671D857 66045 NaN 4.45 8 Citigroup Inc 172967424 64907 NaN 4.37 22 Microsoft Corp 594918104 61726 NaN 4.16 17 HDFC Bank Ltd 40415F101 60748 NaN 4.09 11 Dow Chemical Co 260543103 59526 NaN 4.01 20 JP Morgan Chase & Co 46625H100 52670 NaN 3.55 19 Illumina Inc 452327109 45091 NaN 3.04 4 Alcoa Inc 013817101 40698 NaN 2.74 23 Newmont Mining Corp 651639106 29898 NaN 2.01 12 EOG Res's Inc 26875P101 27219 NaN 1.83 30 Workday Inc 98138H101 25261 NaN 1.70 3 Akamai Tech Inc 00971T101 24807 NaN 1.67 21 JD.Com Inc 47215P106 20221 NaN 1.36 14 EBay Inc 278642103 19698 NaN 1.33 28 SunTrust Banks Inc 867914103 19664 NaN 1.33
For comparison, since the press has been stating Paulson has been selling the GLD ETF due to redemptions. 13F search page: http://www.sec.gov/cgi-bin/browse-edgar?company=Paulson+%26+Co.&owner=exclude&action=getcompany
# 13F for Paulson & Co. filed 2015-08-14:
paulson150814 = 'http://www.sec.gov/Archives/edgar/data/1035674/000114036115032242/xslForm13F_X01/form13fInfoTable.xml'
yi_secform.pcent13f( paulson150814, 20 )
stock cusip usd putcall pcent 4 ALLERGAN PLC G0177J108 2177083 NaN 10.04 59 VALEANT PHARMACEUTICALS INTL 91911K102 1999350 NaN 9.22 49 SHIRE PLC 82481R106 1713396 NaN 7.90 36 MYLAN N V N59465109 1487020 NaN 6.86 56 TIME WARNER CABLE INC 88732J207 1447275 NaN 6.67 19 DIRECTV 25490A309 1057806 NaN 4.88 50 SPDR GOLD TRUST 78463V107 1037720 NaN 4.79 52 STARWOOD HOTELS&RESORTS WRLD 85590A401 973031 NaN 4.49 58 T-MOBILE US INC 872590104 924467 NaN 4.26 5 AMERICAN INTL GROUP INC 026874784 902770 NaN 4.16 21 EXTENDED STAY AMER INC 30224P200 894608 NaN 4.13 32 MALLINCKRODT PUB LTD CO G5785G107 776268 NaN 3.58 23 GRIFOLS S A 398438408 551918 NaN 2.55 25 HCA HOLDINGS INC 40412C101 427464 NaN 1.97 61 WHITING PETE CORP NEW 966387102 417258 NaN 1.92 13 COBALT INTL ENERGY INC 19075F106 405403 NaN 1.87 48 REALOGY HLDGS CORP 75605Y106 329016 NaN 1.52 27 HOUGHTON MIFFLIN HARCOURT CO 44157R109 308176 NaN 1.42 12 CABLEVISION SYS CORP 12686C109 296856 NaN 1.37 16 COMPUTER SCIENCES CORP 205363104 278642 NaN 1.28
Paulson is usually the largest stakeholder in GLD also known as "SPDR GOLD TRUST". The latest 13F shows he holds $1.037 billion worth which is equivalent to about 886,183 troy ounces (27.6 metric tons). It actually only represents half of his very top equity holding: Allergan at 10% allocation.
Druckenmiller's 13F disclosing his Family Office (not a public operation like Paulson & Co) shows a $0.324 billion position in GLD, equivalent to about 276,367 troy ounces (8.6 metric tons). It appears to be a new bold trade since it is his largest holding at 22% allocation.
[Spot gold on 2015-06-30, end of second calendar quarter, was fixed at $1171 in London.]
We do not truly know their respective net positions because they could be hedged in the gold futures market.* Futures positions are excluded from 13F filings, as well as cash position (which would fund any further accumulation).*
Remember that we viewing past snapshots of positions dated 30 June 2015. Such positions could have been entirely liquidated during July and August when the gold market declined severely. On the other hand, gold rallied considerably days after the market received Druckenmiller's vote of bold confidence via his 13F filed on August 14th.
druck151113 = 'http://www.sec.gov/Archives/edgar/data/1536411/000153641115000008/xslForm13F_X01/form13f_20150930.xml'
paulson151116 = 'http://www.sec.gov/Archives/edgar/data/1035674/000114036115041689/xslForm13F_X01/form13fInfoTable.xml'
# Druckenmiller 13F for 2015-11-13:
yi_secform.pcent13f( druck151113, 20 )
stock cusip usd putcall pcent 9 Facebook Inc 30303M102 367988 NaN 31.29 17 SPDR Gold Trust 78463V907 307757 Call 26.17 13 Microsoft Corp 594918104 61477 NaN 5.23 10 HDFC Bank Ltd 40415F101 61310 NaN 5.21 19 Wells Fargo & Co 949746101 61050 NaN 5.19 3 Amazon.com Inc 023135106 49807 NaN 4.23 5 Ctrip.com Int'l Ltd 22943F100 30364 NaN 2.58 20 Workday Inc 98138H101 30187 NaN 2.57 12 JD.Com Inc 47215P106 28103 NaN 2.39 11 Illumina Inc 452327109 27393 NaN 2.33 18 Under Armour, Inc 904311107 25143 NaN 2.14 8 Expedia Inc 30212P303 20370 NaN 1.73 4 Carnival Corp 143658300 19303 NaN 1.64 16 Priceline Group Inc 741503403 19295 NaN 1.64 21 Royal Carib'n Cruises Ltd V7780T103 19021 NaN 1.62 14 PayPal Holdings Inc 70450Y103 17544 NaN 1.49 15 Pioneer Nat'l Res's Co 723787107 10060 NaN 0.86 7 EOG Resources Inc 26875P101 10046 NaN 0.85 6 Dow Chemical Co 260543103 9998 NaN 0.85
# Paulson 13F for 2015-11-16:
yi_secform.pcent13f( paulson151116, 20 )
stock cusip usd putcall pcent 5 ALLERGAN PLC G0177J108 1952139 NaN 10.13 63 VALEANT PHARMACEUTICALS INTL 91911K102 1585798 NaN 8.23 61 TIME WARNER CABLE INC 88732J207 1457023 NaN 7.56 54 SHIRE PLC 82481R106 1396631 NaN 7.25 56 STARWOOD HOTELS&RESORTS WRLD 85590A401 1036756 NaN 5.38 59 TEVA PHARMACEUTICAL INDS LTD 881624209 1016280 NaN 5.28 55 SPDR GOLD TRUST 78463V107 986836 NaN 5.12 62 T-MOBILE US INC 872590104 937430 NaN 4.87 38 MYLAN N V N59465109 882220 NaN 4.58 7 AMERICAN INTL GROUP INC 026874784 829754 NaN 4.31 24 EXTENDED STAY AMER INC 30224P200 799761 NaN 4.15 26 GRIFOLS S A 398438408 538966 NaN 2.80 45 PERRIGO CO PLC G97822103 462138 NaN 2.40 34 MALLINCKRODT PUB LTD CO G5785G107 421633 NaN 2.19 27 HCA HOLDINGS INC 40412C101 364513 NaN 1.89 16 COBALT INTL ENERGY INC 19075F106 295598 NaN 1.53 15 CIT GROUP INC 125581801 276998 NaN 1.44 52 REALOGY HLDGS CORP 75605Y106 265002 NaN 1.38 11 CABLEVISION SYS CORP 12686C109 253266 NaN 1.31 48 PRECISION CASTPARTS CORP 740189105 229710 NaN 1.19
[Spot gold on 2015-09-30, end of second calendar quarter, was fixed at $1114 in London, -4.9% from previous quarter.]
2015-11-16: GLD is no longer Druckenmiller's top holding (replaced by Facebook): change from last quarter "323626 NaN 21.81" to "307757 Call 26.17" -- however, its allocation has been increased, though net position is unchanged (given price decrease in the spot market). Curiously it appears the underlying instrument has shifted to calls. The expiration date of the calls are not known, but it is indicative of a shift to short-term trading perspective. Druckenmiller's gold downside is now limited to the premiums paid.
As for Paulson: change from last quarter: "1037720 NaN 4.79" to "986836 NaN 5.12" -- indicates no change in position since the GLD valuation mirrors the decrease in the spot gold market.