Total Pageviews

2018/12/02

[閱讀筆記] The Four Pillars of Investing (12/12)


  1. 股票的長期報酬未必會比債券的長期報酬高出多少,在這個狀況下,我並不建議全部投資股票的組合方式。一般來說,八成投資股票已是合理上限
  2. 投資菜鳥最常犯的典型錯誤就是,高估自己的風險承受能力,所以當遭遇自己預期以外的損失時,就連忙認賠殺出,然後永遠不再涉足股市
  3. 如果在股票上的慘重損失,是因為股票整體市場出現重大變化的話,其實沒有什麼關係。不要害怕投入,當這類事情發生時,也不要喪氣,因為這是你在追求豐厚報酬時無法避免的狀況
  4. 若你服務的是一家「價值型公司」(value company),當經濟惡化時,價值型公司也會不堪一擊,正如價值型股票一樣。所以,此時在規劃投資組合時,就不應該投資太多價值型股票,因為當經濟景氣驟降時,你可能同時會失去工作,也失去了投資組合的支持。同樣的,如果你在高科技公司服務,投資組合中還規劃了許多成長型股票的話,就再笨也不過了
  5. 設計投資組合的基礎是基於「長期投資」,而非緊急之用、大學學費或購屋所需。我的意思不是說穩當的資產配置無法應付這些需求,而是應付這些支出並費投資組合的首要目的
  6. 將債券想像成是景氣惡劣時的生活費來源,而股票則是用來提供景氣暢旺時的奢侈享受
  7. 若你屬於已習慣市場的起落,且熟悉市場與自己的風險承受能力,你自己規劃的股票 / 債券投資比將和現在持有的股票 / 債券投資比大致相近。你唯一要做的是,將自己的投資轉換成以指數為主的投資計畫
  8. 傳統上,投資者習慣以「平均成本投資法」(Dollar Cost Averaging, DCA)來累積股票資產,操作方式是每隔一段時間就在特定的股票或債券投入固定的金額。透過神奇的財務數學計算後可得知,運用「平均成本投資法」(Dollar Cost Averaging, DCA)將能得到最低的取得成本
  9. 千萬別小看執行「平均成本投資法」(Dollar Cost Averaging, DCA)所需要的毅力,「平均成本投資法」(Dollar Cost Averaging, DCA)一樣帶有風險,連續買進期間可能正逢股市暢旺時節,緊接著就會慘跌,這些都是投資股票必然遭遇的不確定性之一
  10. 「價值平均法」(value averaging)則是強調,投資者在低點時多買,價格偏高時少買,因而創造較高的報酬。與「平均成本投資法」不同的是,「價值平均法」強迫投資人再市場底部大量投資,可以將其視為「平均成本投資法」與再平衡並重的混合體,但是對於繁忙的上班族,「平均成本投資法」會是較簡單的投資策略
  11. 研究結果顯示,過去表現最亮麗的資產,未來會變成績效最差的資產;反之,過去最被看衰的投資,也會有幾年的好光景
  12. 整體而言,當景氣好轉時,你必須賣掉股票,但當景氣不佳時,你就必須賣掉債券,這就是左右逢源的心理學
  13. 想要知道股市的長期報酬,只要將「每股盈餘的長期成長率」加上「股利殖利率」,就可輕鬆得知,如每股盈餘成長率 5%,殖利率 3%,長期報酬約 8%。高等級債券的長期報酬在本質上必等同於股利殖利率,因為息票利率不會成長
  14. 想要透過選股技術與市場時機點投資,都是種極度高成本、高風險,以及極不可靠的作法。想要駕馭市場,就只能擁有所有股票,也就是說,投資指數
  15. 當烏雲罩頂,幾乎連天空都沈重地要跌落下來時,這時通常就是買進的好時機
  16. 投資時,最大的敵人其實就是自己,因為你往往會太信任自己的選股能力,以及挑選基金經理人的眼光,但其實這些已超過你的實際能力所及
  17. 真正成功的投資必定是個極為孤獨的行動,試著不要理會五年到十年內的投資報酬記錄,應該著眼於更長的期限,越久越好
  18. 各種資產類型的報酬全然隨機,表面上看起來像是重複出現的形態,其實未來絕不可能重複出現
  19. 積極型經理人不可能永遠維持原本的優異績效,因為所有專業投資人加起來就代表市場。所以,整體而言,他們獲得的報酬率,勢必等於市場投報酬率「減去費用」,但是這些經理人的投報率常遜於市場報酬,你還要支付「管理費用」給他們
  20. 資本市場擁有一個財富重分配的機制,擁有策略且格遵策略的人,將分走沒有策略且無法嚴格遵守策略者的財富。抱持合理期望,發展適合自己的策略,同時堅持到底,你就會是那個分走他人財富的人

2018/12/01

[閱讀筆記] Thinking, Fast and Slow (9/9)


  1. 如何 reframe problem 呢?其實就是改變 reference point (參考點)。假設我們沒有擁有它,你認為它目前值多少錢?如同前述的電影票的問題,先假設你原先沒有持有電影票,換個 reference point (參考點) 思考,『若你遺失了 500 元,你是否還會願意花 500 元買電影票?』將損失歸類於 general revenue (綜合收入) ,你的感受會好一些
  2. 人其實是活在記憶中,而非活在當下,而記憶往往是偏誤與扭曲的。記憶本身沒有聲音,記憶有時候是錯的,但是它卻會無聲無息的影響你的決策
  3. 峰值—終點規則(Peak- End Rule)這條定律基於我們潛意識總結體驗的特點:我們對一項事物的體驗之後,所能記住的就只是在感受最強烈的瞬間 (peak, 峰值) 和終點瞬間的感受 (end, 終點),而在過程中好與不好體驗的比重、好與不好體驗的時間長短,對記憶差不多沒有影響 (duration neglect, 對持續時間的忽略)。消費者傾向以消費過程中的高峰及結束前經驗來評斷整個過程。因此,若能設計或規畫良好的消費結束前經驗將有助於提升整體服務的滿意度
  4. 人類印象中對於某一經歷的體驗感受不等同於從中感受到的好的與壞的體驗之和;相反,它取決於一些關鍵瞬間的體驗感受,並且接近於忽略其他的瞬間。體驗感受是一個趨勢流(Stream),而記憶是一個印象(Snapshot)的集合
  5. 人類都會有兩個自我:一個是「感受的自我」(experiencing self),另一個是「記憶的自我」(remembering self)。這兩個自我在認知事物上存在著不同甚至是衝突。一方面,「感受的自我」會問自己「我此刻感受怎麼樣?」,同時體驗感受事件的每一個瞬間,獲得愉悅、無聊、焦躁和恐懼等體驗;另一方面,「記憶的自我」會詢問「我當時總體感覺如何?」它會通過回憶一些關鍵點獲得的感受(峰值和終點),忽視其他瞬間感受,以此總結事件帶給自己的體驗。然而最終,「記憶的自我」占了上風,因為它決定了我們能從體驗感受中獲得什麼。它決定了我們怎樣描述獲得的體驗感受,並指示了我們之後的行為
  6. 一位哀傷的失婚者,腦袋想著的都是自己失敗的婚姻,這全然是受到「記憶自我」(remembering selves) 的影響,事實上是,儘管最後的結果是不好的,不代表這段婚姻中全部都是不好的
  7. 這裡有個 duration neglect (對持續時間的忽略) 的 bad case,在你的經驗中會有好的部分,也有壞的部分,儘管好的部分持續的時間比壞的部分多了十倍之久,但是在你心中的權重兩者確是相等的,不會有十倍的差異
  8. 金錢能帶來幸福嗎? 根據研究顯示,貧窮會帶來痛苦,富有可以強化一個人的生活滿意度,但是無法改善你是否感到幸福的感受。高收入者反而會降低其享受生活中小趣味的能力
  9. 增加幸福快樂的最簡單的方法就是控制你的時間運用。你是否能夠找到更多的時間去做你想做的事情
  10. 收入的提升,可以提高你對生活的滿意度,也讓你有能力去購買昂貴且更享受的體驗,但你也會失去享受較平價、一般的體驗的能力
  11. focusing illusion:注意力集中在特定少數的訊息,卻忽略了重要訊息沒有關注。當人面對變項、變因很多而無法判斷時,採用具有代表性的『代理變項』來做判斷。例如收入會影響人們在生活的滿意度,但是其不是決定是否感受到幸福的決定因素,當你在思考窮人與富人的幸福感受時,無可避免的你會想到收入的差異,但是除了收入以外,還有很多其他的因素會影響到人們對幸福的感受。
  12. 肢體殘障者不會永遠都不開心,因為他們會把時間去思考其他事情,不會永遠在想行動不便的事情。當我們在想像肢障者、視障者、樂透得主時,很容易被一些顯而易見的人事物而吸引,自然而然將注意力都放在這些上面,造成 focusing illusion
  13. 人很容易被不相干的事情所影響,當某人上班時候車子拋錨了,他的心情一定不好,這就不是個好時機來對他做工作滿意度調查
  14. 人對於做一件事情或決策後,其未來的情感反應的預測精確度很低。人們常會高估未來事件對於我們情緒反應所造成的衝擊。當某人想著若買了一台新車可以讓他變更快樂、幸福,這就是犯下了 affective forecasting error,你以為擁有新車會更快樂、幸福,其實並沒有。 affective forecasting error 常發生於我們是否要結婚?是否要生小孩?是否要把老師或音樂家當成未來的職志?
  15. 當你購買一台新車與定期參加朋友聚會(如讀書會等),在剛開始的時候你都會感到新奇與興奮。兩者不同的是,你會逐漸降低對你的新車的注意力,但是你還是會依約繼續去參加朋友聚會。你很可能會誇大新車帶來的長期效益,但是你在參加朋友聚會時則不會犯相同錯誤,這就是 focusing illustration 。focusing illustration 會因為你對商品的喜好產生偏誤(bias),一開始你會感受到對商品的興奮,即便最終你對其失去興趣,這是因為你忽略時間的因素
  16. Focusing illusion 會讓你將注意力專注於內心選定的時光,卻忽略了其他時間所發生的事情。例如買了一間較大的房子,長期來說可能不會讓你更快樂,但我們可能因為 focusing illusion 而造成誤判
  17. 「記憶的自我」(remembering self) 是由 System 2 建構的,peak-end rule 與 duration neglect 則是源自於 System 1,所以兩者得到不同的選擇或答案,其實是不意外的。
  18. peak-end rule 與 duration neglect 兩者混合起來,常會讓人產生喜好的偏誤,只因最終結束前擁有短期的歡愉而讓人們寧願選擇較長時間的痛苦,如 cold-hand experiment,即便是整個過程中感受是美好的,但是最終感受是不好的,此選項在下次選擇時,就會被人們所剔除。duration neglect 會讓你誇大 peaks and ends,反而搞混了你真實的體驗
  19. 一個人是否理性 (rationality) 不在於其信仰或喜好是否合理,而是其邏輯是否一致。在過去,經濟學認為人是理性的,這是一個錯誤的假設,人會受到各種影響,讓他的信仰與喜好在各種情況下不一致,如 WYSIATI、narrow framing、inside view 或 preference reversal 等等
  20. 對行為經濟學家來說,自由是有成本的,其必須忍受個人做出錯誤的決定,社會還要有義務協助他們
  21. 你知道為什麼當手頭股票的股價不可抑止地滑向深淵時我們卻一邊揪著頭髮,一邊愣是不肯撤出嗎?(是的,我們適應遠古時代的心理機制根本不適應金融市場。)為什麼我們會在小攤和超市前為幾塊錢的交易躊躇半天,卻在生活中的重大決策面前渾渾噩噩人云亦云呢?糟糕的判斷與決策令我們的生活變得糟糕,然而這還不是最關鍵的,最關鍵的是我們很難學會質疑自己的判斷,而總是能“找到”其他為自己辯護的理由
  22. 人類的思維充滿著各種各樣的捷徑,每一條捷徑都是一把雙刃劍。一方面,它降低了大腦的認知複雜性(籠統的看一個問題要比細緻的分析簡單得多),有助於迅速做出絕大部分時候都正確的判斷;但另一方面,它也常常導致人們把大部分情況下成立的法則當成了放之四海而皆準的。可以說,有多少捷徑,就有多少條謬誤。
  23. 人類的情緒也在很大程度上影響著人的思考。比如,如果你憎惡一個人,你往往就會反對他的所有立場,反之亦成立
  24. System 1 的確是我們做錯誤的源頭,但是也是大部分我們做對的源頭。我們的想法與行為都一直受到 System 1 的導引
  25. 很少人能用意志力使他們有陽光的個性,但是有些人可以安排他們的生活,使自己不必花那麼多時間在通勤上,所省下來的時間可以做他們喜歡的事,跟他們喜歡的人在一起
  26. 有些生活的層面比生活的經驗對評估一個人的生活更有影響力,教育就是一個例子。高教育程度常跟生活的高滿意度聯結在一起,但是高教育程度並沒有跟高幸福感的經驗連在一起,更高的教育通常有更多的壓力。
  27. 當人遇到一些較困難的問題時, System 1 會很自然地將其替換成較簡單的問題,並產生直覺、快速、簡單的答案,藉此達到 cognitive ease 的效果,有時候產生的答案可能近乎正確,但也有可能大錯特錯。且當此直覺的答案不可靠時, System 1 並不會給你任何的警告訊號
  28. 由於 System 1 很容易造成我們做出錯誤的判斷與決策,我們如何去避免 bias 呢? 那就是多費點心思做思考,不要太快用直覺來做決策。如想想這個數字是不是 anchor?如果此問題被 reframe,決策是否會改變等等?
  29. 所謂『快思』 (System 1) 就是直覺式思考,是大腦根據過往的經驗,在短時間內對一件事情做出反應;而『慢想』 (System 2) 就是邏輯思考,通常需要較長的時間來推敲事情的前因後果,一個合理的邏輯推論往往也需要花較多的時間,兩者並沒有絕對的優劣。直覺式思考 (System 1) 可以在短期內得到反應、搶得先機,為缺點容易忽略隱藏在背後的細節;反之,邏輯式思考 (System 2) 能使每件事情都有合理的因果關係,但需要有足夠的資訊與時間才能做決定,兩者看似對立,但實際上必須兩者一起搭配使用,才能使我們的決策思考快速又合理



Thinking, Fast and SlowThinking, Fast and Slow by Daniel Kahneman
My rating: 5 of 5 stars



View all my reviews

2018/11/30

[Travel] 201811 Tokyo

大本山 増上寺
DSC04000

DSC04010

高尾山
DSC04025

DSC04041

DSC04062

DSC04069

DSC04075





2018/11/29

[Travel] 201811 Tokyo

六本木
DSC03921

DSC03930

六義園
DSC03939

DSC03953

銀座
DSC03978

DSC03992

2018/11/28

[Travel] 201811 Tokyo

東京大學
DSC03841

DSC03848

DSC03884

東京車站
DSC03889

DSC03903

DSC03906



2018/11/27

[Travel] 201811 Tokyo

忍野八海
DSC03743

DSC03758

河口湖紅葉迴廊
DSC03778

DSC03789

河口湖
DSC03794

DSC03806

2018/11/26

[Travel] 201811 Tokyo

明治神宮
DSC03680

DSC03686

DSC03694

DSC03708

DSC03719

御殿場 Outlet
DSC03726



2018/11/15

[Java 8] How to do Base64 Encoding and Decoding?

Example

package com.example.demo.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Base64;

public class FileUtils {

    public static String encodeToBase64String(File file) throws IOException {
        String base64Image = "";
        try (FileInputStream imageInFile = new FileInputStream(file)) {
            byte imageData[] = new byte[(int) file.length()];
            imageInFile.read(imageData);
            base64Image = Base64.getEncoder().encodeToString(imageData);
        } catch (FileNotFoundException e) {
            throw new FileNotFoundException("Image not found");
        } catch (IOException e) {
            throw new IOException("Exception when reading image", e);
        }
        return base64Image;
    }

    public static void decodeToImage(String base64Image, String pathFile) throws IOException {
        try (FileOutputStream imageOutFile = new FileOutputStream(pathFile)) {
            byte[] imageByteArray = Base64.getDecoder().decode(base64Image);
            imageOutFile.write(imageByteArray);
        } catch (FileNotFoundException e) {
            throw new FileNotFoundException("Image not found");
        } catch (IOException e) {
            throw new IOException("Exception when reading image", e);
        }
    }

}


2018/11/14

[Java 8] Optional Example

Scenario


How-To
1. pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>albert</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>test</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

2. Create a Person class
package albert.test;

import lombok.Builder;
import lombok.Data;
import lombok.ToString;

@Data
@Builder
@ToString
public class Person {

    private Integer id;
    private String name;
    private String gender;
    
}

3. Create a custom exception
package albert.test;

public class PersonNotFoundException extends Exception {

    public PersonNotFoundException() {
        super();
    }

    public PersonNotFoundException(String message, Throwable cause, boolean enableSuppression,
            boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }

    public PersonNotFoundException(String message, Throwable cause) {
        super(message, cause);
    }

    public PersonNotFoundException(String message) {
        super(message);
    }

    public PersonNotFoundException(Throwable cause) {
        super(cause);
    }

}

4. Create a OptionalTest class
package albert.test;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class OptionalTest {

    private Person albert = Person.builder().id(1).name("Albert").gender("Male").build();
    private Person mandy = Person.builder().id(2).name("Mandy").gender("Female").build();
    private Person eric = Person.builder().id(3).name("Graham").gender("Male").build();
    private List<Person> people = Arrays.asList(albert, mandy, eric);

    public Person getByNameByOldWay(String name) throws PersonNotFoundException {
        Person result = null;
        for (Person p : people) {
            if (p.getName().equals(name)) {
                result = p;
                break;
            }
        }
        if (result == null) {
            throw new PersonNotFoundException("Cannot find " + name);
        }
        return result;
    }

    public Person getByNameOrElseThrow(String name) throws PersonNotFoundException {
        Optional<Person> person = people.stream().filter(p -> name.equals(p.getName())).findFirst();
        return person.isPresent() ? person.get()
                : person.orElseThrow(() -> new PersonNotFoundException("Cannot find " + name));
    }

}


Reference
[1] Optional in Java 8 cheat sheet

2018/11/13

[Spring Framework] @Scheduled Annotation in Spring

Scenario
If I have two batch services:
(1) execute a task every 5 minute, and execute 5 second delay before the first execution
(2) execute a task on 17:20 everyday 

How-To
Add dependency in your pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>


Create a scheduler service
package com.example.demo.service;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class SchedulerService {

    private final DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    /*
     * Schedule a Task with Initial Delay
     */
    @Scheduled(fixedRate = 300000, initialDelay = 5000)
    public void scheduleFixedRateTask() {
        System.out.println("Fixed rate task - " + formatter.format(new Date()));
    }

    /*
     * Schedule a Task using Cron Expressions
     */
    @Scheduled(cron = "0 20 17 * * ?")
    public void scheduleTaskUsingCronExpression() {
        System.out.println("scschedule Task Using Cron Expression - " + formatter.format(new Date()));
    }

}


Create a client application
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}


Execution Log:
2018-06-04 17:11:22.474  INFO 14272 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 0.686 seconds (JVM running for 1.268)
Fixed rate task - 2018-06-04 17:11:27.473
Fixed rate task - 2018-06-04 17:16:27.472
scschedule Task Using Cron Expression - 2018-06-04 17:20:00.002
Fixed rate task - 2018-06-04 17:21:27.473
Fixed rate task - 2018-06-04 17:26:27.472
Fixed rate task - 2018-06-04 17:31:27.472