Total Pageviews

2015/01/08

How to get changes from master into branch via egit

Question
 I am working in getDebtSpaceData branch.















Assume the DebtTypeEnum had been updated in master branch
 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
package gov.nta.dbm.enumeration;

// TODO: Auto-generated Javadoc
/**
 * The Enum DebtTypeEnum.
 */
public enum DebtTypeEnum {

    /** The a. */
    A("A", "公債"),
    /** The b. */
    B("B", "國庫券"),
    /** The c. */
    C("C", "中長借"),
    /** The d. */
    D("D", "短借");

    private String code;
    private String name;

    private DebtTypeEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }

    /**
     * Gets the code.
     * 
     * @return the code
     */
    public String getCode() {
        return code;
    }

    /**
     * Gets the name.
     * 
     * @return the name
     */
    public String getName() {
        return name;
    }

}

Therefore, the DebtTypeEnum in getDebtSpaceData branch is out-of-date.

 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
package gov.nta.dbm.enumeration;

// TODO: Auto-generated Javadoc
/**
 * The Enum DebtTypeEnum.
 */
public enum DebtTypeEnum {

    /** The a. */
    A("A", "公債"),
    /** The b. */
    B("B", ""),
    /** The c. */
    C("C", ""),
    /** The d. */
    D("D", "");

    private String code;
    private String name;

    private DebtTypeEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }

    /**
     * Gets the code.
     * 
     * @return the code
     */
    public String getCode() {
        return code;
    }

    /**
     * Gets the name.
     * 
     * @return the name
     */
    public String getName() {
        return name;
    }

}

If I would like to pull up-to-date code from master branch and merge into getDebtSpaceData branch. How to do this?

Answer
Step1. Right click => Team => Merge
 Step2. Choose Master => Merge


Step3. Click OK


In getDebtSpaceData branch, we can see the content of DebtTypeEnum is up-to-date.

Reference

2015/01/01

[閱讀筆記] 綠角的基金八堂課


  1. 所謂的會投資,指的是不要冒不必要的風險,不要犯可以避免的錯誤就好了 
  2. 高波動(高風險)不一定有高報酬,高風險可能最後帶來的是高虧損  
  3. 投資的目的,不在於創造可以拿出來誇耀的成績,而是在於達成自己的財務目標  
  4. 高風險策略往往不是高報酬策略。畢竟,投資靠的不是敢冒險的衝動,而是懂得控制風險的謹慎  
  5. 不要自信滿滿地以為不會遇到壞事,那不是風險控制。要假設壞事有可能發生,但就算遇到,損失也因為事先採取了防範而被控制在一定範圍內,這才是風險管控  
  6. 分散投資要有兩種特性:廣泛持有(如買進共同基金或ETF)、成本低廉(包括金錢成本與時間成本)  
  7. 過去績效,對於未來績效幾乎沒有預測能力  
  8. 5050選基金法:基金總開銷比率(包含經理費、銀行保管費等)要在0.50%以下、基金年周轉率(即基金更換持股頻率)要在50%以下  
  9. 與其參考過去績效,投資人更應該留意基金的內扣成本。內扣成本越小的基金,未來越容易有好表現,這才是買基金最該注意的事情  
  10. 指數化投資教父John Clifton Bogle說:假如投資能指能靠一個標準來挑選未來表現優越的基金,避開未來績效不彰的基金,這個標準就是基金費用 
  11. 投資人有兩種,一是被動投資人,另一個則是主動投資人。因為被動投資人持有指數型基金,拿到的是市場報酬,然而主動投資人所拿到的,不多不少,也剛好是市場報酬 
  12. 巴菲特曾說:股市預測者的唯一價值,在於讓算命仙看起來更準一些 
  13. 彼得學林曾說:我也想要可以預測市場走向和事先知道景氣衰退,但是這是不可能的。我寧願和巴菲特一樣,尋找有獲利潛能的公司 
  14. 古希臘哲學家Democritus曾說:智者與笨蛋的差別在於,智者寄望他所能取得的,笨蛋在追求不可能的事情 
  15. 定期定額的目的,在於讓投資人將自己的資金看成一條水流,將資金分散在廣大帶狀的投入時點上,暴露在各種經濟環境中,避免整體資金遭逢單一時段不佳報酬的風險 
  16. 能拿出多少資本來投資、累積,才是真正決定最後終點價值多寡的決定要素 
  17. 定期定額有壓低平均買進成本的效用;定股投資可以確保投資人在長期上漲的走勢中持續買入、參與市場;定期定值則可讓投資人低點多買,高點少買甚至賣出,有機會將投資成本壓低 
  18. 投資的重點不僅是報酬率,最後累積金額的多寡,往往才是重點 
  19. 定期定額若沒有將投資金額跟隨著通膨與市長的成長同步調升,會造成投入市場的累積資金相對減低。定期定值在市場上漲時少買,甚至賣出的動作,一樣會造成投入資金減少的問題 
  20. 定期定額與定期定值都有可能因為通膨的關係,導致投入市場的資本減少,因此而降低了獲利的額度。解決方法,則是每隔一段期間,向上調整投資的額度 
  21. 停損停利要在可以預知未來市場走勢時,才會有效 
  22. 股票有較高的期望報酬,但它未必有較高的實際報酬。有時候回顧過去,我們會看到股票實現了他的風險,而不是他的期望報酬  
  23. 投資應是針對未來各種不同的經濟狀況做準備。不同的資產類別有不同的作用:景氣好的時候,股票讓你參與經濟成長;通貨緊縮時,現金有保值效果;通膨時,抗通膨債券可以維持你的購買力;金融動盪之際,高評等公債金發揮保護的效果 
  24. 不是去臆測未來的經濟發展才是投資專業,替未來的各種可能做好準備,才是務實之策 
  25. 資產配置的重點在於處理未來不確定結果的風險,這是投資的要義  
  26. 資產配置的目的,不在於讓投資人壓寶,看能否買種未來爆發大漲的市場,而是讓投資人的投資組合可以適應不同的狀況,在各種不同的場景下,都還能有還不錯的表現  
  27. 大多投資人只注意上漲可以賺多少,其實擴大報酬率的要訣之一,在於少賠。也就是說,假如能限縮投資組合虧錢的幅度,你就可以擴大賺錢的機會 
  28. 投資人該問自己的問題,不是假如股市重挫時,自己是否有準備,而是當股市重挫時,自己是否準備好了 
  29. 將投資組合中納入低風險資產,首要原因是為了控制下跌幅度,讓投資人更有機會安然度過熊市,並更容易從較淺的受挫中復原 
  30. 低風險資產可以確保投資組合的價值穩定性,當用錢的時刻逐漸靠近,投資人可以確信手上的錢,不會在短時間內經歷大幅的減值 
  31. 高評等公債,可以在金融風暴之際,成為資金避風港,逆勢上漲,故低風險資產可以選用高評等公債 
  32. 公司債與高收益債不適合視為低風險資產,因為股市沉淪時,這兩種資產也無法倖免  


2014/12/31

2014/12 九州

Tenjin (天神) 街頭


太宰府天満宮 参道


太宰府天満宮


太宰府天満宮


Kōmyōzen-ji



Hakata Station


湯の坪街道


金鱗湖


一蘭 本社総本店


2014/12/25

Apache CollectionUtils 應用

Assume we had 2 list data
 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
      //create a value object and add into list1
        UnpaymentDataVo vo1 = new UnpaymentDataVo();
        vo1.setDebtType("B");
        vo1.setBudgetCode(new BigDecimal(1));
        vo1.setDebitName("總預算");
        vo1.setDamt(new BigDecimal(5156340000000L));
        vo1.setCamt(new BigDecimal(3489209150690L));
        vo1.setIamt(new BigDecimal(69360745739L));
        vo1.setRamt(new BigDecimal(1597620103571L));

        List<UnpaymentDataVo> list1 = new ArrayList<UnpaymentDataVo>();
        list1.add(vo1);

 //create 2 value objects and add into list2
        UnpaymentDataVo vo2 = new UnpaymentDataVo();
        vo2.setDebtType("A");
        vo2.setBudgetCode(new BigDecimal(2));
        vo2.setDebitName("易淹水地區水患治理計劃第2期特別預算");
        vo2.setDamt(new BigDecimal(7500000000L));
        vo2.setCamt(new BigDecimal(0));
        vo2.setIamt(new BigDecimal(637500000L));
        vo2.setRamt(new BigDecimal(7500000000L));

        UnpaymentDataVo vo3 = new UnpaymentDataVo();
        vo3.setDebtType("A");
        vo3.setBudgetCode(new BigDecimal(1));
        vo3.setDebitName("振興經濟擴大公共建設特別預算");
        vo3.setDamt(new BigDecimal(204400000000L));
        vo3.setCamt(new BigDecimal(0));
        vo3.setIamt(new BigDecimal(14465750000L));
        vo3.setRamt(new BigDecimal(204400000000L));

        List<UnpaymentDataVo> list2 = new ArrayList<UnpaymentDataVo>();
        list2.add(vo2);
        list2.add(vo3);

 //print list1 and list2
        log.debug("list1=" + list1.toString());
        log.debug("list2=" + list2.toString());

The data structure looks like this:
1
2
3
- list1=[UnpaymentDataVo(debtType=B, budgetCode=1, debitName=總預算, damt=5156340000000, camt=3489209150690, iamt=69360745739, ramt=1597620103571)]
- list2=[UnpaymentDataVo(debtType=A, budgetCode=2, debitName=易淹水地區水患治理計劃第2期特別預算, damt=7500000000, camt=0, iamt=637500000, ramt=7500000000), 
         UnpaymentDataVo(debtType=A, budgetCode=1, debitName=振興經濟擴大公共建設特別預算, damt=204400000000, camt=0, iamt=14465750000, ramt=204400000000)]


If you would like to find out the data from list2 which condition is debt_type='A' and budget_code=2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
        // find out the data from list2 which condition is debt_type='A' and budget_code=2
        List<UnpaymentDataVo> searchResult = new ArrayList<UnpaymentDataVo>();
        CollectionUtils.select(list2, new Predicate() {
            @Override
            public boolean evaluate(Object object) {
                UnpaymentDataVo vo = (UnpaymentDataVo) object;
                return "A".equals(vo.getDebtType())
                        && vo.getBudgetCode().compareTo(new BigDecimal(2)) == 0;
            }
        }, searchResult);

        log.debug("searchResult = " + searchResult.toString());

The search result looks like this:
1
2
- searchResult = [UnpaymentDataVo(debtType=A, budgetCode=2, debitName=易淹水地區水患治理計劃第2期特別預算, damt=7500000000, camt=0, iamt=637500000, ramt=7500000000), 
]

If you would like to get  a Collection containing the union of list1 and list2
1
2
3
4
        // Returns a Collection containing the union of the given Collections
        List<UnpaymentDataVo> unionResult = (List<UnpaymentDataVo>) CollectionUtils.union(list1,
                list2);
        log.debug("unionResult = " + unionResult.toString());

The union result looks like this:
1
2
3
- unionResult = [UnpaymentDataVo(debtType=A, budgetCode=2, debitName=易淹水地區水患治理計劃第2期特別預算, damt=7500000000, camt=0, iamt=637500000, ramt=7500000000), 
                 UnpaymentDataVo(debtType=A, budgetCode=1, debitName=振興經濟擴大公共建設特別預算, damt=204400000000, camt=0, iamt=14465750000, ramt=204400000000), 
   UnpaymentDataVo(debtType=B, budgetCode=1, debitName=總預算, damt=5156340000000, camt=3489209150690, iamt=69360745739, ramt=1597620103571)]


If you would like to return a collection which contains unionResult - list2
1
2
3
4
        // Returns a new Collection containing a - b.
        List<UnpaymentDataVo> subtractResult = (List<UnpaymentDataVo>) CollectionUtils.subtract(
                unionResult, list2);
        log.debug("subtractResult = " + subtractResult.toString());

The subtract result looks like this:
1
- subtractResult = [UnpaymentDataVo(debtType=B, budgetCode=1, debitName=總預算, damt=5156340000000, camt=3489209150690, iamt=69360745739, ramt=1597620103571)]



Reference
[1] https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/CollectionUtils.html#subtract(java.util.Collection, java.util.Collection)

[Oracle] Use to_char to format date column

Question
I have two column, ISSUE_DATE & DUE_DATE, with date data type.
But I only new YYYYMM not YYYYMMDD in report, how to format them?

Answer
We can use TO_CHAR to fulfill this requirement.

The to_char syntax is:
TO_CHAR( value, [ format_mask ], [ nls_language ] )

  • value can either be a number or date that will be converted to a string.
  • format_mask is optional. This is the format that will be used to convert value to a string.
  • nls_language is optional. This is the nls language used to convert value to a string.

Example.
1
2
3
4
5
6
SELECT ID, 
        DUE_DATE, 
        TO_CHAR( DUE_DATE, 'YYYYMM') FORMATED_DUE_DATE,
        ISSUE_DATE,
        TO_CHAR( ISSUE_DATE, 'YYYYMM') FORMATED_ISSUE_DATE
FROM ISSUE_MAIN



Reference
[1] http://www.techonthenet.com/oracle/functions/to_char.php

2014/12/22

市場乘數 (平均本益比)

無論是漫步華爾街或是彼得學林的學以致富的書籍中,作者都有提到不要買價格超過其實際價值的股票,強調用本益比來挑選股票的重要性。

如果想知道目前本隻本益比是偏高或偏低,可以看過去的歷史紀錄來判斷。
以中華電信為例,目前中華電信(2412)的本益比是18.05

我們可以去查一下過去五年來的最高平均、最低平均以及平均本益比的值
根據下圖的資訊,可以得知99~103年的歷年最高、最低本益比資訊,故:
  • 平均最高本益比 = (19 + 20 + 18 + 18 + 16) / 5 = 18.2
  • 平均最低本益比 =  (17 + 17 + 14 + 14 + 13) / 5 = 15
  • 平均本益比 = 16.6



由上述資訊可以看出目前中華電信本益比為18.05,屬於接近偏高

然而以上是用單支股票的方式來看,在學以致富此本書中有提到,我們也可以一次挑選多家公司,把他們的股價加起來,然後除以它們的盈餘,就可以得出一個平均本益比。在華爾街,人們用此方式計算道瓊工業指數、S&P 500指數的本益比,得出所謂的市場乘數(Market Multiple),也就是平均本益比,其代表著人們願意以多高的價格買下多少盈餘的公司。

在台灣的話,我們可以參考台灣50的成分股,以下是50檔台灣50的本日股價與EPS相關資訊:


代號 公司名稱 股價 EPS
3474 華亞科 47.60 7.10
4938 和碩 72.50 4.94
3481 群創 14.95 0.97
2330 台積電 138.50 8.82
2303 聯電 14.45 0.66
2882 國泰金 46.15 3.63
2357 華碩 335.00 27.68
1303 南亞 61.60 4.43
2883 開發金 9.83 0.68
1301 台塑 68.00 3.79
2002 中鋼 26.10 1.22
2311 日月光 39.10 2.55
2317 鴻海 88.00 8.21
1402 遠東新 30.05 2.23
2892 第一金 18.45 1.44
2880 華南金 17.40 1.30
2801 彰銀 18.00 1.36
1216 統一 48.60 2.00
1101 台泥 42.45 2.89
1102 亞泥 37.85 2.76
2382 廣達 78.50 4.88
2308 台達電 186.00 8.31
1326 台化 64.50 3.39
2886 兆豐金 24.10 2.28
2891 中信金 20.40 2.66
2325 矽品 48.20 3.50
2105 正新 71.60 5.13
2395 研華 216.00 7.44
2408 南科 73.90 10.30
2412 中華電 92.60 5.12
2409 友達 15.10 1.30
2207 和泰車 463.00 16.63
2301 光寶科 36.00 3.24
9904 寶成 38.10 2.94
2912 統一超 245.00 8.76
2354 鴻準 87.60 5.21
2474 可成 242.00 19.40
3045 台灣大 99.90 5.78
2454 聯發科 455.00 29.64
2881 富邦金 49.45 5.81
2887 台新金 12.90 1.62
4904 遠傳 69.90 3.71
2885 元大金 15.20 1.53
3008 大立光 2,325.00 113.67
2498 宏達電 136.50 1.62
2884 玉山金 19.55 1.50
2890 永豐金 12.80 1.53
6505 台塑化 66.20 3.02
5880 合庫金 18.45 1.26
2227 裕日車 327.00 20.60

上述50檔台灣50的股價total為 6785.03,盈餘的total為 390.44,把股價 (6785.03) 除以盈餘 (390.44) ,可以得到這50檔的平均本益比為17.38


Total 股價 Total 盈餘 市場乘數 (市場平均本益比)
6785.03 390.44 17.38

我們就可以拿17.38這個數字做為參考,人們願意購買的本益比的股票約為17.38,代表著人們願意以多高的價格買下多少盈餘的公司股票,若過高的話就要考慮一下了,這個或許也可以作為一個股票買賣的一個參考


Reference

[1] http://www.twse.com.tw/ch/trading/indices/twco/tai50i.php
[2] http://www.cnyes.com/twstock/profile/2412.htm
[3] http://jsjustweb.jihsun.com.tw/z/zc/zca/zca_2412.djhtm

How to Determine if the Date Format is Correct or Not in Java

Problem
We hope the date parameter should be yyyyMMdd format and only accept Western calendar system. 
If user provide a date parameter with Minguo calendar, it should return error to user.

Solution
This DateUtils class provides an isCorrectDateFormatWithWesternYear method, it will

  • return false if date format is incorrect
  • return true if date format is correct

We define the expected format in Line 24.
Set lenient to false with strict parsing, and call parse method to check the parse result.
 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
46
47
48
49
50
51
package gov.nta.dbm.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import lombok.extern.slf4j.Slf4j;

/**
 * The Class DateUtils.
 */
@Slf4j
public class DateUtils {

    /**
     * Checks if is correct date format with western year.
     * 
     * @param dateStr
     *            the date str
     * @return the boolean
     */
    public static Boolean isCorrectDateFormatWithWesternYear(String dateStr) {
        Boolean isCollect = Boolean.FALSE;
        // instantiate SimpleDateFormat object with specific date format
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        try {
            // Specify whether or not date/time parsing is to be lenient. With lenient parsing, the
            // parser may use heuristics to interpret inputs that do not precisely match this
            // object's format. With strict parsing, inputs must match this object's format
            dateFormat.setLenient(false);
            // call parse method, return true if parse successfully, return false if fail to parse.
            dateFormat.parse(dateStr);
            isCollect = Boolean.TRUE;
        } catch (ParseException e) {
            isCollect = Boolean.FALSE;
            e.printStackTrace();
        }
        return isCollect;
    }

    /**
     * The main method.
     * 
     * @param args
     *            the arguments
     */
    public static void main(String[] args) {
        log.debug("test1=" + DateUtils.isCorrectDateFormatWithWesternYear("20141231"));
        log.debug("test1=" + DateUtils.isCorrectDateFormatWithWesternYear("1031222"));
    }

}

In main method, we input "20141231" and "1031222" to do test, and here is the test result:
1
2
3
4
5
6
15:34:00.446 [main] DEBUG gov.nta.dbm.utils.DateUtils - test1=true
java.text.ParseException: Unparseable date: "1031222"
 at java.text.DateFormat.parse(DateFormat.java:357)
 at gov.nta.dbm.utils.DateUtils.isCorrectDateFormatWithWesternYear(DateUtils.java:31)
 at gov.nta.dbm.utils.DateUtils.main(DateUtils.java:48)
15:34:00.453 [main] DEBUG gov.nta.dbm.utils.DateUtils - test1=false


Reference
[1] http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html