2020 全球股市大崩盤,股市截圖 (十年走勢)

背景:

歷經從 2008 年次級房貸風暴,股市大崩盤後,美國實施了 3 次 QE。

於 2019 年左右美元開始緩步升息,結束 QE,
至 2019 年下半年升息到大約 2.5 % 時,
雖然原本主流的理性看法是美元應該要升息到 5% 以上,才能確保 FED 有足夠的降息空間以預防下次金融危機來臨時,FED 能有較充裕的手段來降低經濟衰退的傷害,
然而,此時的美國總統川普自以為是地用各種政治手段要求 FED 降息,導致 FED 正常的美元升息循環就此中斷。

緊接著,2019 年底中國爆發武漢肺炎,並於 2020 年 3 月,武漢肺炎於全球大爆發,全球所有國家開始封鎖邊界、要求人民停止集會、企業實施員工在家工作等等,
同時,石油生產成員國 (OPEC+, 沙烏地阿拉伯與俄羅斯等) 爆發市占率大戰,石油增產引發油價大跌。

另一說法是,俄羅斯看準美國無限制印鈔導致巨大泡沫化的經濟弱點,伺機發動石油價格戰,一方面是石油市占率之爭,另一方面可以藉此重重打擊美國經濟。

逢上述兩大經濟劇變,促使美國直接一口氣將美元降息到接近零利率,並實施新一輪的 QE 措施,
全球股市大崩盤,本資料紀錄下當時股市十年來的最高點與相關史料。

意大利護士用鏡頭記錄抗疫之戰:https://www.bbc.com/zhongwen/trad/world-51973477

四分之一美國人居家不出的經濟後果:https://www.bbc.com/zhongwen/trad/world-51995248

肺炎疫情如何令中國「崛起大國」的光環黯然失色:https://www.bbc.com/zhongwen/trad/chinese-news-51942287

新冠疫情已彌漫全球,疫苗和治療藥物還有多遠:https://www.bbc.com/zhongwen/trad/science-51985951





















2015年8月的第一起漲點為 7203









2020/3/22

因新冠肺炎造成市場失序,企業和銀行爭先恐後搶換美元,以備償債和維持營運所需,美元的避險及融資需求同步攀升,美元指數隨之升破 100 大關,來到 3 年來高峰。美元指數 (DXY) 19 日最高觸及 102.94。美元指數對台股落底有領先指標的參考價值,美元指數創下波段新高後何時開始回跌?台股才有望擺脫國際資金的賣壓。

全球股市能否落底,關鍵仍在二隻黑天鵝動向。

上周由於融資追繳令瘋狂發出,賣壓爆量出籠,融資水位已降至不到千億元水位,台股方面,國安基金周五 (3/20) 起啟動史上第七次進場護盤機制,有助市場信心穩定,激勵極短線買盤進場。

然而,市場不斷出現利空訊息,例如,美國經濟研究聯合會最新指出,疫情恐導致美國 2300 人失業;高盛認為美國第 2 季 GDP 萎縮恐多達 24%,是單季最劇烈萎縮幅度;而英國宣布全國封鎖,即日起關閉倫敦地區內所有咖啡館、餐廳以及酒吧;義大利至周日上午死亡人數逼近 5000 人;西班牙確診人數也快速攀升,已超越伊朗。

台股方面,外資連 11 個交易日賣超,3 月以來僅微幅買超 2 個交易日,累計 3 月已賣超逾 3300 億元,尤其目前美元指數已飆破 100,國際資金快速回流美元,股市買盤力道恐仍將低於賣壓。

接下來,台灣將公布失業率和景氣對策信號,而美國超級財報周將陸續登場,在肺炎疫情蔓延下,不排除出現「財爆」,進而衝擊市場信心。

另外,國安基金進場要發揮效果非一朝一夕,以過去經驗,10 年線不守就是大空頭來臨,破十年線後,需要整理半年以上。

疫情已正式進入全球大流行階段,不僅歐美國家開始大爆發,就連台灣都因境外感染而進入確診百例以上的高峰期,儘管各國政府持續注入流動性挽救股市,但股市仍會持續震盪,直到市場相信疫情獲得控制。

據過去經驗,若 10 年線遭摜破且站不回去,後續可能出現對稱的第二波主跌段,3/20周五國安基金進場護盤,激勵極短線買盤,反彈行情之後,指數易拉回在十年線附近擴底,短線操作仍須嚴設停損。

不過,就技術面而言,隨著短線乖離過大,不排除大盤隨時有機會迎來反彈格局。

台北時間 3/20周五白天台北股市收盤:


台北時間 3/21周六清晨國際股市收盤:








如何正確解讀:當一家公司實施庫藏股

2020 年武漢肺炎爆發,全球股市崩盤,主管機關鼓勵任何刺激股價上漲的方案,包括庫藏股。

公司的錢不是公司的錢,現金太多不如現金減資,縮小股本提高淨值,EPS提高,更符合股東的利益。股票價值市場決定,喊話股價委屈的老闆,請用自己的錢買,別誤導散戶,別動公司現金。

庫藏股,買到誰的股票?

很多公司在股票變成壁紙前大買庫藏股,替大股東解套,或透過庫藏股掏空公司資金。三采建設、仕欽、勝華都是如此。沒聽過?因為都下市了。

能影響股價漲跌的,除了主力就是大股東。公司資產、訂單,大股東一目了然,行情走空騙不到散戶買股票又想抽回資金時,幸好公司有現金。

國巨摘掉千金頭冠,107年7/17宣布買庫藏股,股價965元。庫藏股是買盤,融資增加也是買盤,公司買散戶也買,股價從965元跌到240.5元,買完庫藏股,股價一落千丈,公司、散戶買到誰的股票?換個方式問,誰有那麼多股票可以賣?

100年7/16宏達電宣佈買回庫藏股,股價943元。今天收26.95元。

公司以庫藏股名義買900元的國巨、宏達電完全違背股東利益。真正物超所值,沒人會大張旗鼓。


為何美股賣壓止不了血?「大賣空」本尊投資人解釋

知名投資人貝瑞(Michael Burry)在2008年金融海嘯前放空次級房貸證券而大賺,成為小說及電影「大賣空」故事的主人翁。如今他在這波新冠肺炎疫情引爆的全球股災中,再度押對方向。

財經新聞網站MarketWatch報導,貝瑞接受彭博資訊訪問時表示,在美股這波又急又猛的跌勢中,他打算繼續「大舉」做空。

貝瑞是醫師出身,後來改行當避險基金經理人,他在2008年金融海嘯之前大舉押注次級房貸市場將崩垮,因此揚名立萬,電影「大賣空」(The Big Short)就敘述這一段經歷。

創辦Scion資產管理公司的貝瑞向彭博資訊表示,新冠疫情有如一個引爆器,觸動「被動式投資泡沫」爆裂。他早在去年8月下旬就預言,指數股票型基金(ETF)這類被動式投資將是下一個泡沫,而資金大量湧入ETF這類被動式投資工具,將加劇日後的賣壓。

他的預言似已應驗。近日來美股賣壓狂湧,道瓊工業指數12日收盤又崩跌2,352點,跌幅深達10%。那斯達克綜合指數和標普500指數分別重挫9.5%和9.4%。

貝瑞說:「沒人知道跌勢會持續多久,所以眾人有充分的理由拋售。若你投資股票是因為之前一直走高,而且央行總是會踩煞車讓任何賣壓止血,那麼,這些先決條件現在都不再有效了。」

貝瑞表示,他不急著結清做空部位。他說:「這麼說好了:儘管賣壓猛烈,歷時還不夠久、尚未能驅散逢低承接的心態。但市場恐懼感與民眾對新冠病毒的恐懼感同時蔓延,這雙重恐懼將毒害市場信心。」

貝瑞說:「對我來說,市場的歇斯底里反應似乎比實際情況還要糟,但在投資人一窩蜂爭先恐後逃出場後,到底最初引發跌勢的因素是否有道理,已經不重要了。」


JSON and Go

https://mgleon08.github.io/blog/2019/02/17/golang-json-and-go/

Encoding - Marshal 序列化

在 Go 中並不是所有的類型都能進行序列化:
  • 必須是 struct 中支援外部引用的 field 才能夠序列化 (即開頭字母大寫的 field)
  • JSON object key 只支援 string
  • Channel、complex、function 等 type 無法進行序列化
  • 不支援循環數據結構,因為序列化時會進行無限迴圈
  • Pointer 序列化之後是其指向的值或者是 nil
1
func Marshal(v interface{}) ([]byte, error)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
  "encoding/json"
  "fmt"
)

type UserInfo struct {
  Name string
  Say  string
  Age int64
}

func main() {
  m := UserInfo{"Leon", "Hello", 18}
  b, _ := json.Marshal(m)
  fmt.Println(string(b))
}

// {"Name":"Leon","Say":"Hello","Age":18}

指定 JSON filed name

Struct Tag

Struct tag 可以決定 Marshal 和 Unmarshal 函式如何序列化和反序列化數據。
  • 一般 json 都是小寫,但因為 golang 序列化時,struct 必須是大寫,因此透過 Struct Tag 改成小寫
  • mongodb 則是使用 bson,可以在 struct 加上 json:"name,omitempty" bson:"name,omitempty"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
  "encoding/json"
  "fmt"
)

type UserInfo struct {
  Name string `json:"name"`
  Say  string `json:"say"`
  Age int64   `json:"age"`
}

func main() {
  m := UserInfo{"Leon", "Hello", 18}
  b, _ := json.Marshal(m)
  fmt.Println(string(b))
}

// {"name":"Leon","say":"Hello","age":18}

指定 field 的行為

omitempty

透過 omitempty 如果 field 的值是對應類型的 zero-value,序列化之後的 JSON object 中不包含此 field
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
  "encoding/json"
  "fmt"
)

type UserInfo struct {
  Name string `json:"name"`
  Say  string `json:"say"`
  Age int64   `json:"age,omitempty"`
}

func main() {
  m := UserInfo{}
  b, _ := json.Marshal(m)
  fmt.Println(string(b))
}

// {"name":"","say":""}

-

透過 - 可以忽略掉該 field
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
  "encoding/json"
  "fmt"
)

type UserInfo struct {
  Name string `json:"name"`
  Say  string `json:"-"`
  Age int64   `json:"age,omitempty"`
}

func main() {
  m := UserInfo{"Leon", "Hello", 18}
  b, _ := json.Marshal(m)
  fmt.Println(string(b))
}

// {"name":"Leon","age":18}

Decoding - Unmarshal 反序列化

預設的 JSON 支援以下幾種 Go 類型:
1
2
3
4
bool for JSON booleans
float64 for JSON numbers
string for JSON strings
nil for JSON null

知道類型的反序列化

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
package main

import (
  "encoding/json"
  "fmt"
)

type UserInfo struct {
  Name string `json:"name"`
  Say string  `json:"say"`
  Age int64   `json:"age"`
}

func main() {
  var jsonString string
  jsonString = `{"name":"Leon","say":"hello","age":18}`
  
  //把 json unmarshal 進去 struct
  u := &UserInfo{}
  err := json.Unmarshal([]byte(jsonString), u)
  if err != nil {
      fmt.Println(err)
      return
  }
  fmt.Println(u)
  fmt.Printf("%T\n", u)
  fmt.Printf("name:%s, say:%s, age:%d\n", u.Name, u.Say, u.Age)
}

// &{Leon hello 18}
// *main.UserInfo
// name:Leon, say:hello, age:18

不知道類型的反序列化

如果不知道類型可以用 interface{}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
  "encoding/json"
  "fmt"
)

func main() {
  var jsonString string
  jsonString = `{"name":"Leon","age":18,"cars":["Maserati","BMW"]}`
  
  //把 json unmarshal 進去 struct
  var u interface{}
  err := json.Unmarshal([]byte(jsonString), &u)
  if err != nil {
      fmt.Println(err)
      return
  }
  fmt.Println(u)
  fmt.Printf("%T\n", u)
}

// map[cars:[Maserati BMW] name:Leon age:18]
// map[string]interface {}
回傳的格式如
1
2
3
4
5
6
7
8
map[string]interface{}{
    "Name": "Leon",
    "age":  18,
    "cars": []interface{}{
        "Maserati",
        "BMW",
    },
}
key 是 string,value 是 interface{},必須透過 type assertion 和 range 取得所有的 key
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
package main

import (
  "encoding/json"
  "fmt"
)

func showInfo(u interface{}){
  m := u.(map[string]interface{})
  for k, v := range m {
      switch vv := v.(type) {
      case string:
          fmt.Println(k, "is string", vv)
      case float64:
          fmt.Println(k, "is float64", vv)
      case []interface{}:
          fmt.Println(k, "is an array:")
          for i, u := range vv {
              fmt.Println(i, u)
          }
      default:
          fmt.Println(k, "is of a type I don't know how to handle")
      }
  }
}

func main() {
  var jsonString string
  jsonString = `{"name":"Leon","age":18,"cars":["Maserati","BMW"]}`

  //把 json unmarshal 進去 struct
  var u interface{}
  err := json.Unmarshal([]byte(jsonString), &u)
  if err != nil {
      fmt.Println(err)
      return
  }
  showInfo(u)
}

// name is string Leon
// age is float64 18
// cars is an array:
// 0 Maserati
// 1 BMW

Reference Types - 反序列化對 slice、map、pointer 的處理

struct 中包含一個 slice Cars ,slice 預設是 nil,之所以反序列化可以正常進行就是因為 Unmarshal 在序列化時進行了對 slice Cars 做了初始化,同理,對 map 和 pointer 都會做類似的工作
比如序列化如果 Pointer 不是 nil 首先進行 dereference 獲得其指向的值,然後再進行序列化,反序列化時首先對 nil pointer 進行初始化
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
package main

import (
    "encoding/json"
    "fmt"
)

type UserInfo struct {
    Name string
    Age  int64
    Cars []string
}

func main() {
    var jsonString string
    jsonString = `{"name":"Leon","age":18,"cars":["Maserati","BMW"]}`

    //把 json unmarshal 進去 struct
    u := &UserInfo{}
    err := json.Unmarshal([]byte(jsonString), u)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(u)
    fmt.Printf("%T\n", u)
    fmt.Printf("name:%s, age:%d, cars:%s\n", u.Name, u.Age, u.Cars)
}

// &{Leon 18 [Maserati BMW]}
// *main.UserInfo
// name:Leon, age:18, cars:[Maserati BMW]

nested struct 的序列化

Go 支援對 nested struct 進行序列化和反序列化:
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
package main

import (
    "encoding/json"
    "fmt"
)

type App struct {
  Id string `json:"id"`
}

type Org struct {
  Name string `json:"name"`
}

type AppWithOrg struct {
  App
  Org
}

func main() {
  data := []byte(`{ "id": "123", "name": "My Awesome Org" }`)
  var b AppWithOrg
  json.Unmarshal(data, &b)
  fmt.Printf("%#v\n\n", b)
  
  a := AppWithOrg{
      App: App{ Id: "321" },
      Org: Org{ Name: "My Awesome Org"},
  }
  data, _ = json.Marshal(a)
  fmt.Println(string(data))
}

// main.AppWithOrg{App:main.App{Id:"123"}, Org:main.Org{Name:"My Awesome Org"}}
// {"id":"321","name":"My Awesome Org"}

Stream JSON

Golang 提供 Decoder 和 Encoder 對 stream JSON 進行處理,常見 request 中的 Body、文件等
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
package main

import (
  "encoding/json"
  "fmt"
  "io"
  "log"
  "strings"
)

func main() {
  const jsonStream = `
  {"Name": "Ed", "Text": "Knock knock."}
  {"Name": "Sam", "Text": "Who's there?"}
  {"Name": "Ed", "Text": "Go fmt."}
  {"Name": "Sam", "Text": "Go fmt who?"}
  {"Name": "Ed", "Text": "Go fmt yourself!"}
`
  type Message struct {
      Name, Text string
  }
  dec := json.NewDecoder(strings.NewReader(jsonStream))
  for {
      var m Message
      if err := dec.Decode(&m); err == io.EOF {
          break
      } else if err != nil {
          log.Fatal(err)
      }
      fmt.Printf("%s: %s\n", m.Name, m.Text)
  }
}

// Ed: Knock knock.
// Sam: Who's there?
// Ed: Go fmt.
// Sam: Go fmt who?
// Ed: Go fmt yourself!
參考文件


程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...