江恩十二條買賣法則之五
江恩十二條買賣法則之五:市場分段運動
股市按三到四段,或三至四浪運動。
這裡,將是我對我所學的知識做一簡要記載的地方,包括股票、攝影、程式設計。
這裡的資料,並不受限於一般部落格之以日為主的發佈流程。舊發佈內容將隨時可被更動修正,以維持資料之正確性。
KEVIN
江恩十二條買賣法則之五:市場分段運動
股市按三到四段,或三至四浪運動。如果市場剛向上運行了第一段,永遠不要認為它已經到達了最終的頭部,因為如果這是一個真正的牛市,它會在到達頭部前至少運行三段,而且很可能是四段。
在熊市下跌市道中,當市場剛走完第一跌或第一段時,千萬不要認為市場已到達底部,因為在熊市過去以前,它會運行三段,甚至可能是四段。
江恩十二條買賣法則之四:按三週上漲或下跌買賣。
江恩在對金融市場做了十分廣泛性的統計,他將市場反彈或調整的買賣歸納為兩點:
當市場逆趨勢出現調整或反彈時,江恩認為在以下的時間必須留意市勢的發展:
江恩十二條買賣法則之三:按百分比買賣。
只要這些下跌或反彈處於主要的趨勢之中,正如利用平均指數的百分比那樣,你可以利用個股的百分比判斷支撐阻力位和買賣點。
你可以使用:
這些百分比,其中最重要的阻力位是50%,其次是100%,也可再加入100%的倍數比例(其取決於從最高價或最低價開始的價格和時間週期),第三是25%,第四是12.5%,第五是6.25%(這儘在平均指數或個股在非常高的價位時使用),第六是33.33%和66.66%。
圖2 調整浪的支持水平
江恩十二條買賣法則之二:在單底、雙底和三重底買入(在單頂、雙頂和三重頂賣出)。
雙頭和雙底的意義:
江恩十二條買賣法則之一:研判趨勢。
江恩認為,對於所有市場,決定其趨勢是最重要的一點,至於如何決定其趨勢,學問便在裡面。
對於股票而言,其平均綜合指數最為重要,以決定大市的趨勢。此外,分類指數對於市場的趨勢亦有相當啟示性。所選擇的股票,應以根據大市的趨勢者為主。若將上面規則應用在外匯市場上,則"美元指數"將可反映外匯走勢的趨向。
在應用上面規則時,他建議分析者使用一種特殊的圖表方式,對於大市指數來說,應以三天圖及平均指數九點轉向圖(九點平均波動圖)為主。
圖1 恒生指數三天圖
三天圖的意思是,將市場的波動,以三天的活動為記錄的基礎。這裡的三天是自然日,包括週六和週日,而並非交易日。三天圖表的規則是,當三天的最低水平下破,則表示市場會向下;當三天的最高水平上破,則表示市場會出現新高。
繪圖方法上,可按照以下步驟:
除了三天圖外,江恩還建議使用一種名為平均指數九點轉向圖(九點平均波動圖)分析市勢。
圖2 恒生指數九點圖, 每單位等於10點
江恩所應用的,是在1912至1949年的道瓊工業平均指數之上,江恩的統計如下:
因此,市場上落9點至21點,是一個重要的市場轉折的指標。
平均指數九點轉向圖(九點平均波動圖)的規則是:
對於上升的市道中,規則亦一樣。
在制作圖表時,若市況上升超過9點,圖表線可作上升,圖表線跟隨每日高點上移,直至市場出現9點的下跌,圖表線才跟隨下移至當日低點。
三天圖及九點圖與點數圖十分類似,都是以跟隨市勢的方式繪製。不過,江恩上述圖表有幾點需要注意:
江恩十二條買賣法則:
江恩二十一條買賣守則:(以下有二十五條,是另外從別的文獻中補充進來的)
江恩理論是以研究測市為主的,江恩通過數學、幾何學、宗教、天文學的綜合運用,建立起自己獨特的分析方法和測市理論。由於他的分析方法具有非常高的準確性,有時達到令人不可思議的程度,因此很多江恩理論的研究者非常注重江恩的測市系統。但在測市系統之外,江恩還建立了一整套操作系統,當測市系統發生失誤時,操作系統將及時地對其進行補救。江恩理論之所以可以達到非常高的準確性,就是將測市系統和操作系統一同使用,相得益彰。
江恩在1949年出版了他最後一本重要著作《在華爾街45年》,此時江恩已是72歲高齡,他坦誠的披露了縱橫市場數十年的取勝之道。其中江恩十二條買賣法則是江恩操作系統的重要組成成份,江恩在操作中還制定了二十一條買賣守則,江恩嚴格地按照十二條買賣法則和二十一條買賣守則進行操作。
江恩認為,進行交易必須根據一套既定的交易的規刖去操作,而不能隨意地買賣,盲目地猜測市場的發展情況。隨著時間的轉變,市場的條件也會跟隨轉變,投資者必須學會跟隨市場的轉變而轉變,而不能認死理。
江恩告戒投資者:在你投資之前請先細心研究市場,因為你可能會做出與市場完全相反的錯誤的買賣決定,同時你必須學會如何去處理這些錯誤。一個成功的投資者並不是不犯錯誤,因為在證券市場中面對千變萬化、捉摸不定的市場,任何一個人都可能犯錯誤,甚至是嚴重的錯誤。但成敗的關鍵是成功者懂得如何去處理錯誤,不使其繼續擴大;而失敗者因猶豫不決、優柔寡斷任錯誤發展,並造成更大的損失。
江恩曾出版過一些股票書籍,但是卻沒有一本比《華爾街45年》更能真正透露江恩成功的秘密。在這本書中所看到最多的字眼並非什麼江恩角度線、什麼時間周期或是輪中輪等,而是『停損單』三個字。單單在第二章,『停損單』便已經出現了8次之多。每一次出現,江恩都指出其重要性。
江恩說,大多數人在股市中輸錢主要有三個原因:
註:
止蝕單又稱停止委託單(Stop Order),它是指只有當市價達到某一指定價格,委託單才可執行,此時它變為市價委託單(如果下的是停止委託單)或限價委託單(如果下的是限價停止委託單(Stop Limit Order))。買入停止委託單(相對空頭倉位或空倉)是指,只有當市價漲至指定價格時,委託單才可執行(亦即以指定價格或指定價格以上成交);賣出停止委託單(相對多頭倉位或多倉)是指,只有當市價跌至指定價格時,委託單才可執行(亦即以指定價格或指定價格以下成交)。在投資者不能經常性的觀察市場時,停止委託單尤其有用,市場變動引發的交易能使投資者保存利潤,或限制損失。停止委託單有兩種風險,其一,證券價格有時會突然發生變動(這一變動方向可能是暫時性的),從而導致證券過早成交;其二,指定價格一旦到達,停止委託單就變成了市價委託單,其執行價存在不確定性。
江恩在書中的建議是停損單設在買入價之下3~5%,考慮到市場波動幅度不同,或許可以放寬停損單的範圍,例如5~10%。
江恩理論的測市系統部份很多地方抽象難懂,不易理解,但江恩的操作系統和買賣規則卻清楚明確,非常容易理解。江恩的操作系統是以跟隨市場買賣為主,這與他的預測系統完全不同,江恩非常清楚地將買賣操作系統與市場預測系統分開,使他能在一個動盪充滿危機的年代從事投機事業而立於不敗之地。
江恩理論的實質就是在看似無序的市場中建立了嚴格的交易秩序,他建立了江恩時間法則、江恩價格法則、江恩線等。它可以用來發現何時價格會發生回調和將回調到什麼價位。
江恩線的數學表達有兩個基本要素,這兩個基本要素是價格和時間。江恩通過江恩圓形、江恩螺旋正方形、江恩六邊形、江恩輪中輪等圖形將價格與時間完美的融合起來。在江恩的理論中,『七』是一個非常重要的數字,江恩在劃分市場周期循環時,經常使用『七』或『七的倍數』,江恩認為七融合了自然、天文與宗教的理念。
江恩線是江恩理論與投資方法的重要概念,江恩在X軸上建立時間,在Y軸上建立價格,江恩線符號由『TXP』表示。江恩線的基本比率為1:1,即一個單位時間對應一個價格單位,此時的江恩線為45度。通過市場的分析,江恩還分別以3和8為單位進行劃分,如1/3和1/8等,這些江恩線構成了市場回調或上升的支撐位和阻力位。
通過江恩理論,我們可以比較準確的預測市場價格的走勢與波動,成為股市的贏家。當然,江恩理論也不是十全十美的,不能指望它使你一夜暴富,但是經過努力,在實踐中體會江恩理論的真締,他一定會使你受益匪淺。
記住永遠不要背離趨勢。在你決定市場趨勢時,隨其而動。遵守準則以決定趨勢,不要以猜測和希望來做交易。
威廉‧江恩 (Willian Delbert Gann) --- 二十世紀最著名的投資家之一。
威廉‧江恩在股票和期貨市場上的驕人成績至今無人可比,他所創造的把時間與價格完美的結合起來的理論,至今仍為投資界人士所津津樂道、倍加推崇。
江恩於1878年6月6日(或說6月15日)出生於美國德克薩斯州的路芙根市(Lufkin Texas),父母是愛爾蘭裔移民。少年時代的江恩在火車上賣報紙和送電報,還販賣明信片、食品、小飾物等。
1902年,江恩在24歲時,第一次入市買賣綿花期貨。
1906年,江恩到俄克拉荷馬當經紀人,既為自己炒,亦管理客戶。
在1908年,江恩30歲時,他移居紐約,成立了自己的經紀業務。同年8月8日,發展了他最重要的市場趨勢推測方法,名為『控制時間因素』。經過多次準確預測後,江恩聲名大噪。
最為人矚目的是1909年10月美國"The Ticketr and Investment Digest(股票行情與投資文摘)"雜誌編輯Richard . Wyckoff的一次實地訪問。在雜誌人員的監察下,江恩在十月份的二十五個市場交易日中共進行286次買賣,結果264獲利,22次損失,獲利率竟達92.3%。 而資本額則增加了十倍,平均交易時間間隔是20分鐘。
在投資生涯中,成功率高達80%~90%,他用小錢賺取了巨大的財富,在其五十三年的投資生涯中共從市場上取得過三億五千萬美元的純利。
據江恩的一位朋友基利的回述:『1909年夏季,江恩預測9月小麥期權將會見1.20美元。可是,到9月30日芝加哥時間十二時,該期權仍然在1.08美元之下徘徊,江恩的預測眼看落空。江恩說:'如果今日收市時不見1.20美元,將表示我整套分析方法都有錯誤。不管現在是什麼會,小麥一定要見1.20美元。' 結果,在收市前一小時,小麥衝上1.20美元,震動整個市場,該合約不偏不倚,正好在1.20美元收市。』
江恩的事業高峰期,他共聘用二十五人,為他制作各種分析圖表及進行各類市場走勢研究,並成立兩間走勢研究公司:江恩科學服務公司及江恩研究公司,出版多種投資通訊。在他每年出版的全年走勢預測中,他清楚的繪製在什麼時間見什麼價位的預測走勢圖,精準性甚高。
江恩相信股票、期貨市場裡也存在著宇宙中的自然規則,市場的價格運行趨勢不是雜亂的,而是可通過數學方法預測的。江恩的數學方程並不複雜,實質就是價格運動必然遵守支撐線及壓力線,也就是---江恩線。
相機買回家,除了測試所有部件是否齊全及正常外,最重要的一件事,就是充電。
富士F100fd的電池,使用的是與F50fd相同規格的NP-50可充式鋰電池(3.7V,1000mAh),而使用的充電器型號為BC-50。
網路上有人說:『充電器直接內建旋出式插頭,非常適合旅行』,不知是不是因為我買的是水貨,我的BC-50充電器上並沒有內建旋出式插頭,只有電源線接孔。不過,網路上的那個訊息,他所拍出的充電器照片,也沒有拍出旋出式插頭的模樣,所以,沒有照片沒真象,真實情況是怎樣就不得而知了。
據店家老闆告知,充電池第一次充電時,要充6~8個小時,而我則給它充7個小時(呵呵,取中間值)。之後,每次再充時,只要看充電器上的燈號是否由紅燈轉為綠燈就好了。大約是將近兩個鐘頭吧,我都是充兩個鐘頭就拔起來了(說明書上寫大約是2.3小時)。原則上,充飽電後,好的充電器會對充電池做保護,不會令其過充而造成傷害,但,這個BC-50充電器沒有看到這樣的訊息,所以我也不敢隨意嚐試,只等自己可掌控的時間時,才進行充電動作。
底下,是說明書上對充電指示燈的狀態說明:充電指示燈:關閉 -> 未裝入電池
亮綠燈 -> 電池充電完成 -> 從電池充電器取出電池
亮紅燈 -> 正在充電
紅燈閃爍 -> 充電時電池出現故障 -> 拔掉電池充電器插頭,並從電池充電器中取出電池
注意事項:不使用時,請將電源充電器從電源插座中拔出。
低溫時充電,時間會延長。
即使閒置不用,NP-50電池也會逐漸放電,請在拍照前(之前一兩天)對NP-50進行充電。
NP-50所提供的只有1000mAh,雖然比另一款NP-40的850mAh多了些,但,始終覺得還不夠。我問店家老闆有沒有較大容量的電池可用,老闆說沒有。不過,老闆說,F100fd置放NP-50充電池的插槽,他感覺電池放進去時空間還鬆鬆的,他主觀性的認為將來可能會有更大容量的電池會出,他會上日本網站注意,如果有,客戶若需要,他會想辦法進貨。
原則上,NP-50充飽電後,按照官方說法,可以拍照230張,我沒有實測,所以不是很清楚。我有另外多買一顆副廠電池,在大部份時間裡都還夠用,但是,如果出野外時間太久又使用量過大時,應該會不夠用,到時,還是得再多買一兩顆備用才行。
說明書上有提到,如果您要使用交流電源為相機供電(它的意思是指不透過NP-50充電池,而是直接由電源插座連接至相機),需要使用另售的AC電源適配器(AC-5VX)和DC連接器(CP-50),此二者必須串連使用。(應該沒這必要吧,這樣反而大費周章,只不過,若拍攝位置不需遠離電源,那還真的可以讓電源源源不斷,除非停電,否則永遠不怕沒電)
富士小DC史上夜拍能力最強的機種F31fd,其所使用的充電池是NP-95,為3.6V、1800mAh,其電池續航力,顯然確實比NP-50大上許多。F40fd則使用NP-70,為3.7V、1500mAh,也比NP-50之續航力好。
PChome Online裡有賣這些電池,不懂為什麼富士要把電池搞得這麼複雜,為什麼不能共用,是否是相機內電路上的需求所致,我就不知道了。
2008/4/25,終於買了一台Fujifium(富士)F100fd來玩。在這之前,因為原有的Ricoh R1被小孩弄丟了,而手中有一台DSLR(Nikon D70s)可用,在沒有看到滿意的DC機種前,就一直忍著了。
因個人習慣需求,看中F100fd的理由有幾項:
不過,從雜誌上看到另一台DC將來要上市,規格性能可能都會更好,倒是可以注意看看:Sony Cyber-Shot W170,一樣是28~140mm,其餘功能似乎不錯,要上網查。
當天,買之前先問過兩個地方,一是燦坤(現場看到現貨),為公司貨,售價13500(其餘細節未問);另一是博愛路某家知名攝影器材行(電話直接詢問),一樣是公司貨,全配(含4G記憶卡,原廠相機皮套),售價13500。結果我到NOVA找,最後買的是水貨,單機售價9500。跟公司貨的差別,應該主要是在維修、及附加完整配備、還有中文說明書。
我所買及花費如下:單機:9500(附一顆原廠NP-50充電式鋰電池、一組原廠充電器及電源連接線、一條AV端子連接線、一條USB傳輸線、一本F50fd影印說明書)。
F50fd說明書,到目前還沒翻過,自己動手摸索就會用了。
一顆副廠電池:500。
一片創見SDHC卡(8G):1100。
一個小包包:200。
一片螢幕保護貼:200(含幫忙貼好)。
共花11500元。
以下是富士F100fd的規格說明: 有效畫素: 1200 萬
最大靜態影像: 4000x3000 像素
最大動畫: 640x480 像素
感光元件形式: 1/1.6吋super CCD HR
光學變焦: 5 倍
焦距換算: 28-140 mm
最大光圈: F3.2
數位變焦: 8.2 倍
未壓縮格式: 無
鏡片規格: 群枚
一般對焦最近距離: 45 cm
微距對焦最近距離: 5 cm
白平衡種類: 自動 / 日光 / 陰天 / 鎢絲燈 / 螢光燈 / 自設
ISO感光度: 100-12800
最高快門速度: 1/1600 秒
最低快門速度: 1/4 秒(夜景模式最長可至8秒)
測光系統: TTL256分割測光/點測光
曝光補償: ±+ / - 2級
重複曝光: 無
視度調整: 有
內置閃燈: 有
閃燈有效距離: W:0.6-4.3m T:0.6-2.8m
自拍器: 2 / 10 秒
連拍速度: 1.7 張/秒
連拍最多: 3 張
外接閃燈: 不可
機背LCD: 2.7 吋
語言: 日語/英語
單獨錄音功能: 有
傳輸介面: USB2.0
記憶卡: SD / XD / 內置記憶體
尺寸: 97.7(寬)x58.9(高)x23.4(深)mm
重量: 170 克
電源: 充電式鋰電池(NP-50)
買回來後,有個小插曲,給將來碰到同樣問題者一個經驗分享。
因為當場沒有先做大幅度的測試,回家開始使用相機時,碰到第一個問題是,記憶卡無法順利使用,可拍可寫但卻讀取不順,尤其是使用動畫模式時。
剛好,我手邊有Ricoh R1當時留下來的一個舊SD卡(256M),換上後,結果一切正常。
哇!這下問題大了,打電話詢問店家老闆後,說可能是創見這批記憶卡有良率問題而造成相容性影響。因為創見記憶卡是終身保固,老闆建議我到K-MALL的一樓有一家創見的専賣店去換新,結果,換了好幾片都還是一樣問題。
創見的服務小姐好心拿了一片未折封的全新記憶卡讓我回購買店家那裡去處理(換較低容量者),結果,我回NOVA店家那兒,老闆不信邪,還是拆開來試,問題還是一樣。
後來,他發現相機設定裡的『視訊系統』預設在『PAL』,調成『NTSC』後,所有問題就消失了。
將來,這個主題系列,我會以富士F100fd為工具,介紹它的介面操作及在拍攝時的各方面應用。
國民所得,可有三種計算方式:GDP、GNP、GNI(Gross National Income,少用)。
以下整理各種經濟指標之查閱來源處。
一、指定資料來源(From):這是LINQ查詢的第一步,From子句一定排在最前面。它可指定一個或多個範圍變數以及要查詢的集合。
From element [ As type ] In collection [ _ ]
[, element2 [ As type2 ] In collection2 [, ... ] ]
' Multiple From clauses in a query. Dim result = From var1 In collection1, var2 In collection2 ' Equivalent syntax with a single From clause. Dim result2 = From var1 In collection1 _ From var2 In collection2也可以組成一個巢狀From子句,其中第二個子句中的集合是根據第一個子句中的範圍變數屬性:
Dim allOrders = From cust In GetCustomerList() _ From ord In cust.Orders _ Select ord
From element [ As type ] In collection [ _ ]
[, element2 [ As type2 ] In collection2 [, ... ] ]
Where condition
From element [ As type ] In collection [ _ ]
[, element2 [ As type2 ] In collection2 [, ... ] ]
Where condition
Order By orderExp1 [ Ascending Descending ] [, orderExp2 [...] ]
From element [ As type ] In collection [ _ ]
[, element2 [ As type2 ] In collection2 [, ... ] ]
Where condition
Order By orderExp1 [ Ascending Descending ] [, orderExp2 [...] ]
Select [ var1 = ] fieldName1 [, [ var2 = ] fieldName2 [...] ]
Dim londonCusts2 = From cust In customers _ Where cust.City = "London" _ Order By cust.Name Ascending _ Select cust
Dim londonCusts3 = From cust In customers _ Where cust.City = "London" _ Order By cust.Name Ascending _ Select cust.Name
Dim londonCusts4 = From cust In customers _ Where cust.City = "London" _ Order By cust.Name Ascending _ Select Name = cust.Name, Phone = cust.Phone For Each londonCust In londonCusts4 Console.WriteLine(londonCust.Name & " " & londonCust.Phone) Next
Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End Class Dim londonCusts5 = From cust In customers _ Where cust.City = "London" _ Order By cust.Name Ascending _ Select New NamePhone With {.Name = cust.Name, _ .Phone = cust.Phone}
' 10% discount Dim discount_10 = 0.1 Dim priceList = _ From product In products _ Let DiscountedPrice = product.UnitPrice * (1 - discount_10) _ Select product.ProductName, Price = product.UnitPrice, _ Discount = discount_10, DiscountedPrice
Dim customerList = From cust In customers, ord In cust.Orders _ Select Name = cust.CompanyName, _ Total = ord.Total, ord.OrderID _ Where Total > 500 _ Select Name, OrderID
Dim customerNames = From cust In customers _ Select cust.CompanyName Dim customerInfo As IEnumerable(Of Customer) = _ From cust In customers _ Select New Customer With {.CompanyName = cust.CompanyName, _ .Address = cust.Address, _ .City = cust.City, _ .Region = cust.Region, _ .Country = cust.Country}
Join element In collection _
[ joinClause _ ]
[ groupJoinClause ... _ ]
On key1 Equals key2 [ And key3 Equals key4 [... ]
Dim customerIDs() = {"ALFKI", "VICTE", "BLAUS", "TRAIH"} Dim customerList = From cust In customers, custID In customerIDs _ Where cust.CustomerID = custID _ Select cust.CompanyName
Imports System.Diagnostics Public Class JoinSample Public Sub ListProcesses() Dim processDescriptions As New List(Of ProcessDescription) processDescriptions.Add(New ProcessDescription _ With {.ProcessName = "explorer", _ .Description = "Windows Explorer"}) processDescriptions.Add(New ProcessDescription _ With {.ProcessName = "winlogon", _ .Description = "Windows Logon"}) processDescriptions.Add(New ProcessDescription _ With {.ProcessName = "cmd", _ .Description = "Command Window"}) processDescriptions.Add(New ProcessDescription _ With {.ProcessName = "iexplore", _ .Description = "Internet Explorer"}) Dim processes = From proc In Process.GetProcesses _ Join desc In processDescriptions _ On proc.ProcessName Equals desc.ProcessName _ Select proc.ProcessName, proc.Id, desc.Description For Each proc In processes Console.WriteLine("{0} ({1}), {2}", _ proc.ProcessName, proc.Id, proc.Description) Next End Sub End Class Public Class ProcessDescription Public ProcessName As String Public Description As String End Class
Imports System.Diagnostics Public Class JoinSample2 Public Sub ListProcesses() Dim processDescriptions As New List(Of ProcessDescription2) ' 8 = Normal priority, 13 = High priority processDescriptions.Add(New ProcessDescription2 _ With {.ProcessName = "explorer", _ .Description = "Windows Explorer", _ .Priority = 8}) processDescriptions.Add(New ProcessDescription2 _ With {.ProcessName = "winlogon", _ .Description = "Windows Logon", _ .Priority = 13}) processDescriptions.Add(New ProcessDescription2 _ With {.ProcessName = "cmd", _ .Description = "Command Window", _ .Priority = 8}) processDescriptions.Add(New ProcessDescription2 _ With {.ProcessName = "iexplore", _ .Description = "Internet Explorer", _ .Priority = 8}) Dim processes = From proc In Process.GetProcesses _ Join desc In processDescriptions _ On proc.ProcessName Equals desc.ProcessName _ And proc.BasePriority Equals desc.Priority _ Select proc.ProcessName, proc.Id, desc.Description, _ desc.Priority For Each proc In processes Console.WriteLine("{0} ({1}), {2}, Priority = {3}", _ proc.ProcessName, _ proc.Id, _ proc.Description, _ proc.Priority) Next End Sub End Class Public Class ProcessDescription2 Public ProcessName As String Public Description As String Public Priority As Integer End Class
Group Join element [As type] In collection _
On key1 Equals key2 [ And key3 Equals key4 [... ] ] _
Into expressionList
Dim customerList = From cust In customers _ Group Join ord In orders On _ cust.CustomerID Equals ord.CustomerID _ Into CustomerOrders = Group, _ OrderTotal = Sum(ord.Total) _ Select cust.CompanyName, cust.CustomerID, _ CustomerOrders, OrderTotal For Each customer In customerList Console.WriteLine(customer.CompanyName & _ " (" & customer.OrderTotal & ")") For Each order In customer.CustomerOrders Console.WriteLine(vbTab & order.OrderID & ": " & order.Total) Next Next
Group [ listField1 [, listField2 [...] ] By keyExp1 [, keyExp2 [...] ]
Into aggregateList
Into Group
Dim studentsByYear = From student In students _ Select student _ Group By year = student.Year _ Into Classes = Group For Each yearGroup In studentsByYear Console.WriteLine(vbCrLf & "Year: " & yearGroup.year) For Each student In yearGroup.Classes Console.WriteLine(" " & student.Last & ", " & student.First) Next Next
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList
Dim customerList1 = Aggregate order In orders _ Into AllOrdersOver100 = All(order.Total >= 100)
Dim customerList2 = From cust In customers _ Aggregate order In cust.Orders _ Into AnyOrderOver500 = Any(order.Total >= 500)
Dim customerOrderAverage = Aggregate order In orders _ Into Average(order.Total)
Dim customerOrderAfter1996 = From cust In customers _ Aggregate order In cust.Orders _ Into Count(order.OrderDate > #12/31/1996#)
Dim customerMaxOrder = Aggregate order In orders _ Into MaxOrder = Max(order.Total)
Dim customerMinOrder = From cust In customers _ Aggregate order In cust.Orders _ Into MinOrder = Min(order.Total)
Dim customerTotals = From cust In customers _ Aggregate order In cust.Orders _ Into Sum(order.Total)
Imports System.Runtime.CompilerServices Module UserDefinedAggregates ' Calculate the median value for a collection of type Double.下列程式碼範例顯示在型別 Integer 的集合和型別 Double 的集合上,呼叫 Median 彙總函式的範例查詢。在型別 Double 的集合上呼叫 Median 彙總函式的查詢會呼叫 Median 方法的多載,接受型別 Double 的集合以做為輸入。 在型別 Integer 的集合上呼叫 Median 彙總函式的查詢,則會呼叫 Median 方法的泛型多載。_
Function Median(ByVal medianAggregate As IEnumerable(Of Double)) As Double
If medianAggregate.Count = 0 Then
Throw New InvalidOperationException("Cannot compute median for an empty set.")
End If
Dim sortedList = From number In medianAggregate Order By number
Dim medianValue As Double
Dim itemIndex = CInt(Int(sortedList.Count / 2))
If sortedList.Count Mod 2 = 0 Then
' Even number of items in list.
medianValue = ((sortedList(itemIndex) + sortedList(itemIndex - 1)) / 2)
Else
' Odd number of items in list.
medianValue = sortedList(itemIndex)
End If
Return medianValue
End Function
' "Cast" the collection of generic items as type Double and call the
' Median() method to calculate the median value.
_
Function Median(Of T)(ByVal medianAggregate As IEnumerable(Of T), _
ByVal selector As Func(Of T, Double)) As Double
Return (From element In medianAggregate Select selector(element)).Median()
End Function
End Module
Module Module1
Sub Main()
Dim numbers1 As Integer() = New Integer() {1, 2, 3, 4, 5}
Dim query1 = Aggregate num In numbers1 Into Median(num)
Console.WriteLine("Median = " & query1)
Dim numbers2 As Double() = New Double() {1.9, 2, 8, 4, 5.7, 6, 7.2, 0}
Dim query2 = Aggregate num In numbers2 Into Median()
Console.WriteLine("Median = " & query2)
End Sub
End Module
Distinct
您可以使用 Distinct 子句傳回只含唯一項目的清單。Distinct 子句會使查詢忽略重複的查詢結果。Distinct 子句會套用至 Select 子句所指定之所有傳回欄位中的重複值。如果未指定 Select 子句,則 Distinct 子句會套用至 From 子句中所識別查詢的範圍變數。如果範圍變數並非不變的型別,則只有當型別的所有成員都符合現有的查詢結果時,查詢才會忽略查詢結果。Dim customerOrders = From cust In customers, ord In orders _
Where cust.CustomerID = ord.CustomerID _
Select cust.CompanyName, ord.OrderDate _
Distinct
Let variable = expression [, ...]
Dim discountedProducts = From prod In products _
Let Discount = prod.UnitPrice * 0.1 _
Where Discount >= 50 _
Select prod.ProductName, prod.UnitPrice, Discount
For Each prod In discountedProducts
Console.WriteLine("Product: {0}, Price: {1}, Discounted Price: {2}", _
prod.ProductName, prod.UnitPrice.ToString("$#.00"), _
(prod.UnitPrice - prod.Discount).ToString("$#.00"))
Next
Skip count
Public Sub PagingSample()
Dim pageNumber As Integer = 0
Dim pageSize As Integer = 10
Dim customersPage = GetCustomers(pageNumber * pageSize, pageSize)
Do While customersPage IsNot Nothing
Console.WriteLine(vbCrLf & "Page: " & pageNumber + 1 & vbCrLf)
For Each cust In customersPage
Console.WriteLine(cust.CustomerID & ", " & cust.CompanyName)
Next
Console.WriteLine(vbCrLf)
pageNumber += 1
customersPage = GetCustomers(pageNumber * pageSize, pageSize)
Loop
End Sub
Public Function GetCustomers(ByVal startIndex As Integer, _
ByVal pageSize As Integer) As List(Of Customer)
Dim customers = GetCustomerList()
Dim returnCustomers = From cust In customers _
Skip startIndex Take pageSize
If returnCustomers.Count = 0 Then Return Nothing
Return returnCustomers
End Function
Skip While expression
Public Sub SkipWhileSample()
Dim customers = GetCustomerList()
' Return customers starting from the first U.S. customer encountered.
Dim customerList = From cust In customers _
Order By cust.Country _
Skip While IsInternationalCustomer(cust)
For Each cust In customerList
Console.WriteLine(cust.CompanyName & vbTab & cust.Country)
Next
End Sub
Public Function IsInternationalCustomer(ByVal cust As Customer) As Boolean
If cust.Country = "USA" Then Return False
Return True
End Function
Take count
Public Sub PagingSample()
Dim pageNumber As Integer = 0
Dim pageSize As Integer = 10
Dim customersPage = GetCustomers(pageNumber * pageSize, pageSize)
Do While customersPage IsNot Nothing
Console.WriteLine(vbCrLf & "Page: " & pageNumber + 1 & vbCrLf)
For Each cust In customersPage
Console.WriteLine(cust.CustomerID & ", " & cust.CompanyName)
Next
Console.WriteLine(vbCrLf)
pageNumber += 1
customersPage = GetCustomers(pageNumber * pageSize, pageSize)
Loop
End Sub
Public Function GetCustomers(ByVal startIndex As Integer, _
ByVal pageSize As Integer) As List(Of Customer)
Dim customers = GetCustomerList()
Dim returnCustomers = From cust In customers _
Skip startIndex Take pageSize
If returnCustomers.Count = 0 Then Return Nothing
Return returnCustomers
End Function
Take While expression
Public Sub TakeWhileSample()
Dim customers = GetCustomerList()
' Return customers until the first customer with no orders is found.
Dim customersWithOrders = From cust In customers _
Order By cust.Orders.Count Descending _
Take While HasOrders(cust)
For Each cust In customersWithOrders
Console.WriteLine(cust.CompanyName & " (" & cust.Orders.Length & ")")
Next
End Sub
Public Function HasOrders(ByVal cust As Customer) As Boolean
If cust.Orders.Length > 0 Then Return True
Return False
End Function
LINQ(Language-Integrated Query)是VS2008和Framework 3.5中的突破性創舉,是一系列擴充方法的組合,它的核心是System.Collection.Generic命名空間中,名稱為IEnumerable(T)這個型別,其中所定義的方法成員,成了LINQ資料查詢技術的基礎,可適用於各種型態的資料來源的存取操作,包括SQL Server資料庫、XML文件、ADO.NET Dataset、文字檔、陣列、以及任何支援IEnumerable或泛型IEnumerable(T)介面的物件組成的集合。
當有一陣列內容為:
Dim sFruit As String() = {"葡萄", "香蕉", "哈蜜瓜", "香瓜", "棷子", "蘋果", "木瓜"}若要找出以"瓜"為結尾的陣列元素,過去的寫法通常是用迴圈來取得(為搭配後面的程式,此處用兩組迴圈完成,而不是直接以一組迴圈取得。第一組迴圈為主要取得符合條件的元素陣列,在後續程式中,將會被LINQ寫法取代):
Dim s As String = ""若改為應用IEnumerable時,則可寫成:
Dim myEnumFruit As New ArrayList
For Each myFruit As String In sFruit
If myFruit.EndsWith("瓜") Then
myEnumFruit.Add(myFruit)
End If
Next
Dim s As String = ""
For Each myFruit As String In myEnumFruit
s &= myFruit & vbCrLf
Next
MsgBox(s)
Dim myEnumFruit As IEnumerable(Of String) = sFruit.Where(Function(fruit) fruit.EndsWith("瓜"))上面程式碼,當執行更為複雜的查詢運算時,程式會變得更加複雜而不易理解。
Dim s As String = ""
For Each myFruit As String In myEnumFruit
s &= myFruit & vbCrLf
Next
MsgBox(s)
Dim myEnumFruit = From fruit In sFruit Where fruit.EndsWith("瓜") Select fruit因為採用與SQL類似的From、Where、Select...等,讓程式設計時,針對各種不同的資料來源,可以運用統一的資料存取模型去操作,不必再去記一堆針對不同資料來源的處理方式,也不必再去理會那複雜而難以理解的IEnumerable寫法,而只需要將心力花費在程式的實際應用面部份即可。
Dim myEnumFruit As List(Of String) = (From fruit In sFruit Where fruit.EndsWith("瓜") Select fruit).ToList
二、立即執行:
Dim sFruit As String() = {"葡萄", "香蕉", "哈蜜瓜", "香瓜", "棷子", "蘋果", "木瓜"}
Dim myEnumFruit = From fruit In sFruit Where fruit.EndsWith("瓜") Select fruit
sFruit(1) = "胡瓜" '因是延後執行, 這項內容改變, 將導致後續結果也跟著改變, 會在結果中出現"胡瓜"這一項
Dim s As String = ""
For i As Integer = 0 To myEnumFruit.Count - 1
s &= myEnumFruit(i) & vbCrLf
Next
MsgBox(s)
Dim sFruit As String() = {"葡萄", "香蕉", "哈蜜瓜", "香瓜", "棷子", "蘋果", "木瓜"}
Dim myEnumFruit As List(Of String) = _
(From fruit In sFruit Where fruit.EndsWith("瓜") Select fruit).ToList
sFruit(1) = "胡瓜" '因是立即執行, 這項內容改變, 並沒有影響後續結果, 因此"胡瓜"並沒有在結果中出現
Dim s As String = ""
For i As Integer = 0 To myEnumFruit.Count - 1
s &= myEnumFruit(i) & vbCrLf
Next
MsgBox(s)
Imports System.Collections.Generic不過,似乎VB2008已貼心的自動引入,即使我們在程式中沒有打入這兩行引入命名空間程式碼,亦可正常執行。
Imports System.Linq
以下為公開資訊觀測站裡的財務分析資料所列出者,包括:
現金流量比率 = 營業活動淨現金流量 / 流動負債
現金流量允當比率 = 最近五年度營業活動淨現金流量 / 最近五年度(資本支出 + 存貨增加額 + 現金股利)
現金再投資比率 = (營業活動淨現金流量 - 現金股利) / (固定資產毛額 + 長期投資 + 其他資產 + 營運資金)
每股盈餘(Earnings Per Share,簡稱EPS),其公式為:
每股盈餘(EPS) = (本年度稅後純益 – 特別股股利) / 本年度流通在外的股份加權平均數
其中,需要兩項資訊,即稅後純益與本年度流通在外的股份加權平均數。稅後純益率(Net profit ratio),其公式為:
稅後純益率 = 稅後純益 / 營業收入淨額 *100%
其中,需要兩項資訊,即稅後純益與營業收入淨額。總資產報酬率(Return on total assets)(ROA),其公式為:
稅後總資產報酬率 = (稅後純益 + 利息費用 * (1-所得稅率)) / 平均資產總額 *100%
其中,需要兩項資訊,即年度利益與平均資產總額、本期淨利(淨損)(稅後純益)、利息費用、所得稅率。股東權益(淨值)報酬率(Return on equity)(ROE),其公式為:
股東權益(淨值)報酬率 = (年度)淨利 / (平均)股東權益 *100%
其中,需要兩項資訊,即年度利益與平均股東權益。而年度淨利,在本例中取繼續營業單位稅前淨利(淨損)(稅前淨益)或本期淨利(淨損)。股本(資本)報酬率,其公式為:
股本(資本)報酬率 = (年度)利益 / 股本額 *100%
其中,需要兩項資訊,即年度利益與股本額。而年度利益,在本例中取營業淨利(淨損)或繼續營業單位稅前淨利(淨損)(稅前純益)。獲利能力分析(Analysis of the Ability to Benefit)(Profitability analysis) 可針對三部份來探討:
投資報酬率 = 報酬 / 投資 *100%
可依投資種類而分成三種:股本(資本)報酬率 = (年度)利益 / 股本額 *100%
股東權益(淨值)報酬率(Return on equity)(ROE) = (年度)淨利 / (平均)股東權益 *100%
總資產(本)報酬率(Return on total assets)(ROA)
- 稅前總資產報酬率 = (稅前淨利 + 利息費用) / 平均資產總額 *100%
- 稅後總資產報酬率 = (稅後純益 + 利息費用 * (1-所得稅率)) / 平均資產總額 *100%
(營利事業所得稅率,要上觀測站去查)
財務槓桿指數 = 股東權益報酬率 / 總資產報酬率
財務槓桿因素 = 股東權益報酬率 - 總資產報酬率
- 營業毛利率 = 營業毛利 / 營業收入淨額 *100%
- 營業淨利率 = 營業淨利 / 營業收入淨額 *100%
- 稅前淨利率 = 稅前淨利 / 營業收入淨額 *100%
- 稅後純益率(Net profit ratio) = 稅後純益 / 營業收入淨額 *100%
每股盈餘(EPS) = (本年度稅後純益(Net income) – 特別股股利(preferred stock dividends)) / 本年度流通在外的股份加權平均數(Weighted average outstanding shares)
每股股利,則是每股股份(本年度流通在外的股份加權平均數)可以發放股利(現金股利或股票股利)的金額。每股股利 = 股利 / 股數
本益比(P/E Ratio) = 每股市價 / 每股盈餘 本利比 = 每股市價 / 每股股利
存貨週轉率(Average inventory turnover rate)其公式為:
存貨週轉率(次) = 銷貨成本 / 平均存貨
= 銷貨成本 / ((期初存貨+期末存貨)/2)
其中,需要兩項資訊,即營業成本合計(或銷貨成本)與存貨。應收帳款週轉率(Receivables turnover rate),其公式為:
應收帳款週轉率(次) = 銷貨淨額 / 平均應收帳款
= 銷貨淨額 / ((期初應收帳款+期末應收帳款)/2)
其中,需要兩項資訊,即營業收入(或銷貨淨額)與應收帳款淨額。固定資產週轉率(Fixed assets turnover rate),其公式為:
固定資產週轉率(次) = 銷貨淨額 / 平均固定資產
= 銷貨淨額 / ((期初固定資產+期末固定資產)/2)
其中,需要兩項資訊,即營業收入(或銷貨淨額)與固定資產總額。總資產週轉率(Total Assets Turnover Rate),其公式為:
總資產週轉率(次) = 營業收入(或銷貨淨額) / 平均資產總額
= 營業收入(或銷貨淨額) / ((期初資產總額+期末資產總額)/2)
其中,需要兩項資訊,即營業收入(或銷貨淨額)與期初資產總額、期末資產總額。速動比率(Quick Raio),其公式為:
速動比率 = 速動資產 / 流動負債 *100%
其中,速動資產,乃指現金、有價證券、應收票據、及應收帳款等各項可迅速變現,而用以支付流動負債的資產。速動資產(Quick Assets) = 流動資產(Current Assets) - 存貨(Inventories) - 預付費用(Prepaid Expenses)
但,同樣的,在資產負債表中找得到存貨,但找不到預付費用,那就只好將預付費用省去了。因此,這裡需要三項資訊,即流動資產、存貨與流動負債。固定資產對長期資金比率(Fix Assets To Long-term Funds Ratio),其公式為:
固定資產對長期資金比率 = 固定資產 / (長期負債 + 股東權益總額) *100%
其中,需要三項資訊,即固定資產、長期負債與股東權益總額。資本總額比率(Capitalization Ratio),其公式為:
資本總額比率 = 長期負債 / (長期負債 + 股東權益總額) *100%
其中,需要兩項資訊,即長期負債與股東權益總額。企業籌措資金,購買各種營運資產,如固定資產、存貨等,經由生產、銷售等營業活動,產生各種營業收入;而收入再經過收款等營業活動,產生更多的營運資產,如應收帳款、應收票據、銀行存款、與現金等。而現金、銀行存款,可再用以購買存貨、固定資產,繼續生產、銷貨、收款等營業活動,循環不已。
因此,這種循環的期間愈短,表示企業運用各種營運資產的效率愈高,對企業也愈有利。而經營效能分析(Analysis of Operation Efficiency),最主要的就是使用資產週轉率來作為分析評估,其基本公式為:
資產週轉率(次) = 營業收入淨額 / 資產平均額
其中,資產可代表各種營運資產,而企業若僅有銷貨收入時,一般則以銷貨收入淨額代替營業收入淨額。常用的各項週轉率如下:
總資產週轉率(次) = 銷貨淨額 / 平均資產總額
= 銷貨淨額 / ((期初資產總額+期末資產總額)/2)
固定資產週轉率(次) = 銷貨淨額 / 平均固定資產
= 銷貨淨額 / ((期初固定資產+期末固定資產)/2)
應收帳款週轉率(次) = 銷貨淨額 / 平均應收帳款
= 銷貨淨額 / ((期初應收帳款+期末應收帳款)/2)
存貨週轉率(次) = 銷貨成本 / 平均存貨
= 銷貨成本 / ((期初存貨+期末存貨)/2)
存貨週轉天數 = 360 / 存貨週轉率
一般評估而言,資產週轉率的值愈大,表示資產週轉率的次數愈多,企業運用各種營運資產的效率愈高,對企業自然愈有利。但因各行各業性質不同,欲以資產週轉率來評估公司運用營運資產是否具有效率,或營業收入各項營運資產是否保持合理關係,必須與行業性質相同或類似的同業,或是公司過去年度資產週轉率作比較,才較有意義。
另,在評估公司獲利能力時所用的兩項重要指標:投資報酬率與純益率,其與資產週轉率間是互有關聯的:
總資產投資報酬率 = 稅後純益 / 總資產
= (稅後純益/銷貨) * (銷貨/總資產)
= 純益率 * 總資產週轉率
因此,一企業要追求利潤、提高投資報酬率,除可從提高純益率著手外,亦可從提高資產的利用率來提高投資報酬率。
相關連結:財務報表分析
短期償債能力分析(Analysis of Short-Term Repayment Ability),是針對被分析公司的現金與短期內可以變現的各種資產,以及短期內到期而必須償還的各種負債,進行評估。雖某某企業可能獲利能力不錯,但卻可能因不能償還到期的負債而導致週轉不靈,以致無法繼續經營。因此,短期償債能力分析,實是企業體質健全與否的重要指標。
以下為常用的比率:
流動比率 = 流動資產 / 流動負債 *100%
流動比率越高,表示短期償債能力越高;流動比率越低,則短期償債能力越低。影響流動比率的主要因素,一般認為是營運周期、流動資產中的應收帳款數額、和存貨週轉速度。
少數不肖企業人士,可能利用會計原理,將各有關科目予以適當安排,使達到改善營運資金與流動比率的地位,以粉飾財務報表外觀,此即一般所謂的『窗飾』(Window dressing),因此必須小心。
流動比率也被稱為『營運資金比率』(working capital ratio),甚至逕以『營運資金』代替流動比率使用。實際上,流動資產大於流動負債的餘額,才稱為『營運資金』。(參考:財務狀況變動表)
速動比率 = 速動資產 / 流動負債 *100%
速動資產,乃指現金、有價證券、應收票據、及應收帳款等各項可迅速變現,而用以支付流動負債的資產。 影響速動比率可信度的重要因素是應收帳款的變現能力。
速動比率可以表達企業是否有應付緊急償債的能力。理論上,速動比率應較流動比率標準要求較低,只要速動比率達100%以上便稱理想,如能達50%~100%間亦屬尚可,唯在50%以下者表示迅速償債能力甚低。
應收帳款週轉率
應收帳款平均收回天數
存貨週轉率
存貨轉換期間
相關連結:財務報表分析
資本負債比率(Debt-to-Equity Ratio),其公式為:
資本負債比率 = 負債總額 / 股東權益總額 *100%
其中,需要兩項資訊,即負債總額與股東權益總額。參考這兩篇:
http://skyvee.net/2007/05/blogger-funp.html
http://skyvee.net/2007/08/funp-push.html
I.首先 在 <head> </head> 之間, 加入這段程式碼.
<script language='JavaScript' src='http://bloggertips.googlecode.com/files/funp_button2.js'/>
II.以下三選一
如果要把推文按鈕加在文章標題列, 則在 <h3 class='post-title'> 後, 加入以下程式碼
<script>funp_genButton("<data:post.url/>");</script>
如果想放在文章左側, 則在<p><data:post.body/></p> 之前, 加入以下程式碼
<div style='float:left;margin-left:10px;'>
<script>funp_genButton(" ");</script>
</div>
如果是文章右側, 則在<p><data:post.body/></p> 之前, 加入以下程式碼
<div style='float:right;margin-right:10px;'>
<script>funp_genButton("<data:post.url/>");</script>
</div>
SD協會並且要求記憶卡製造商必須在SDHC外觀清楚標示SD Speed Class等級。
有玩相機的人,大多都會知道,相機的光圈值,常見的有:
F1.4 / F2 / F2.8 / F4 / F5.6 / F8 / F11 / F16 / F22 / F32
這些光圈數值幾乎是被學攝影者所直接背下來的,但是,很少人知道它們之間真正的關係。
當然,稍微懂的人都知道,每組鄰近一個光圈值之間,都有一格(或一級)的進光量差異。
即,每差一格,在固定時間內的進光量就差一倍。
光圈數值越小,代表光圈開得越大,進光量也就比下一格多一倍。
那麼,這些數字間究竟是什麼關係,為什麼數值越小光圈開越大,又為什麼進光量會每一格差一倍呢?
原來,這些數值的計算法,是由下面公式得出來的:
光圈值(F Number) = 鏡頭焦距(mm) / 光圈口徑(mm)
所以,我們若以標準鏡頭焦距50mm當標準來計算,
這樣,當光圈口徑也等於50mm時,光圈值就等於F1了。
那麼,下一個一半進光量的光圈值該是多少呢?
很簡單,會數學或會程式的人一定知道,就是用面積比例下去算了:
1. 半徑:50 / 2=25
2. 面積:25^2 * 3.14159...
3. 面積一半:25^2 * 3.14159... / 2
4. 還原回一半面積的半徑值:sqr(25^2 * 3.14159... / 2 / 3.14159...) = sqr(25^2 / 2)
5. 再轉成直徑:sqr(25^2 /2) *2 = sqr(50^2 / 8) *2 = sqr(50^2 /2)
好啦,所以,下一個一半進光量的光圈口徑就是sqr(50^2 / 2)了,
那麼,其光圈值就是:50 / sqr(50^2 / 2)
我們用VB6簡單寫個程式,把所有一系列的光圈值列出來:
Private Sub Command1_Click()
a = 50: b = 50
Debug.Print "光圈口徑(mm)", "光圈值(F)"
For i = 1 To 11
Debug.Print Format(b, "#0.00"), Format(a / b, "#0.00")
b = Sqr(b ^ 2 / 2)
Next
End Sub
這樣,得到的答案是:
光圈口徑(mm) 光圈值(F)
50.00 1.00
35.36 1.41
25.00 2.00
17.68 2.83
12.50 4.00
8.84 5.66
6.25 8.00
4.42 11.31
3.13 16.00
2.21 22.63
1.56 32.00
當然,光圈值的標示只是個大略值,方便攝影者記憶而已!
將上面答案的小數第二位或連同小數第一位去掉,是不是就跟最上面提到的那排光圈值一樣了!
以後,再看到這些光圈值時,心中疑惑應該就會降到最低了吧!