Are long term asset class relationships stable?

Last week, we looked at gold as part of a long-term asset allocation.

I was curious about how stable those relationships would be over time, so I ran the same plots, starting from different inflection points.

Original analysis: 1928-2010:
Efficient frontier, 1928-2010Transition map, 1928-2010

(The transition map shows you the composition of the maximum return portfolio for each level of risk.)

1946-2010, Post-war, since Bretton Woods:

Efficient frontier, 1946-2010Transition map, 1946-2010

1972-2010, Post-war, post-gold standard:

Efficient frontier, 1972-2010Transition map, 1972-2010

1982-2010, Era of disinflation, globalization:

Efficient frontier, 1982-2010Transition map, 1982-2010

This is interesting, since it shows how poorly gold has performed since 1982, an era of low inflation, the dollar standard, and decreasing holdings of gold by central banks and investors.

Note that this does not include the 37% decline in real gold prices from 1980-1981, as the gold bull market ended amid still-high inflation.

Let’s compare the pre-1982 era. Note the shift down and to the right: a less favorable tradeoff of lower returns and higher risks.

1928-1981:

Efficient frontier, 1928-1971Transition map, 1928-1971

Take-aways:

  • The shape of the efficient frontier has been mostly fairly stable over the long term, with gold offering high risk, low real return, little correlation with other assets, and adding value to most portfolios.
  • From 1982 until recently, the environment was unusually favorable for financial assets in general, extremely favorable for bonds, and unusually poor for gold.

R code for the masochists:

?View Code RSPLUS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
# install.packages('quantmod')
require(quantmod)
# install.packages('lpSolve')
require(lpSolve)
# install.packages('quadprog')
require(quadprog)
# install.packages('ggplot2')
require(ggplot2)
 
# define functions
 
#################################################################
# use linear programming to find maximum return portfolio (100% highest return asset)
#################################################################
 
runlp <- function ( returns )
{
 
    # find maximum return portfolio (rightmost point of efficient frontier)
    # will be 100% of highest return asset
    # maximize
    #   w1 * stocks return +w2 *bills +w3*bonds + w4 * gold
    #   subject to 0 <= w <= 1  for each w
    # will pick highest return asset with w=1
    # skipping >0 constraint, no negative return assets, so not binding
 
    opt.objective <- apply(returns, 2, mean)
 
    # should use length(objective) to populate matrix
    nAssets <- length(returns)
    ones = rep (1, nAssets)
    zeros = rep (0, nAssets)
 
    # constrain sum of weights to 1
    constraintlist = ones
    operatorlist = c("=")
    rhslist = c(1)
 
    # constrain each weight >= 0
    for(i in 1:nAssets) {
        newconstraint = zeros
        newconstraint[i]=1
        constraintlist = c(constraintlist, newconstraint)
        operatorlist = c(operatorlist, ">=")
        rhslist = c(rhslist, 0)
    }
 
#    Example
#    opt.constraints <- matrix (c(1, 1, 1, 1,  # constrain sum of weights to 1
#                             1, 0, 0, 0,  # constrain w1 <= 1
#                             0, 1, 0, 0,  # constrain w2 <= 1
#                             0, 0, 1, 0,  # constrain w3 <= 1
#                             0, 0, 0, 1)  # constrain w4 <= 1
#                           , nrow=5, byrow=TRUE)
 
    opt.constraints <- matrix (constraintlist, nrow=nAssets+1, byrow=TRUE)
    opt.operator <- operatorlist
    opt.rhs <- rhslist
    opt.dir="max"
 
    tmpsolution = lp (direction = opt.dir,
    opt.objective,
    opt.constraints,
    opt.operator,
    opt.rhs)
 
    sol= c()
    # portfolio weights for max return portfolio
    sol$wts=tmpsolution$solution
    # return for max return portfolio
    sol$ret=tmpsolution$objval
    # compute return covariance matrix to determine volatility of this portfolio
    sol$covmatrix = cov(returns, use = 'complete.obs', method = 'pearson')
    # multiply weights x covariances x weights, gives variance
    sol$var = sol$wts %*% sol$covmatrix %*% sol$wts
    # square root gives standard deviation (volatility)
    sol$vol = sqrt(sol$var)
 
    return (sol)
}
 
runqp <- function ( returns, hurdle=0 )
{
#################################################################
# find minimum volatility portfolio
#################################################################
 
# minimize variance:  w %*% covmatrix %*% t(w)
# subject to sum of ws = 1
# subject to each w >= 0
# subject to each return >= hurdle
 
# solution.minvol <- solve.QP(covmatrix, zeros, t(opt.constraints), opt.rhs, meq = opt.meq)
# first 2 parameters covmatrix, zeros define function to be minimized
# if zeros is all 0s, the function minimized ends up equal to port variance / 2
# opt.constraints is the left hand side of the constraints, ie the cs in
# c1 w1 + c2 w2 ... + cn wn = K
# opt.rhs is the Ks in the above equation
# meq means the first meq rows are 'equals' constraints, remainder are >= constraints
# if you want to do a <= constraint, multiply by -1 to make it a >= constraint
# does not appear to accept 0 RHS, so we make it a tiny number> 0
 
    # compute expected returns
    meanreturns <- apply(returns, 2, mean)
 
    # compute covariance matrix
    covmatrix = cov(returns, use = 'complete.obs', method = 'pearson')
 
    nAssets <- length(returns)
    nObs <- length(returns$stocks)
    ones = rep (1, nAssets)
    zeros = rep (0, nAssets)
 
    # constrain sum of weights to 1
    constraintlist = ones
    rhslist = c(1)
 
    # constrain each weight >= 0
    for(i in 1:nAssets) {
        newconstraint = zeros
        newconstraint[i]=1
        constraintlist = c(constraintlist, newconstraint)
        rhslist = c(rhslist, 0)
    }
 
    # constrain return >= hurdle
    constraintlist = c(constraintlist, meanreturns)
    rhslist = c(rhslist, hurdle)
 
    # example
    # opt.constraints <- matrix (c(1, 1, 1, 1,   # sum of weights =1
    #                             1, 0, 0, 0,   # w1 >= 0
    #                             0, 1, 0, 0,   # w2 >= 0
    #                             0, 0, 1, 0,   # w3 >= 0
    #                             0, 0, 0, 1)   # w4 >= 0
 
    #                           , nrow=5, byrow=TRUE)
    # opt.rhs <- matrix(c(1, 0.000001, 0.000001, 0.000001, 0.000001))
    # opt.constraints = rbind(opt.constraints, meanreturns)
    # opt.rhs=rbind(opt.rhs, hurdle)
 
    opt.constraints <- matrix (constraintlist, nrow=nAssets+2, byrow=TRUE)
    opt.rhs <- opt.rhs <- matrix(rhslist)
    opt.meq <- 1  # first constraint is '=', rest are '>='
 
    zeros <- array(0, dim = c(nAssets,1))
    tmpsolution <- solve.QP(covmatrix, zeros, t(opt.constraints), opt.rhs, meq = opt.meq)
 
    sol= c()
    sol$wts = tmpsolution$solution
    sol$var = tmpsolution$value *2
    sol$ret = meanreturns %*% sol$wts
    sol$vol = sqrt(sol$var)
 
    return(sol)
}
 
loopqp <- function (minvol, maxret, numtrials)
{
 
    #################################################################
    # loop and run a minimum volatility optimization for each return level from 2-49
    #################################################################
 
    # put minreturn portfolio in return series for min return, index =1
    out.ret=c(minvol$ret)
    out.vol=c(minvol$vol)
    out.stocks=c(minvol$wts[1])
    out.bills=c(minvol$wts[2])
    out.bonds=c(minvol$wts[3])
    out.gold=c(minvol$wts[4])
 
    lowreturn <- minvol$ret
    highreturn <- maxret$ret
    minreturns <- seq(lowreturn, highreturn, length.out=numtrials)
 
    for(i in 2:(length(minreturns) - 1)) {
        tmpsol <- runqp(freal,minreturns[i])
        tmp.wts = tmpsol$wts
        tmp.var = tmpsol$var
 
        out.ret[i] = realreturns %*% tmp.wts
        out.vol[i] = sqrt(tmp.var)
        out.stocks[i]=tmp.wts[1]
        out.bills[i]=tmp.wts[2]
        out.bonds[i]=tmp.wts[3]
        out.gold[i]=tmp.wts[4]
    }
 
# put maxreturn portfolio in return series for max return
    out.ret[numtrials]=c(maxret$ret)
    out.vol[numtrials]=c(maxret$vol)
    out.stocks[numtrials]=c(maxret$wts[1])
    out.bills[numtrials]=c(maxret$wts[2])
    out.bonds[numtrials]=c(maxret$wts[3])
    out.gold[numtrials]=c(maxret$wts[4])
 
    efrontier=data.frame(out.ret*100)
    efrontier$vol=out.vol*100
    efrontier$stocks=out.stocks*100
    efrontier$bills=out.bills*100
    efrontier$bonds=out.bonds*100
    efrontier$gold=out.gold*100
    names(efrontier) = c("Return", "Risk", "%Stocks", "%Bills", "%Bonds", "%Gold")
 
    return(efrontier)
}
 
############################################################
# charts
############################################################
 
plot_efrontier <- function (efrontier, returns, sds, apoints) {
 
    ggplot(data=efrontier, aes(x=Risk, y=Return)) +
#        opts(title="Efficient Frontier") +
        theme_bw() +
        geom_line(size=1.4) +
        geom_point(aes(x=apoints$sds, y=apoints$returns)) +
        scale_x_continuous(limits=c(1,24)) +
        # could loop through efrontier names
        annotate("text", apoints[1,1], apoints[1,2],label=" stocks", hjust=0) +
        annotate("text", apoints[2,1], apoints[2,2],label=" bills", hjust=0) +
        annotate("text", apoints[3,1], apoints[3,2],label=" bonds", hjust=0) +
        annotate("text", apoints[4,1], apoints[4,2],label=" gold", hjust=0)
#        annotate("text", 19,0.3,label="streeteye.com", hjust=0, alpha=0.5)
}
 
plot_transitionmap <- function (efrontier, returns, sds) {
 
    # define colors
    dvblue = "#000099"
    dvred = "#e41a1c"
    dvgreen = "#4daf4a"
    dvpurple = "#984ea3"
    dvorange = "#ff7f00"
    dvyellow = "#ffff33"
    dvgray="#666666"
 
    efrontier.m = melt(efrontier, id ='Risk')
 
    ggplot(data=efrontier.m, aes(x=Risk, y=value, colour=variable, fill=variable)) +
        theme_bw() +
        opts(legend.position="top", legend.direction="horizontal") +
        ylab('% Portfolio') +
        geom_area() +
        scale_colour_manual("", breaks=c("%Stocks", "%Bills", "%Bonds","%Gold"), values = c(dvblue,dvgreen,dvred,dvyellow), labels=c('%Stocks', '%Bills','%Bonds','%Gold')) +
        scale_fill_manual("", breaks=c("%Stocks", "%Bills", "%Bonds","%Gold"), values = c(dvblue,dvgreen,dvred,dvyellow), labels=c('%Stocks', '%Bills','%Bonds','%Gold'))
#        annotate("text", 16,-2.5,label="streeteye.com", hjust=0, alpha=0.5)
 
}
 
#################################################################
# Create some data
#################################################################
 
# not used in abbreviated example, but useful for reporting
startYear = 1928
endYear = 2010
YEARS =startYear:endYear
 
# nominal returns
SP500 = c(0.4381,-0.083,-0.2512,-0.4384,-0.0864,0.4998,-0.0119,0.4674,0.3194,-0.3534,0.2928,
-0.011,-0.1067,-0.1277,0.1917,0.2506,0.1903,0.3582,-0.0843,0.052,0.057,0.183,0.3081,0.2368,
0.1815,-0.0121,0.5256,0.326,0.0744,-0.1046,0.4372,0.1206,0.0034,0.2664,-0.0881,0.2261,0.1642,
0.124,-0.0997,0.238,0.1081,-0.0824,0.0356,0.1422,0.1876,-0.1431,-0.259,0.370,0.2383,-0.0698,
0.0651,0.1852,0.3174,-0.047,0.2042,0.2234,0.0615,0.3124,0.1849,0.0581,0.1654,0.3148,-0.0306,
0.3023,0.0749,0.0997,0.0133,0.372,0.2382,0.3186,0.2834,0.2089,-0.0903,-0.1185,-0.2197,0.2836,
0.1074,0.0483,0.1561,0.0548,-0.3658,0.2592,0.148600)
 
BILLS = c(0.0308,0.0316,0.0455,0.0231,0.0107,0.0096,0.0032,0.0018,0.0017,0.003,0.0008,0.0004,
0.0003,0.0008,0.0034,0.0038,0.0038,0.0038,0.0038,0.0057,0.0102,0.011,0.0117,0.0148,0.0167,
0.0189,0.0096,0.0166,0.0256,0.0323,0.0178,0.0326,0.0305,0.0227,0.0278,0.0311,0.0351,0.039,
0.0484,0.0433,0.0526,0.0656,0.0669,0.0454,0.0395,0.0673,0.0778,0.0599,0.0497,0.0513,0.0693,
0.0994,0.1122,0.143,0.1101,0.0845,0.0961,0.0749,0.0604,0.0572,0.0645,0.0811,0.0755,0.0561,
0.0341,0.0298,0.0399,0.0552,0.0502,0.0505,0.0473,0.0451,0.0576,0.0367,0.0166,0.0103,0.0123,
0.0301,0.0468,0.0464,0.0159,0.0014,0.001300)
 
BONDS=c(0.0084,0.042,0.0454,-0.0256,0.0879,0.0186,0.0796,0.0447,0.0502,0.0138,0.0421,0.0441,
0.054,-0.0202,0.0229,0.0249,0.0258,0.038,0.0313,0.0092,0.0195,0.0466,0.0043,-0.003,0.0227,
0.0414,0.0329,-0.0134,-0.0226,0.068,-0.021,-0.0265,0.1164,0.0206,0.0569,0.0168,0.0373,0.0072,
0.0291,-0.0158,0.0327,-0.0501,0.1675,0.0979,0.0282,0.0366,0.0199,0.0361,0.1598,0.0129,-0.0078,
0.0067,-0.0299,0.082,0.3281,0.032,0.1373,0.2571,0.2428,-0.0496,0.0822,0.1769,0.0624,0.150,
0.0936,0.1421,-0.0804,0.2348,0.0143,0.0994,0.1492,-0.0825,0.1666,0.0557,0.1512,0.0038,0.0449,
0.0287,0.0196,0.1021,0.201,-0.1112,0.084600)
 
CPI=c(-0.0115607,0.005848,-0.0639535,-0.0931677,-0.1027397,0.0076336,0.0151515,0.0298507,
0.0144928,0.0285714,-0.0277778,0.0000,0.0071429,0.0992908,0.0903226,0.0295858,0.0229885,
0.0224719,0.1813187,0.0883721,0.0299145,-0.0207469,0.059322,0.0600,0.0075472,0.0074906,
-0.0074349,0.0037453,0.0298507,0.0289855,0.0176056,0.017301,0.0136054,0.0067114,0.0133333,
0.0164474,0.0097087,0.0192308,0.0345912,0.0303951,0.0471976,0.0619718,0.0557029,0.0326633,
0.0340633,0.0870588,0.1233766,0.0693642,0.0486486,0.0670103,0.0901771,0.1329394,0.125163,
0.0892236,0.0382979,0.0379098,0.0394867,0.0379867,0.010979,0.0443439,0.0441941,0.046473,
0.0610626,0.0306428,0.0290065,0.0274841,0.026749,0.0253841,0.0332248,0.017024,0.016119,
0.0268456,0.0338681,0.0155172,0.0237691,0.0187949,0.0325556,0.0341566,0.0254065,0.0408127,
0.0009141,0.0272133,0.0149572)
 
GOLD = c(0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.447002860,0.079661828,
0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,-0.014388737,0.028573372,0.000000000,
0.027779564,-0.006872879,0.027212564,0.026491615,0.117056555,-0.023530497,-0.036367644,
-0.006191970,-0.006230550,-0.033039854,-0.086306904,-0.007067167,-0.002840911,0.001421464,
0.001419447,0.000000000,0.000000000,0.034846731,-0.027779564,-0.004234304,-0.002832863,
0.002832863,0.004234304,-0.002820876,0.002820876,0.203228242,-0.059188871,-0.052577816,
0.136739608,0.358646094,0.511577221,0.545727802,-0.132280611,-0.253090628,0.168898536,
0.265477915,0.464157559,0.689884535,-0.285505793,-0.201637346,0.120144312,-0.163629424,
-0.127202258,0.149181164,0.192236014,-0.020385757,-0.134512586,0.005221944,-0.058998341,
-0.051002554,0.045462374,0.064538521,0.002600782,0.010336009,-0.155436854,-0.121167134,
-0.052185753,0.000000000,-0.028987537,0.133990846,0.157360955,0.119003292,0.084161792,
0.308209839,0.142551544,0.220855221,0.110501915,0.228258652)
 
# truncate here, e.g.
# 1928 - 2010 - 83 years
# 1946 - 2010 - 65 years
# lop off first 18 years
# SP500=SP500[19:83]
# BILLS=BILLS[19:83]
# BONDS=BONDS[19:83]
# GOLD=GOLD[19:83]
# CPI=CPI[19:83]
 
# 1972 - 2010 - 39 years
# 1982 - 2010 - 29 years
 
# put into a data frame (matrix)
fnominal=data.frame(stocks=SP500, bills=BILLS, bonds=BONDS, gold=GOLD, CPI=CPI)
freal=data.frame(stocks=SP500-CPI, bills=BILLS-CPI, bonds=BONDS-CPI, gold=GOLD-CPI)
 
# compute real returns
realreturns = apply(freal, 2, mean)
realreturnspct = realreturns*100
# print them
realreturnspct
 
# compute real volatility (standard deviation of real returns)
realsds = apply(freal, 2, sd)
realsdspct = realsds*100
# print them
realsdspct
 
maxret <- runlp(freal)
minvol <- runqp(freal,0)
 
# generate a sequence of 50 evenly spaced returns between min var return and max return
efrontier = loopqp(minvol, maxret, 50)
 
apoints <- data.frame(realsdspct)
apoints$returns <- realreturnspct
names(apoints) = c("Risk", "Return")
 
png(filename="/temp/ltg11.png", width=300, height=225, units="px")
plot_efrontier(efrontier, realreturnspct, realsdspct, apoints)
dev.off()
 
keep=c("Risk", "%Stocks","%Bills","%Bonds","%Gold")
png(filename="/temp/ltg12.png", width=300, height=225, units="px")
plot_transitionmap(efrontier[keep], realreturnspct, realsdspct)
dev.off()

Portfolio Optimization and Efficient Frontiers in R

If you want to frustrate someone for a day, give them a program. If you want to frustrate them for a lifetime, teach them how to program.

A brief overview of how to use R to generate the analysis and plots in the most recent post, Gold as Part of a Long-Run Asset Allocation, using R, and code shared at Systematic Investor.
(more…)

Gold as Part of a Long-Run Asset Allocation

What does an efficient long-run portfolio look like for major US asset classes, and where does gold fit in?

Let’s take US annual stock, bond, T-bill, and gold returns for 1928-2010, and subtract CPI inflation to get real returns.

  Real Return   Real Risk
Stocks   8.1%   20.1%
Bonds   2.1%   9.1%
Bills   0.5%   4.1%
Gold   1.7%   15.8%

 

Let’s plot an efficient frontier. This shows the highest return you could achieve with those four assets over those 83 years at different levels of risk.

Efficient Frontier

  Real Return   Real Risk
4% real return portfolio
(34% stocks, 44% bonds, 22% gold)
  4.1%   8.4%
5% real return portfolio
(49% stocks, 32% bonds, 19% gold)
  5.0%   10.7%

 

Let’s plot a transition map. As you move from low risk to high risk left to right, it shows you the composition of the best-performing portfolio at that risk level, how much would be in each asset.

Transition Map

What does this tell us?

  • For minimum real return risk, the best portfolio was mostly cash (bills), with a small amount of gold (and a smidgeon of stocks). This would have given a modest real return of 0.8%.
  • For maximum real return, stocks were big winners.
  • Gold had a modest real return in this period, which ended in 2010 with gold at 1225. In real terms gold performed better than bills and just behind bonds, and added value as a modest fraction of most optimal portfolios. Gold’s volatility was high, and is also understated since its price was pegged for more than half of this period (and Americans couldn’t legally hold it).
  • TIPS only became available recently, so there isn’t enough history for this analysis, and they also have their place. (But with rates at and sometimes below zero, CPI basis risk, fees, taxes, they will only shine if there is inflation.)

While returns are adjusted for CPI inflation, they don’t reflect fees and taxes.

The analysis is based on this post at Systematic Investor, and the gold mine of R code generously shared there. Will post more technical details, code, and some drill down analysis in coming days/weeks.

 

Over-The-Top Speculations

Case study #1. Megatrends: migration from wired to mobile unwired; broadcast & circuit switched to packet-switched Internet.

Verizon cut a blockbuster deal with Time Warner Cable and Comcast, essentially sacrificing the declining fixed-line residential business to try to gain a big edge in mobile.

  • Verizon bought out the spectrum the cable companies had warehoused to compete in wireless.
  • The cable companies agreed to resell Verizon Wireless as part of quadruple play TV, Internet, phone and cellular deals.
  • Verizon unceremoniously dumped its partnerships with DirecTV, which it used to compete with cable quadruple plays in areas where it didn’t have a TV offering.
  • Verizon stated they will not ramp up FiOS beyond its 18m-customer current buildout

Why did they strike a truce?

  • Verizon loses the massive capital drain of FiOS rollout
  • The high cost of the rollout, coupled with commoditization of Internet connectivity, increasing competition from over-the-top-services like Netflix may mean cable TV will not be as attractive as it was.
  • Verizon may gain a significant advantage in mobile network footprint. Their biggest competitor, AT&T, has a slightly older technology (3.5G GSM), a perceived network disadvantage with coverage/speed/dropped calls, and was just dealt a stinging defeat in the T-Mobile bid. T-Mobile and Sprint look increasingly like also-rans.

If it goes as planned, Verizon could be in an emerging duopoly with AT&T in mobile, with a network edge in footprint, bandwidth, and LTE 4G technology, and a distribution edge through the cable tie-up.

Case study #2. Megatrends: PC and client/server migration to tablet/mobile device/cloud.

In the future, we are going to do everything on mobile devices like tablets: communicate, read books, listen to music, watch movies, run productivity apps.

Who do you like in this world?

  • Apple is killing it. Apple’s edge is complex technology that is not just easy to use, but delights the wealthy, hip, tech-savvy, and those who aspire to be. But their control, and ability to extract all the profits, leads to no small degree of fear and loathing from carriers and business partners. Their moat is the brand connection with consumers, seeming ability to constantly raise the bar, significant technological lock-in through the App Store and network effects.
  • Google’s DNA is to digitize the world’s information, get a vig for access to information and consumers. They could ill afford to stand by and let Apple lock up the platform and charge Google a tax on every search. Android is catching up to Apple’s iOS. A Samsung Galaxy 2 is, for the first time, ahead in some areas (size/weight/screen, geeky features) and behind in others (Siri voice recognition, tablet form factor, number of apps, overall slickness and emotional connection, carrier crippleware). Google is activating more devices than Apple, especially in emerging markets. Google’s moat is the incredible amount of information they have, particularly about their users; incredible infrastructure; relationships with the advertising community.
  • Amazon’s DNA is the retail SaaS platform. They are trying to extend it into a media platform, with a big success in ebooks, more limited success in music and video. (Also stunning success in the cloud IaaS, PaaS space.) The Kindle Fire is, so far, looking like a defensive play to prevent Apple’s dominance (and margins) getting out of hand, and allowing them to seize the ebook space. The initial Fire doesn’t seem up to the task of a successful broad-front offensive in tablets and phones. Amazon is a dark horse, currently playing in a narrow-moat, low-margin ghetto, and trying to leverage ebooks, infrastructure, and consumer relationships to jump to the big time.

So you have a battle for the post-desktop (the lap?). Three different strategies, and three different business models. Apple makes money the old-fashioned way, by selling high-margin hardware, with an assist from media and software through iTunes. Google gives an incredible mobile/cloud platform to hardware manufacturers for free and sells access to the users. Amazon wants to own media distribution and retail on the device. They are basically a software as a service platform for retail and media distribution (and any online business through the cloud platform).

It’s far easier to see a 20-something without a landline and cable TV and PC, than without a mobile device. YouTube and Netflix are available over Internet, live sports are the only exclusive broadcast offering, and Internet sports packages seem like a foregone conclusion (e.g. Apple’s rumored-but-denied bid for Premier League).

  • Google and Apple: well positioned.
  • Amazon, Facebook: dark horses, not necessarily cheap.
  • Microsoft – profitable has-been. No company that dominated one computing paradigm has been able to dominate the next one.
  • Intel: chips power the cloud servers, but lost the mobile client to ARM, which is a year or two away from possibly disrupting servers.
  • Cisco: interesting value, possibly lumped in with large-cap declining franchises. Yet mobile/cloud still needs network infrastructure and they have catalysts like VoIP, video, IPv6, etc.
  • Do not like: second-tier cable content networks that aren’t going to have success in view-on-demand and depend on cable per-subscriber fees.

It will be interesting to see what Apple has up its sleeve with iTV, and if one of these platform companies makes a strong play for Netflix, which seems wedged between strong upstream content providers and downstream cable networks, that both wish it would die.

Tech winds of change shift. Unfurl the sails, and try ride them to blue ocean, uncontested market space.

2012: Toilet bowl or takeoff?

Some drive-by thoughts on Europe:

While the LTRO takeup was larger than anticipated, the consensus seems to be the new ECB funding largely replaces old ECB funding, bank deposits that are fleeing, interbank credit and money market funding that has dried up.

To the extent it signals the ECB will do everything necessary to prevent a bank failure, and potentially takes a Lehman scenario off the table for now, it is a positive development.

It’s the turning point in the crisis, only if it’s a signal that the Great Pumpkin is coming next year in the form of more QE, orderly equity raises for the solvent banks, bailouts/mergers of the insolvent ones, and above all, resumption of economic growth.
(more…)

Once Again, Britain stands alone

Two differing views on UK and the EC.
(more…)

Unstoppable Forces, part deux

BERLIN, GERMANY - JUNE 17:  In this photo prov...

Image by Getty Images via @daylife

A followup to the most recent post following the latest solution from Merkozy.
(more…)

Unstoppable Forces vs. Immovable Objects

Titanic (1943 film)

Image via Wikipedia

Europe is heading into yet another moment of truth this week, with a Merkozy summit and a new plan, an ECB meeting and likely interest rate cut, and a full EU summit starting Friday.
(more…)

Why only millionaires should play Powerball

ROCKY HILL, Conn. – Three asset managers from Connecticut’s affluent New York suburbs claimed a $254 million Powerball jackpot on Monday off a $1 ticket.

The Lotto Powerball logo

Image via Wikipedia

Lottery tickets are generally a terrible deal in terms of expected value – the lottery pays out far less in winnings than it receives in ticket sales. It has to pay expenses and show a profit. Then the winner has to pay a big income tax bill.

But occasionally, after no one wins the big prize several drawings in a row, the jackpot gets so big that the expected value is positive.

You might think that’s a good time to buy a ticket. Actually, it turns out that’s still a losing strategy.

What’s the right amount to bet on a risky, but profitable proposition?
(more…)

Margin Call – A Big Sell Out

Watched Margin Call last night on iTunes and woke up cranky. Here is a short list of things that it gets wrong about Wall Street. (more…)

When people are free to do as they please, they usually imitate each other.

27 queries in 1.121 seconds.