Friday, December 5, 2014

HK property return forecast - Heya Delight

Regression analysis shows that there's a strong relationship (R^2 = -0.81) between annualized cumulative real return of HK property (40 months ahead) and the difference between US 10-year treasury yield and property rental yield.  Basically, the more rental yield exceeds US 10-year treasury yield, a better buy a property is.

The regression result aligns with general investment valuation; as generated cash flows exceed risk-free rate further, valuation goes up.

Let's use a new development project, Heya Delight, as an example to see how the difference changes as the rent per sq. ft. changes:

 

US has been rumored to increase interest rate for quite a while, but it's been delayed and delayed again.  Let's assume interest rate remains relatively stable in the next 40 months.

The rent per square foot around the area of comparable quality gets as high as $35 / sq ft per month.  Each line above shows different rental income.

It looks like a very good buy for the unit with the lowest price per sq ft at $9,790. Even for the unit with the highest price per sq ft, it's still okay if you can get a high enough rent.

I guess many people share the same views.  (Well, it doesn't hurt to price the unit at "up to 40 per cent lower than a nearby project.") There are 130 units available for that project with more than 4000 applications submitted for ballot.

Unluckily for me, I didn't get a good draw...  I'm 3374th person out of 4127 to get to pick an unit.  (-_-")

Saturday, November 22, 2014

1+2+3+4+5+6+...= -1/12 ?!!!

1 + 2 + 3 + 4 + 5 + 6 + ... = ?
gotta be infinity, right?

let
S = 1 + 2 + 3 + 4 + 5 + 6 + ...
S1 = 1 - 1 + 1 - 1 + 1 - 1 + ...
S2 = 1 - 2 + 3 - 4 + 5 - 6 + ...

add S1 to S1:
S1 *2 = 1 - 1 + 1 - 1 + 1 - 1 + ...
         + 1 - 1 + 1 - 1 + 1 - 1 + ...
= 1
so, S1 = 1/2


add S2 to S2:
S2 *2 = 1 - 2 + 3 - 4 + 5 - 6 + ...
         + 1 - 2 + 3 - 4 + 5 - 6 + ...
= 1 - 1 + 1 - 1 + 1 - 1 + ...
= S1
= 1/2
so, S2 = 1/4

subtract S2 from S
S - S2 = 1 + 2 + 3 + 4 + 5 + 6 + ...
-[1 - 2 + 3 - 4 + 5 - 6 + ...]
= 0 + 4 + 0 + 8 + 0 + 12 + ...
= 4 *(1 + 2 + 3 + 4 + 5 + 6 + ...)
= 4 * S
S - 1/4 = 4 * S
-1/4 = 3S

so, S = -1/12

this is nuts...

Here are the professors explaining it:

Monday, September 1, 2014

R 3D plot

suppressMessages(library("plot3D"))

xSeq <- seq(range(df$xSeq)[1], range(df$xSeq)[2], length.out = 30)
ySeq <- seq(range(df$ySeq)[1], range(df$ySeq)[2], length.out = 30)
## persp requires a matrix for z
zSeq <- outer(xSeq, ySeq, function(a,b) predict(glm.fit, newdata=data.frame(xSeq=a, ySeq=b), type="response"))

persp(x=xSeq, y=ySeq, z=zSeq, ticktype="detailed", theta=40, phi=15)
persp(x=xSeq, y=ySeq, z=zSeq, ticktype="detailed", theta=0, phi=0)
persp(x=xSeq, y=ySeq, z=zSeq, ticktype="detailed", theta=90, phi=0)

see http://pj.freefaculty.org/guides/Rcourse/plot-3d/plots-3d.pdf for details.

Wednesday, August 20, 2014

R: what is the column type?

str(d)
## 'data.frame':    5922 obs. of  610 variables:
##  $ Timestamp            : POSIXt, format: "2010-01-04 17:30:00" "2010-01-04 17:35:00" ...
##  $ Variable142OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable142HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable142LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable142LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable143OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable143HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable143LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable143LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable144OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable144HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable144LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable144LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable145OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable145HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable145LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable145LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable146OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable146HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable146LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable146LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable147OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable147HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable147LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable147LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable148OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable148HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable148LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable148LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable149OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable149HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable149LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable149LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable150OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable150HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable150LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable150LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable151OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable151HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable151LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable151LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable152OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable152HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable152LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable152LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable153OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable153HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable153LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable153LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable154OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable154HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable154LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable154LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable155OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable155HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable155LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable155LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable156OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable156HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable156LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable156LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable157OPEN      : num  5.6 5.53 5.52 5.48 5.39 ...
##  $ Variable157HIGH      : num  5.6 5.55 5.52 5.48 5.42 ...
##  $ Variable157LOW       : num  5.53 5.51 5.46 5.39 5.39 ...
##  $ Variable157LAST      : num  5.53 5.52 5.48 5.39 5.42 ...
##  $ Variable158OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable158HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable158LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable158LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable159OPEN      : num  289 290 290 290 290 ...
##  $ Variable159HIGH      : num  290 290 290 290 290 ...
##  $ Variable159LOW       : num  289 290 290 290 289 ...
##  $ Variable159LAST      : num  290 290 290 290 290 ...
##  $ Variable160OPEN      : num  289 290 290 290 290 ...
##  $ Variable160HIGH      : num  290 290 290 290 290 ...
##  $ Variable160LOW       : num  289 290 290 290 289 ...
##  $ Variable160LAST      : num  290 290 290 290 290 ...
##  $ Variable161OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable161HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable161LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable161LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable162OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable162HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable162LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable162LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable163OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable163HIGH      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable163LOW       : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable163LAST      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ Variable164OPEN      : num  9.56 9.48 9.5 9.54 9.54 ...
##  $ Variable164HIGH      : num  9.57 9.5 9.54 9.55 9.54 ...
##  $ Variable164LOW       : num  9.46 9.48 9.5 9.53 9.51 ...
##  $ Variable164LAST      : num  9.48 9.5 9.54 9.54 9.52 ...
##  $ Variable165OPEN      : num  9.98 10.02 10.02 9.98 10.04 ...
##  $ Variable165HIGH      : num  10.1 10.1 10 10 10 ...
##  $ Variable165LOW       : num  9.97 9.99 9.98 9.98 10.01 ...
##  $ Variable165LAST      : num  10.02 10.02 9.98 10.04 10.02 ...
##  $ TargetVariable       : logi  TRUE TRUE TRUE TRUE FALSE TRUE ...
##  $ Variable167OPEN      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
##   [list output truncated]

Monday, August 4, 2014

kdb ipc - set remote variable = value of local variable

// opening conn
h: hopen `::5000

// assigning a fixed value to a remote variable is easy
h "rv:10"

// local variable = 12
lv:12

// assigning rv = lv is tricky and needs
h ({rv::x};lv)

Sunday, August 3, 2014

kdb: how to select the max of 2 columns

with sql, we just simply

select max(col1, col2) from t

with kdb, we will need to something like:

q)select [5] from t
time         sym  bid   ask  
-----------------------------
09:30:00.386 IBM  50.12 51.69
09:30:00.754 IBM  50.69 51.02
09:30:00.871 AAPL 50.2  51.4 
09:30:01.548 AAPL 50.84 51.28
09:30:01.921 GOOG 50    51.82
q)select [5] from update greater:max each flip (bid; ask) from t
time         sym  bid   ask   greater
-------------------------------------
09:30:00.386 IBM  50.12 51.69 51.69  
09:30:00.754 IBM  50.69 51.02 51.02  
09:30:00.871 AAPL 50.2  51.4  51.4   
09:30:01.548 AAPL 50.84 51.28 51.28  
09:30:01.921 GOOG 50    51.82 51.82