- 當崩盤無以避免,市場必然遭遇重創時,投資者能做些什麼?至少你可以不要限於恐慌或瘋狂賣出,站在原地就可以
- 每個受過教育的人都應讓自己具備歷史知識,對於過去的瘋狂與失敗有所理解。這些理解可讓我們明白人群與國家的心理狀態。更重要的是,這些理解再次證明了世上沒有什麼新鮮事。事物變化的越多,他們就越會維持原狀
- 市場會一再地陷入非理性的狂歡及最悲慘的沮喪中。好日子時,務必謹記可能一翻身就掉進地獄,同樣重要的是,當市場陷入一片肅殺氣氛時,也要記得事情總有轉機
- 所有的財務都是行為取向,投資者就是會受到腦中情緒與反應的控制,再久也改不了
- 從泡沫升起與破裂的歷史過程中,我們最大的受益就是,大樂觀時代的報酬最低;而當一切看來黯淡無光時,未來報酬最高
- 人總是受到行為習慣控制,因此損失錢的速度,比半夜在中央公園裡被搶還快
- 投資者的最大問題,甚至是最大的敵人,很可能就是自己
- 如果所有人都認定某些股票會是最好的投資,這就意味著所有人都已經擁有這些股票。接著這代表著兩件事:首先,因為所有人都已經買了這些股票,股價將會居於高檔,但未來報酬卻相對降低。其次,也是更重要的一點,那就是已經沒有其他人會再買進這些股票。如此一來,由於沒有買進股票的後續部隊,所以股價已不會再漲了
- 有兩種行為誤差會出現在你過度自信的狀況中:第一種是成功與失敗之間的「分野」,我們總是記得我們成功的那幾次經驗,但卻總是忘記失敗的歷史;第二種是,我們總是將成功歸諸於自己的技術,而非運氣
- 投資者會犯的第二種重要錯誤就是:慣於假設眼前的景象可用來預測遙遠的未來
- 時近效應(recency effect):我們習慣於過度強調最近數據的重要性,卻忽略了更早以前的數據,即便過去的數據更完整
- 通常每三年,各種投資標的都會出現一次「均線反轉」(mean-revert)的現象,即當一段時間績效表現較佳之後,就會跟著出現一段表現較差的時期;反之亦然,如果有一段時間狀況不佳,就會跟著出現一段好時機。不幸的是,這並非不變的定則,但如果你跟著搶進過去幾年表現不錯的資產的話,這不會是什麼好賭注
- 在行為財務學中,最常看到的現象就是,人們總是追求低機率 / 高獲利的機會,這就是為什麼每個人都願意花一美元去買平均只回收只有五十美分的樂透彩券
- 短視損失厭惡症(myopic loss aversion):人常常太過於重視短期損失,以至於忽略了更嚴重的長期損失
- 在人類數百萬年的演化過程,讓我們會對短期內損失三成資產感到痛不欲生,但是卻對無法達到長期財務目標的狀況毫無感覺
- 在所有投資錯覺中,最明顯的一種錯覺就是「好公司代表好股票」的謬誤。1970 年代早期出現的「閃耀五十」,以及 2000 年代初期對網路股、科技股的狂熱現象,都顯示了人們過度強調營利成長的重要性。唯一值得買進的公司就是「穩健經營的跨國公司」,而且還是「基於市場需求力道強勁而產生的高成長率的公司」
- 投資者間分出高下勝敗的關鍵在於,贏家知道該做數學功課,輸家只懂得聽故事
- 就算是最專業的人士也無從預知盈利的短暫榮景可維持多久,如果你觀察那些先前有著高盈利成長的股票,你將會發現他們後來的盈利成長狀況跟大盤相差無幾
- 在科技泡沫興起時,成長型股票的結果絕佳無比,狂熱氣氛也達到最高峰,但是在泡沫破裂之後,價值型股票的表現反而最好
- 股價根本不會重複出現一定的形態,如果真有的話,最有錢的人應該是坐擁書山的圖書館員
Total Pageviews
2018/08/02
[閱讀筆記] The Four Pillars of Investing (8/12)
Labels:
Investment,
Reading
2018/08/01
[閱讀筆記] Thinking, Fast and Slow (5/9)
- 當你是零售連鎖店的經理,若你被要求明年度的業績要成長 10% 時,人會很自然的提出每家分店增加10%銷售量的解決方案。根據迴歸均值 (regression to the mean)的概念,其實你該做的規劃是,低績效的分店增加超過 10% 的銷售量,而其他績效較好的分店增加較少的銷售量
- 若你要預測一個在小時候愛讀書的人,在大學的 GPA 分數,你可以這麼做
- 取得平均 GPA 分數做為你預測的開始 (這是你的 baseline)
- 確認平均 GPA 分數是否符合你對證據的印象 (這是你的直覺預測)
- 評估你的證據與平均 GPA 分數之間的關係 (從 baseline 朝向你的直覺預測移動)
- 若關連性是0.3,則將平均 GPA 分數向右移動 30% (產生最後預測結果)
- 直覺預測需要被修正,因為其不回歸(regression)且有偏誤(bias)。假定我預測高爾夫公開賽每個選手第二天的桿數跟第一天相同,這個預測不容許回歸平均值 (regression to the mean):高爾夫選手第一天進展很順利平均而言會比第二天差,而表現比較差的選手,大部分會有改進。最後當他們跟實際的結果比較,非回歸性預測會被發現有偏誤(bias)。即時你的預測已經修正了偏誤(bias),但你仍然有可能會犯錯,只是會縮小錯誤的大小
- 人類在預測常發生偏誤的原因是:忽略了 base rates (基本比率)以及對於資訊的品質沒有敏感度。直覺預測常會過度自信且過度偏激
- 當你在預測時,若沒有其他有用的證據可以參照時,記得參照 base rates (基本比率)來做預測。
- 英國遺傳學家Galton 發現,父母特徵的確會遺傳給後代,但是並不會產生極端身高的族群。當父母的身高已經遠離平均身高時,生下的兒女身高並沒有持續「遠離」平均,而會稍微「靠近」平均,也就是相對矮了一點;反之父母身高很矮的後代,身高會相對其父母「靠近」平均一點。Galton 把這個「極端」往「平均」移動的現象稱為「 regression to the mean 」。用東方人的說法,就是「物極必反」
- 系統成分( Systematic Component ):給定的迴歸中,用來解釋研究現象的元素
- 隨機成分( Random Component ):研究希望討論的「未知」的現象
- 連結函數( Link Function ):描述系統成分與隨機成分兩者之間關係的函數
- 人類常會犯下敘述的謬論 (Narrative fallacy),事情在發生過後,以一種敘事性的描述來回顧這件事,會讓這個歷史事件看來有跡可尋,脈絡明晰。人類總是持續在愚弄自己,不斷地在建構過去的歷史事件,使其脈絡可循,並相信這是真的
- 人們很難接受機運、運氣這樣的說法,事實上,有些冒著愚蠢而過高風險的人,假如時機剛好對,風向對他們有利,他們看起來會機靈無比。在投資界,就是某些報酬率高超的投資人。在企管界,就是某些被稱贊說有前瞻與進取心的總裁。這些人會持續看起來很聰明,直到運氣反轉的那一天。同一位精明的總裁,在公司營收衰退後,就會開始收到一些”決策僵化、不知變通、守舊”的評語。事實上,同一個人在前陣子聲勢如日中天時,大家對他的描述是”有彈性、進取、創新”。
- 對於我們的無知,我們總是有無限的能力去忽視它
- Illusion 的核心是,我們相信我們了解過去,並隱含著也了解未來。但是,事實上,我們對於過去的了解比我們相信我們了解的少很多
- hindsight bias (後見之明偏誤) 指當人們得知某一事件結果後,誇大原先對這一事件的猜測的傾向,俗語稱「事後諸葛」。後見之明偏見的一個基本的例子是,在知道一個不可預見事件的結果後,一個人相信自己「早就知道結果會這樣」。後見之明的偏見可能導致記憶失真,回憶與重建內容時產生錯誤的理論成果。如歷史著作中對戰役結果的描述,醫生對臨床試驗的回顧和司法系統對事故責任和可預測性的判定,還有沈迷於賭博的人們,因後見之明偏誤 (hindsight bias) 而過度高估自己的預測能力
- outcome bias (結果偏誤) 是指以結果論成敗,而不管決策當時是否做了正確決定。人生充滿不確定性,有許多牽涉到風險和不確定性的問題,都沒有正確的答案。 因此,人們只能做出他認為理性、看起來正確的決定,但由於預料之外與難以預料的情況,做出的決定未必能產生理想結果。結果偏差讓人們過於強調實際發生的事情,而忽略了決策本身的好壞。在交易時,就連正確做法也會造成虧損交易,甚至損失接踵而來。這些損失會讓交易人對自己和他們的決策過程產生懷疑,進而完全推翻他們一直以來所使用的方法。如2008年的金融海嘯讓很多投資人虧損嚴重,以致於投資人2009年普遍因2008年的結果而操作保守錯失投資行情,但就歷史數據告訴我們,跌深後必會反彈,但當下讓人們因為過於強調實際的事件,而投資操作的事件的好壞。( https://goo.gl/rThaPV )
- 當有人說,這個錯誤很明顯可見,但這只是馬後炮 (hindsight),你無法事先知道會有這個錯誤
- 你沒有證據來解釋這家公司經營不善,你僅知道這家公司的股價大跌。但人們在股價大跌時,很容易對這家公司產生負面的想法,這是一種 outcome bias (結果偏誤)、一部分的 hindsight bias (後見之明偏誤) 與一部分的 halo effect (光環效應)
- 大部分的股市的買家與賣家都擁有相同的資訊,但是他們因為有不同的看法而互相交換股票。買進的人覺得現在的價格太低,可能會跌深反彈;賣出的人絕目前價格太高,可能會向下修正。這是一個令人感到困惑的現象,買賣雙方都覺得目前的價格是不合理的,但是做出不同的行為。是什麼原因讓買家與賣家相信價格目前是太高或太低呢?大部分都是幻覺 (illusion) 所導致
- 根據研究顯示,平均來說,最主動積極的投資人擁有最差的投資回報,反倒是較少進出市場的投資人,擁有較高的回報。再用性別來做調查,男人相較於女人會有更多無用的會賠錢的想法,所以女人會比男人有更好的投資績效
- 根據研究顯示,大部分的 fund maangers 的選股比較像是在擲骰子,他們所選擇的 mutual funds 至少有三分之二沒有達到預定目標
- 預測失準是無法避免的,因為未來是無法預測的。高度主觀的自信,不能做為精確、可被信任的指標。
- 問題不在於這些財經專家是否經過良好的訓練,而是他們所處的世界是否是可預測的
- 每次股市盤後,都會看到財經專家有一套理論來解釋本日的漲跌原因,這樣會讓他人與自己對其產生幻覺 (illusion),以為他了解這個世界
- 若有一個經過驗證過的、可靠的方程式 (formulas)、演算法 (algorithms) 或檢查清單 (checklist),以結果的正確性來說,專家的準確性會較差,因為人容易受到外部環境的影響而做出錯誤的判斷,方程式 (formulas)、演算法 (algorithms) 或檢查清單 (checklist) 則不會受到影響。根據研究顯示,若希望讓預測的精確性最大化,最後的決定應該交給方程式 (formulas)、演算法 (algorithms) 或檢查清單 (checklist)
- 若你在幫公司招募人才,你不該不著邊際的亂問問題,若你很認真看待這件事情,你應該做好兩件事 (假設你再招募業務人員):
- 列出幾項可以勝任此職位的特質 (如技術嫻熟度、可靠度等):最多六個 特質,不要過度設計。每個特質間盡可能彼此獨立,而且你可以根據這特質問出實際的問題,且這些特質有辦法可靠的衡量此人是否適合此職位
- 根據每個特質列出一系列的問題,並想想該怎麼評分,如一到五分,數字越高代表表現越好:最後你可能會發現,面試過程你最喜歡的人,未必是最高分的人。記得要靠最後評分的數字來挑選人選,而非靠第一印象。
- Expertise (專門技能) 的養成通常是非常花時間的,且expertise的獲取是一個非常複雜的過程,如西洋棋家、籃球選手、打火兄弟等,都是非常複雜與緩慢的過程。因為 expertise 在這個專業領域需養成的不是單一技能,其是由大量的小技能 (a collection of miniskills) 所組合而成的 。如西洋棋選手的養成,若要變成高段的選手,至少需要一萬個小時的持續練習 (一天五小時,持續六年),選手們要學習上千種不同的佈陣,並學習在不同的狀況下如何威脅對手或自我防衛
- 真正的專家會知道自己知識的限制。但是很多專家常有主觀的自信,不知道它們自己在做什麼,也是因為專家們不知道自己所擁有的專業知識或技能的限制,所以才常會過度自信。那我們該如何判斷哪些 expertise 是可以被信任的呢? 其有兩個條件可以用來判斷:
- 環境足夠規律到可以被預測
- 透過長時間的練習學習到重複發生的模式
Labels:
Reading
2018/07/15
[Spring Data] [Neo4j] Caused by: org.neo4j.driver.v1.exceptions.ClientException: Invalid input '{': expected whitespace or a rel type name
Problem
假設我想建立下圖 User nodes 間 IS_FRIEND_OF 與 WORKS_WITH 的關係
透過 Spring Data 建立以下的 repository class (分別傳入三個參數,包含來源 node、目的 node以及要建立的關係)
但在執行時,出現以下 runtime exception
How-To
根據 neo4j 於 gitlab 上的說明: https://github.com/neo4j/neo4j/issues/4334
目前在 relation 的部分,尚未支援參數化傳遞。因此,根據需求,須將其拆成兩個 methods,建立兩種不同的 relationships
假設我想建立下圖 User nodes 間 IS_FRIEND_OF 與 WORKS_WITH 的關係
透過 Spring Data 建立以下的 repository class (分別傳入三個參數,包含來源 node、目的 node以及要建立的關係)
package neo4j.springdata.repository; 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.User; @Repository public interface UserRepository extends CrudRepository<User, Long> { @Query(" match (from:User), (to:User) " + " where from.name={from} and to.name={to} " + " merge (from)-[:{relation}]->(to) ") void createRelation(@Param("from") String from, @Param("to") String to, @Param("relation") String relation); }
但在執行時,出現以下 runtime exception
Caused by: org.neo4j.driver.v1.exceptions.ClientException: Invalid input '{': expected whitespace or a rel type name (line 1, column 87 (offset: 86)) "match (from:User), (to:User) where from.name={from} and to.name={to} merge (from)-[:{relation}]->(to)" ^ at org.neo4j.driver.internal.net.SocketResponseHandler.handleFailureMessage(SocketResponseHandler.java:76) at org.neo4j.driver.internal.messaging.PackStreamMessageFormatV1$Reader.unpackFailureMessage(PackStreamMessageFormatV1.java:470) at org.neo4j.driver.internal.messaging.PackStreamMessageFormatV1$Reader.read(PackStreamMessageFormatV1.java:431) at org.neo4j.driver.internal.net.SocketClient.receiveOne(SocketClient.java:196) at org.neo4j.driver.internal.net.SocketConnection.receiveOne(SocketConnection.java:217) at org.neo4j.driver.internal.net.ConcurrencyGuardingConnection.receiveOne(ConcurrencyGuardingConnection.java:165) at org.neo4j.driver.internal.net.pooling.PooledSocketConnection.receiveOne(PooledSocketConnection.java:183) at org.neo4j.driver.internal.InternalStatementResult.receiveOne(InternalStatementResult.java:335)
How-To
根據 neo4j 於 gitlab 上的說明: https://github.com/neo4j/neo4j/issues/4334
目前在 relation 的部分,尚未支援參數化傳遞。因此,根據需求,須將其拆成兩個 methods,建立兩種不同的 relationships
package neo4j.springdata.repository; 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.User; @Repository public interface UserRepository extends CrudRepository<User, Long> { @Query(" match (from:User), (to:User) " + " where from.name={from} and to.name={to} " + " merge (from)-[:WORKS_WITH]->(to) ") void createWorksWithRelation(@Param("from") String from, @Param("to") String to); @Query(" match (from:User), (to:User) " + " where from.name={from} and to.name={to} " + " merge (from)-[:IS_FRIEND_OF]->(to) ") void createIsFriendOfRelation(@Param("from") String from, @Param("to") String to); }
2018/07/14
[Neo4j] 執行 neo4j-shell 時,出現 Connection refused 錯誤
Problem
當我要執行 neo4j-shell 時,出現以下錯誤:
How-To
解決步驟如下:
(1) 到 neo4j 安裝目錄下,找到 conf 目錄下的 neo4j.conf 檔案
(2) 在 neo4j.conf 檔案中,找到以下設定值:
(3) 將原本註解掉的值拿掉,修改並儲存:
(4) 執行 neo4j restart 即可
當我要執行 neo4j-shell 時,出現以下錯誤:
F:\software\neo4j-community-3.3.3 λ bin\neo4j-shell ERROR (-v for expanded information): Connection refused
How-To
解決步驟如下:
(1) 到 neo4j 安裝目錄下,找到 conf 目錄下的 neo4j.conf 檔案
(2) 在 neo4j.conf 檔案中,找到以下設定值:
# Enable a remote shell server which Neo4j Shell clients can log in to. #dbms.shell.enabled=true # The network interface IP the shell will listen on (use 0.0.0.0 for all interfaces). #dbms.shell.host=127.0.0.1 # The port the shell will listen on, default is 1337. #dbms.shell.port=1337
(3) 將原本註解掉的值拿掉,修改並儲存:
# Enable a remote shell server which Neo4j Shell clients can log in to. dbms.shell.enabled=true # The network interface IP the shell will listen on (use 0.0.0.0 for all interfaces). dbms.shell.host=127.0.0.1 # The port the shell will listen on, default is 1337. dbms.shell.port=1337
(4) 執行 neo4j restart 即可
F:\software\neo4j-community-3.3.3 λ bin\neo4j restart Neo4j windows service stopped Neo4j windows service started
Labels:
Neo4j
2018/07/13
[JavaScript] How to set an array of data to textarea ?
Problem
I have a textarea as bellows:
How to set an array of data totextarea? And each element should add new line character
How-To
An array has a method to glue all elements together, Array.join. Without an argument, it would use a comma (,) as glue. To put every element on a new line, use the newline character (\n).
I have a textarea as bellows:
<textarea class='form-control' id='sentencesToLabeledData' name='sentencesToLabeledData' rows='10' cols='50'> </textarea>
How to set an array of data totextarea? And each element should add new line character
How-To
An array has a method to glue all elements together, Array.join. Without an argument, it would use a comma (,) as glue. To put every element on a new line, use the newline character (\n).
// entity.sentences is an array of String if (entity.sentences != null && entity.sentences.length > 0){ // apply Array.join to set new line character to each array element document.getElementById("sentencesToLabeledData").value = entity.sentences.join("\n"); }
Labels:
JavaScript
2018/07/12
[JavaScript] How to convert textarea into an array?
Problem
I have a textarea as bellows:
I would like to get its value and convert into an array. How to do it?
How-To
Here has two steps to fulfill this requirement:
I have a textarea as bellows:
<textarea class='form-control' id='sentencesToLabeledData' name='sentencesToLabeledData' rows='10' cols='50'> </textarea>
I would like to get its value and convert into an array. How to do it?
How-To
Here has two steps to fulfill this requirement:
// Step 1. get the value of textarea var sentencesToLabeledData = document.getElementById("sentencesToLabeledData").value; // Step 2. split the value of textarea by \n, then it will convert into an array var sentenceArray = sentencesToLabeledData.split('\n');
Labels:
JavaScript
2018/07/11
2018/07/10
[SQuirreL SQL Client] How to avoid An I/O error occurred while sending to the backend error
Problem
I am using SQuirreL SQL Client as my database client tool, but it is very annoying to get this error message when I do not use for a while:
This error results from connection session timeout, how can I keep session alive?
It's very annoying to re-connect again.
How-To
Here has the process to iron out this annoying error:
I am using SQuirreL SQL Client as my database client tool, but it is very annoying to get this error message when I do not use for a while:
An I/O error occurred while sending to the backend error
This error results from connection session timeout, how can I keep session alive?
It's very annoying to re-connect again.
How-To
Here has the process to iron out this annoying error:
2018/07/09
[PostgreSQL] How to insert data with new line character?
Problem
I have a table which name Test
The content column will have new line characters, I try to use \n to insert but in vain.
How-To
I should use chr(10) instead of \n. Therefore, the SQL statement will be updated as bellows:
I have a table which name Test
The content column will have new line characters, I try to use \n to insert but in vain.
1 2 | insert into test (project_id, name, content) values(5, 'test', 'aaa\nbbb'); |
How-To
I should use chr(10) instead of \n. Therefore, the SQL statement will be updated as bellows:
1 2 | insert into test (project_id, name, content) values(5, 'test', 'aaa' || chr(10) || 'bbb'); |
Labels:
Database
2018/07/08
[PostgreSQL] Example for with...as..insert into
Problem
I try to get data from intent and utter_template, and insert data into story when data is not existed.
How-To
Here has the example:
I try to get data from intent and utter_template, and insert data into story when data is not existed.
How-To
Here has the example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | with source as ( select t.project_id, t.intent, t.utter_template, t.story_name from ( select t1.project_id, '* _' || t1.value || chr(10) as intent, ' - ' || t2.name || chr(10) utter_template, 'story_' || substring(t1.value from 4) story_name from (select * from intent where project_id=:project_id and value like 'qa_%') t1, (select * from utter_template where project_id=:project_id and name like 'utter_qa%') t2 where substring(t1.value from 4) = substring(t2.name from 10) ) t where (t.story_name) not in (select name from story where project_id=:project_id) ) insert into story (project_id, name, content) (select project_id, story_name, intent || utter_template from source) |
Labels:
Database
2018/07/07
[Git] How to remove directory from git repository?
Problem
I had committed and pushed target folder to git repository by accident. How to remove it?
How-To
You can remove target folder by the following process:
Here has the result after removing target folder
I had committed and pushed target folder to git repository by accident. How to remove it?
How-To
You can remove target folder by the following process:
Here has the result after removing target folder
Labels:
Git
2018/07/06
[Java] How to compare two Integers in Java?
Problem
Here has a sample code to compare two Integers, why it return false?
How-To
Owing to == between Integer will check for its reference equality, so it will return false.
If you would like to compare with its value, you need to get its intValue().
Here has the updated sample code:
Here has a sample code to compare two Integers, why it return false?
1 2 3 4 5 6 7 8 9 10 11 12 13 | package test.albert; import lombok.extern.slf4j.Slf4j; @Slf4j public class App { public static void main(String[] args) { Integer num1 = 554; Integer num2 = 554; Boolean result = num1 == num2; log.debug("compare result = " + result); } } |
How-To
Owing to == between Integer will check for its reference equality, so it will return false.
If you would like to compare with its value, you need to get its intValue().
Here has the updated sample code:
1 2 3 4 5 6 7 8 9 10 11 12 13 | package test.albert; import lombok.extern.slf4j.Slf4j; @Slf4j public class App { public static void main(String[] args) { Integer num1 = 554; Integer num2 = 554; Boolean result = (num1.intValue() == num2.intValue()); log.debug("compare result = " + result); } } |
Labels:
Java
Subscribe to:
Posts (Atom)