Total Pageviews

2018/10/07

[Neo4j] Using Spring data to find nodes and its relationships

假設我要從下圖中,分別找出
(1) 大雄的朋友
(2) 大雄的父母
(3) 大雄的寵物,以及寵物的妹妹

架構規劃如下:

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>neo4j</groupId>
 <artifactId>springdata</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

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

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

 <dependencies>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-neo4j</artifactId>
      <version>2.0.0.RELEASE</version>
  </dependency>

  <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.18</version>
  </dependency>

  <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>23.0</version>
  </dependency>

  <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
  </dependency>
 </dependencies>

 <repositories>
  <repository>
      <id>spring-libs-release</id>
      <name>Spring Releases</name>
      <url>https://repo.spring.io/libs-release</url>
      <snapshots>
   <enabled>false</enabled>
       </snapshots>
  </repository>
 </repositories>
</project>


Value Object - Person
package neo4j.springdata.vo;

import java.util.ArrayList;
import java.util.List;

import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;

import lombok.Data;
import lombok.ToString;

@NodeEntity
@Data
@ToString
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private String gender;
    
    @Relationship(type = "FRIEND_OF")
    public List<Person> friends = new ArrayList<Person>();
    
}

Value Object - Robot
package neo4j.springdata.vo;

import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;

import lombok.Data;

@NodeEntity
@Data
public class Robot {
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    private String gender;
    
}

Value Object - PetQueryResult (查詢結果)
package neo4j.springdata.vo.result;

import org.springframework.data.neo4j.annotation.QueryResult;

import lombok.Data;
import lombok.ToString;
import neo4j.springdata.vo.Person;
import neo4j.springdata.vo.Robot;

@QueryResult
@Data
@ToString
public class PetQueryResult {

    private Person person;
    private Robot pet;
    private Robot petSister;

}

Repository class - PersonRepository
package neo4j.springdata.repository;

import java.util.List;

import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import neo4j.springdata.vo.Person;
import neo4j.springdata.vo.result.PetQueryResult;

@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {

    @Query("match(n) return n")
    List<Person> findAll();

    Person findByName(String name);

    @Query(" match(p:Person) where p.name={name} " +
           " optional match (p)-[:FRIEND_OF]->(p2) " + 
           " return p2")
    List<Person> findFriendsByName(@Param("name") String name);

    @Query(" match(p:Person) where p.name={name} " +
           " optional match (p)-[:FATHER_OF]-(p2) " +
           " return p2 " +
           " union " +
           " match(p:Person) where p.name={name} " +
           " optional match (p)-[:MOTHER_OF]-(p2) " +
           " return p2 ")
    List<Person> findParents(@Param("name") String name);
    
    @Query(" match(p:Person)-[:PET_OF]-(r:Robot)-[:SISTER_OF]-(r2) " +
           " where p.name={name} " +
           " return p as person, r as pet, r2 as petSister ")
    List<PetQueryResult> findPetsAndItsSister(@Param("name") String name);
    
}

Service class - PersonService
package neo4j.springdata.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import neo4j.springdata.repository.PersonRepository;
import neo4j.springdata.vo.Person;
import neo4j.springdata.vo.result.PetQueryResult;

@Service
public class PersonService {

    @Autowired
    private PersonRepository personRepo;

    public List<Person> findAll() {
        return personRepo.findAll();
    }

    public List<Person> findFriendsByName(String name) {
        return personRepo.findFriendsByName(name);
    }

    public List<Person> findParents(String name) {
        return personRepo.findParents(name);
    }

    public List<PetQueryResult> findPetsAndItsSister(String name) {
        return personRepo.findPetsAndItsSister(name);
    }

}

Client class - App
package neo4j.springdata;

import java.util.List;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;

import lombok.extern.slf4j.Slf4j;
import neo4j.springdata.service.PersonService;
import neo4j.springdata.vo.Person;
import neo4j.springdata.vo.Robot;
import neo4j.springdata.vo.result.PetQueryResult;

@SpringBootApplication
@EnableNeo4jRepositories
@Slf4j
public class App {

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

    @Bean
    CommandLineRunner findFriendsByName(PersonService service) {
        return args -> {
            log.info("find 大雄的朋友:");
            List<Person> friends = service.findFriendsByName("大雄");
            friends.forEach(p -> log.info(p.toString()));

            log.info("find 大雄的父母:");
            List<Person> parents = service.findParents("大雄");
            parents.forEach(p -> log.info(p.toString()));

            List<PetQueryResult> petQueryResult = service.findPetsAndItsSister("大雄");
            petQueryResult.forEach(p -> {
                Robot pet = p.getPet();
                Robot petSister = p.getPetSister();
                log.info("大雄的寵物是[" + pet.getName() + "], 寵物的妹妹是[" + petSister.getName() + "]");
            });
        };
    }

}


2018/10/06

[閱讀筆記] Value Investing: From Graham to Buffett and Beyond (1/7)


  1. Internet 的問世,造就很多 dot-com companies 的出現,很多樂觀的人士認為,Internet 的問世可以大幅提昇生產力,過去繁複的工作只需指尖點幾下滑鼠即可解決,公司預期會大賺錢。但是,生產力 (productivity) 不等於獲利 (profitability),決定公司股價的是 profitability 而非 productivity。以訂購機票為例,旅客可以透過 Internet 搜尋到價格較低的機票、更方便的路線與更多的里程積點獎勵。Internet 的出現反而導致航空公司間更激烈的價格競爭。Internet 同時是 productivity 的好朋友,卻是 profitability 的災難。身為 value investors,當你了解到 Internet 是產生更強烈的競爭時,你就該避免 Internet 風潮相關的公司
  2. 投資人最佳的策略就是買進指數型證券 (index securities),根據你能承受的風險程度,調整你的投資組合,看是要放較多的現金在指數型投資組合 (index portfolio),或者是零風險 (risk-free) 的組合 (ex. cash)
  3. 金融市場的三個主要特性
價格波動無法預測
金融證券的價格易受大幅與反覆無常的波動,也容易受到各種無法預測的情緒影響
價值與價格不相等
證券的真實價值 (intrinsic value) 是一件事,現價 (current price) 則是另外一件事,兩者之間常出現分歧
安全邊際才能獲利
當證券的市場價格遠低於其真實價值時,才是好的買進策略,長期來說會獲得高於平均的報酬。真實價值與現價之間的 gap 稱之為安全邊際 (margin of safety)。理想來說,這個 gap 最好要 1/2,最低不要低於 1/3Graham 認為用 50 cents 去買 1 dollar 的證券,最終會獲得巨大的回報

  1. Value investor 的證券選擇過程 
  2. 證券交易是一場零和遊戲 (zero-sum game)。每個買家就會對應一個賣家,未來就會證明誰犯錯。
  3. 大約有 70% 的主動行投資專家的績效,會輸給採用低成本的策略購買指數型證券的被動投資者
  4. 70% 的主動投資專家的績效會輸給整體市場績效,能夠贏過市場績效 3 ~ 5 % 的人更是屈指可數
  5. Value investing 你需要:
Limits of your competence
了解你的能力限制,別過度自信
Patience
耐心等候 Mr. Market 提供划算的價格給你。Warren Buffett 曾這樣比喻投資,投資不會因為不揮棒而被三振,你應仔細盯著每一顆球,直到看到喜歡的球再揮棒,你才能提高成功率

  1. 在股票市場中,唯一能讓您被三振出局的是,不斷的搶高殺低、耗損資金
  2. 無論是個別或是機構的投資人,常會有系統性偏誤 (systematic biases),過度重視贏家 (擁有極佳故事性、未來展望的潛在高速成長公司) 與忽略輸家 (無趣、績效不佳、未知與不受關愛的公司),這樣的系統性偏誤會降低你的投資回報。當紅炸子機的確目前看起來表現優異,但是股價通常已經偏高;無趣、不受重視的公司,人們不會預期會有好的表現。但是他們所需的是迴歸均值 (get back to normal),結果常會令人訝異。展翅高飛者最終還是會回到地面,原本在地面的也會有機會一非沖天
  3. 人類只記得最近發生的事情,對於更早之前事情很容易就忘掉,並常常根據記憶中所記得的幾件事情就做出分析結果,而非根據事情的全貌。我們常根據外推 (extrapolation) 來進行預測 (在數學中,extrapolation 是指從已知數據的孤點集合中構建新的數據的方法。與內插類似,但其所得的結果意義更小,而且更加受不確定性影響)
  4. 人類不喜歡風險、痛恨輸錢。我們喜歡贏家、忽略輸家。但是當市場局勢改變時,昨天的失敗者很可能在來年就變成大贏家
  5. 當投資人因為得知企業的壞消息或不好的績效表現,常會過度誇大對企業的衝擊,進而瘋狂拋售與撤離市場。投資人過度反應 (overreaction) 的情形蠻常見的,投資人應於此時在垃圾堆中找出划算價格 (bargain) 的投資標的
  6. 有利可圖的投資機會源自於市場價值與真實價值之間的差異,因此,成功的 value investor 的基本任務就是精確地計算出真實價值 (intrinsic value),並利用市場的錯誤價格 (mispricing) 來取得投資獲利
  7. 假設你存 $1 給銀行,利率為 8%,一年後會變成 $1.08。現在的 $1 等於一年後的 $1.08;換句話說,一年後的 $1.08 的現值 (current value) $1,貼現率 (discount rate) 8%。基本公式:$1 X (1 + 0.08) = 1.08$1.08 X [1/(1+0.08)] = $1。公式中,[1/(1+0.08)] = 0.926 就是貼現因子 (discount factor)就數學關係而言,折現率越高,代表「未來」現金流量的現值越低,亦即折現率與價值成反比
  8. 貼現率的公式是 1/(1+R)^TR代表利率,T代表幾年。
      16.1.     假設我們購買 10年期、面值 (face value) $1000 的政府公債,此公債每年年底都會給你 $80,最後一年會連同本金 $1000 + $80 給你,每一期的現值計算如下 (net present value = 1000):  

      16.2.     承上,在相同條件下,若利率升高為 9%,你會發現你的 net present value (淨現值) 變少了,甚至變成負值 (-64.18),代表在利率為 9% 時,你根本不該購買此十年期政府公債 (net present value = 935.82)  

      16.3.     承上,在相同條件下,若利率為 7% ,計算結果如下 (net present value =1070.24):  

  1. net present value (淨現值) 的立論是將投資的未來現金流量,全部折現成投資始日的價值,稱為該投資的淨現金流量,或稱為淨現值(NPV, Net Present Value)。 假設投資的淨現值為正數,代表該投資的結果可以增加企業的價值;反之,如果投資評估的淨現值為負數,代表此投資會減少企業的價值,不應該接受。 當然淨現值為正數仍不代表該接受此投資建議,或許存在其他淨現值更高的投資機會。在多項投資案並陳時,應選擇淨現值最高的投資案。淨現值是多數企業進行投資評估時的依據,因為它將投資期間的所有現金流量納入考慮,並且以折現後的金額做計算。
  2. present value analysis 作為決定 intrinsic value 的工具,常會遇到兩個問題:
      18.1.     結果不精確Present value 是從現在到未來將個別 cash value 加總起來的值。前幾年可能是正確的預測,但是隨著時間拉長,預測不可避免的就會產生誤差,將精確的資訊加上不精確的資訊,最後就會得到不精確的結果
      18.2.     參數多未知Present value approach 在計算上需要很多參數資訊,但這些資訊通常都是未知的,尤其是長遠的未來的參數
  1. Value investor 在進行鑑價 (valuation) 常用的三種方式
      19.1.     Value of assets
      19.2.     Earnings power value
      19.3.     Value of growth: 由於未來成長是未知的,這也是為什麼此方式是最容易出錯的原因
  1. 成本法其主要概念是認為標的無形資產的價值可以由相同或類似標的無形資產之取得或自行建構成本中評價,以此成本水準作為標的無形資產之評價基礎。目前成本法主要之評價角度可分為:重製成本(Reproduction Cost)與重置成本(Replacement Cost)。
      20.1.     重新製作成本 (Reproduction Cost):與評價標的完全相同資產之成本。
      20.2.     重置成本 (Replacement Cost):重新取得與評價標的效用相近資產之成本。
  1. 內在價值是葛拉漢認為投資風險最低的方法,只要市值低於現金部位及未來仍未淨現金流入或是 reproduction costs 高於市值,就是符合條件的投資標的。reproduction costs 的概念是,你今天要花多少錢才能打造出一模一樣的公司(例如我要花多少才能再創一個可口可樂?)
  2. Earning Power Value (EPV) Reproduction Value 之間的關係
EPV < Reproduction Value
代表公司經營者未妥善利用資產來創造營收
EPV = Reproduction Value
代表只是剛好打平,企業未獲得競爭優勢
EPV > Reproduction Value
代表公司具備競爭優勢,對潛在競爭者樹立進入障礙 (barriers to entry),可以保護自己免於陷入流血競爭 (profit-eroding competition)

  1. 若一間公司的 EPV 大幅大於 asset value,這之間的差異通常是經營者優異的能力或是公司本身的競爭優勢。但是,realistic value investor 通常不會預期還會保持如此優異的表現,反而會預期他會變壞,所以要將 EPV 的值減掉一些,即採較悲觀的方式調整 margin of safety
  2. Value investing 應以較小氣 (stingy) 且悲觀的方式來預估企業的真實價值 (intrinsic value)
  3. 股票清算價值 (liquidation values) 是指公司清算時每個股份所代表的實際價值。 股票的清算價格是指一旦股份公司破產或倒閉後進行清算時,每股股票所代表的實際價值。從理論上講,股票的每股清算價格應與股票的帳面價值相一致,但企業在破產清算時,其財產價值是以實際的銷售價格來計算的,而在進行財產處置時,其售價一般都會低於實際價值。所以股票的清算價格就會與股票的凈值不相一致。股票的清算價格只是在股份公司因破產或其他原因喪失法人資格而進行清算時才被作為確定股票價格的依據,在股票的發行和流通過程中沒有意義

2018/10/05

[閱讀筆記] Antifragile: Things That Gain from Disorder (5/10)

  1. 很多時候,個人認知或人類知識無法區別訊號與雜訊,因此會過度反應
  2. Black Swan 的世界中,真正的英雄是避免發生 Black Swan Event 發生的人,而非發生 Black Swan Event 發生後收拾殘局的人可惜的是,我們的 bonus system 通常都會去獎勵後者,忽視前者
  3. 一棵樹木從生根發芽到枝杈參天是自然而然的,不要去告訴一棵樹如何生長,就像不要去教一隻鳥兒如何飛翔。同理延伸至人類活動,愈接近自然的活動其反脆弱性愈強,反之愈弱。過多人為的干預,無異於將其推向「脆弱」邊緣,這也是為什麼作者反對過多政府干預,稱格林斯潘為「超級脆弱推手」的原因。
  4. 推銷『看看我為你做了什麼』遠比『看看我為你避開了什麼事』更容易。根據『績效』建立的獎金制度,當然使問題惡化。我曾經在歷史中尋找因為沒做什麼事而成為英雄的人,但要觀察沒有作為很難。黑天鵝世界中的英雄,是防止巨大災害的人,但由於巨大災害沒有發生,所以他們沒有因此受到獎賞或鼓勵
  5. 發揮人類拖延的本能- 事實上,我們人類很不擅長於過濾資訊,尤其是短期資訊,拖延可能是讓我們過濾得更好,抗拒資訊跳躍所帶來不良後果的一種方式。如果你相信我們對事物的看法不完整,那麼靜候時間去考驗,也許是有效的方法。
  6. 為何活在資訊爆炸的時代,反而愈不知道發生什麼事?因為連十萬八千里外的一條狗被撞你都收得到新聞,這種雜訊漫天蓋地的充斥資訊管道,變成 99.5% 的雜訊,淹蓋掉 0.5% 的資訊。
  7. 太多的雜訊 (noise) 將寶貴的資訊掩蓋,每日的新聞就是雜訊,會讓你的投資決策做出錯誤的判斷。最好的方式是,忽略每日發生小的變化,只看長久的、巨幅的變化
  8. 媒體常誤導你對這個世界的了解,每一天在美國有 6200 人死亡,許多都是可以避免的意外。但是,媒體只會報導因颶風、奇怪的車禍、飛機失事等意外所導致的死亡,誤導你對真實風險的認知
  9. 尾端風險/極端風險 (Tail Risk) 是指統計學上兩個極端值可能出現的風險,按照常態的鐘型分佈(Bell Shape),兩端的分佈機率是相當低的(Thin Tails);但是兩個極端值的分佈亦有可能出現厚尾風險/肥尾(Fat Tails)風險,那就是距離中值(Mean),出現的機率提高。也就是原本不太可能出現的機率突然提高了,運用在金融市場上,那就是極端行情出現的可能性增加而且頻繁,這樣可能會造成市場行情的大幅震蕩,造成的原因可能是市場上出現不尋常的事件,如2008年雷曼兄弟倒閉、2010年的南歐主權債信危機,皆產生肥尾效應。
  1. 政治與經濟的 Tail events (極端事件) 是無法預測的,其發生機率無法用科學方法來衡量。
  2. 我們人類有兩個腎臟、肺、眼睛、耳朵、神經系統,多餘的備用零件,在必要的時刻可應付最糟的結果以及對可能發生危險的資訊有所反應,這種過度補償的性質是種以備餘形式呈現的反脆弱反應。當你在銀行保有一定的備用資金 (redundancy),你就不需要精確地去預測未來可能會有什麼潛在的困難,如戰爭、地震、經濟蕭條、恐怖攻擊等;但是如果你是負債的話,你的經濟體質較脆弱,你就需要更加準確地去預測未來可能的困難
  3. 當重大、意外事件發生後,要怪罪的不是沒有預測到事情的發生,而應該是反省檢討為何我們如此脆弱?
  4. 當福島核電廠受到海嘯攻擊後,東京電力公司深深體會到與其去預測發生災難的機率,不如聚焦於如何縮小 exposure of failure。其試圖將核子反應驢做得更小、將反應爐深深地放在地底下,使其有足夠的保護,當災難發生時對當地居民造成的衝擊越小越好
  5. 當我們像火雞一樣,使用過去的「證據」,忙於對未來嚴格預測時,意想不到的事情卻可能發生,最終我們變成了脆弱的火雞。在生活中,我們的任務就是 「如何不讓自己成為火雞」,或者如果可能的話,努力與火雞的特徵保持相反,就是具有反脆弱性。
  6. 作者將預測的事件分成四個象限,其由兩個變數組成︰簡單報酬 (是/否) 還是包括複雜報酬(包括各種函數);屬於平庸世界還是極端世界。
    1. 第一象限是平庸世界簡單報酬:預測很安全,模型有用,但較多出現在實驗室與遊戲,而非現實世界。
    2. 第二象限是平庸世界複雜報酬:統計方法令人滿意,只有一點風險。
    3. 第三象限是極端世界簡單報酬:無傷大雅,遇到就算了。
    4. 問題在於第四象限,極端世界複雜報酬,也就是黑天鵝事件所在:無法對罕見事件的報酬作預測,沒有可用的模型或定理 (發生機率很低、嚴重度卻很高的那種)。
  1. 在阿爾卑斯山 (極端世界power law) 迷路,不要用庇里牛斯山(平庸世界 normal distribution)的地圖。一些笨蛋往往聽信一些自以為是專家提供的錯誤統計機率預估,讓自己冒了更大得風險,最後自食惡果
  2. 假如無法避免第四象限,例如氣象與流行病,作者則建議採取以下方法鞏固自己的反脆弱︰
    1. 要尊敬時間和非外顯性的知識:已經運作很長一段時間的東西比較好,這些東西的存活有一定的道理(跨越短多長空與炒短線的陷阱,背後有一些隱性的知識智慧)
    2. 避免最適化;學著去喜愛多餘,沒有最適負債比這回事,現金與存款才能避免黑天鵝事件的傷害
    3. 避免去預測小機率的報酬,但普通事件的報酬不在此限
    4. 小心罕見事件的「無典型性」:指後果的嚴重度與情勢的演變
    5. 小心獎金的道德風險:指投資銀行高層(許多炒短線的專業經理人都是)每年靠冒險賺取高額獎金,等到多年一次的黑天鵝出現時,銀行倒閉債留國家、股東與納稅人時,自己拍拍屁股走人
    6. 避開風險矩陣的這樣東西:這只是一群對於風險沒有正確觀念的笨蛋,拿來自欺欺人的東西。更”精準”的線型迴歸、ANNOVA,夏普比例,貝他係數等教科書的東西,一樣全部沒用。
    7. 正面或負面黑天鵝事件?負面的黑天鵝,如風險性投資、大流行病其可能性被低估;正面的黑天鵝,如創投、科技研發其成功可能性亦被低估
    8. 不要把沒有波動性和沒有風險混為一:風險不是用波動來測試,意外的跳躍才會是黑天鵝
    9. 小心風險數字的表達:可能性與嚴重度都不可能正確預料
  3. 許多人開始使用複雜的模型 (ex. Chaos-complexity-catastrophe-fractal theory),試圖想要預測黑天鵝事件。對我來說,less is more,拋棄這些複雜的模型,提升自己的反脆弱力,才是正確的方向
  4. 做預測的人會因為預測而脆弱,飛行員因為過度自信而失事墜毀,迷信預測的人會讓自己冒更大的險
  5. 威尼斯人古諺:「The sea gets deeper as you go further into it.」(譯註:大略和中文諺語「學然後知不足」類似)。你懂得越多,就越了解自己要學的東西還有很多
  6. 務實的做事態度,應是不講機率,不要用科學估計法算百分比,而是先做好準備
  7. 我們應將恐懼轉換為謹慎、將痛苦轉換為訊息、將犯錯轉換為學習、將想法訴諸行動
  8. 越是害怕混亂 (disorder),越是害怕失多於得,你就會越 fragile;不怕混亂,經過評估可以放手一搏 (nothing to lose),這樣你只有獲得,沒有失去,你就會更加 antifragile
  9. Fragile 隱含著失多於得,不利 (downside) 大於有利 (upside),這是不利的不對稱性 (asymmetry);antifragile 意味著得多於失、有利大於不利,這是有利的不對稱性
  10. 邁向反脆弱的第一步,是先降低下檔  (downside) 損失,不是提高上檔 (upside) 利益;也就是說,減少暴露在負面「黑天鵝」的機率,並讓自然的反脆弱自行運作
  11. 路徑依賴 (path-dependent) 類似於物理學中的「慣性」,一旦進入某一路徑(無論是「好」的還是「壞」的)就可能對這種路徑產生依賴。某一路徑的既定方向會在以後發展中得到自我強化。人們過去做出的選擇決定了他們現在及未來可能的選擇。好的路徑會對企業起到正反饋的作用,通過慣性和衝力,產生飛輪效應,企業發展因而進入良性循環;不好的路徑會對企業起到負反饋的作用,就如厄運循環,企業可能會被鎖定在某種無效率的狀態下而導致停滯。而這些選擇一旦進入鎖定狀態,想要脫身就會變得十分困難。
  12. 一旦人們做了某種選擇,就好比走上了一條不歸之路,慣性的力量會使這一選擇不斷自我強化,並讓你輕易走不出去。「路徑依賴」 (path-dependent) 類似於物理學中的慣性,事物一旦進入某一路徑,就可能對這種路徑產生依賴。這是因為,經濟生活與物理世界一樣,存在著報酬遞增和自我強化的機制。這種機制使人們一旦選擇走上某一路徑,就會在以後的發展中得到不斷的自我強化
  13. 如果某樣東西具有脆弱性,那麼它發生損壞的風險,將抹殺掉你為了改善它或者使它變得「有效率」所做的任何事情,除非你先降低發生損壞的風險。
  14. 國家很容易以讓子孫背負債務的方式,促進國內生產毛額(GDP)的成長,但將來的經濟可能因為需要償還這些債務而崩潰。
  15. 財務上採取槓鈴策略(barbell strategy),也就是用超積極與超保守的投資組合,取代溫和的保守、積極的投資組合。例如把 80~90% 的資金,放在極保守的投資工具(像政府債),剩下的 10 ~20%,放到極為投機的賭注上,槓桿倍數盡可能放大(像是選擇權或者期貨),這樣你的核心部位,就不會受到風險管理錯誤的影響,沒有任何黑天鵝事件可以對你造成傷害。因為你把無法計算的風險,也就是對你有害的風險減除了,你的風險不是中度風險,而是一邊高風險,但另外一邊無風險,平均起來將是中度風險。中間策略是賺錢有上限、虧損無下限;而槓鈴策略是賺錢無上限、虧損有下限