2013年11月28日 星期四

網站介紹_Rays blog_就是愛現~程式交易

 

紀錄並推薦程式交易的好網站

 

Ray's Blog

請賜予寧靜的心去接受無法改變的事, 請賜予勇氣去改變可以改變的事, 並請賜予智慧去分辨這兩者

 

ray

 

就是愛現 ~ 程式交易

Hold住未來歷史重演的考古題與紀律執行

 

就是愛現

 

兩個推薦網站的內容包含了非常多程式交易的測試、交易的邏輯、指標設計、語法介紹及交易經驗,尤其是非常多的圖表說明使得文章容易理解,對於期貨交易的朋友來說,是很好的參考網站,L 自己也從中參考學習了許多。

 

對於好網站應該多鼓勵支持,希望站長們都能保持足夠的熱情持續分享,共同進步和獲利。

 

 

2013年11月25日 星期一

關於金融證照考試

 

在 交易人學資訊 與資訊人學交易 兩文中得到許多讀者的共鳴與回應,讓 J 感覺在交易上有許多持續努力的朋友,所以繼續來分享不論何種學習背景,若想進入金融業都需要具備的金融證照,以及J自己面對金融考試的準備方法。

 

一般網路上已經有許多人分享考證券期貨業相關證照的順序,因此J只簡單提一下一般號稱最簡單的是「信託業務員」,再來就依照學歷的要求分成,在大學畢業前須先考「證券商業務員」,才能考「證券商高級業務員」,或讀者已經大學畢業則可以直接考取證券商高級業務員而不需要考較基礎的證券商業務員再擁有高業後,就單考投信投顧相關法規(含自律規範)乙科」,考過後就可以直接結合高業資格去換取「投信投顧業務員」,最後再去考一般人認為最困難的「期貨業務員」。具備以上幾張重要的金融證照就足夠進入金融業從事多數工作了。

 

另外,若想從事更進階的金融工作擁有分析師資格是必要的,近年來考試成績計算上有所變動,現行不論證券或期貨分析師皆考四科,其中總體經濟一門可共同使用(但須限制在考過該科後兩年內),而四科若60分以上即通過,並可單獨保留各科成績,只要在兩年內把四科都考到及格就可以獲得分析師證書,配合每年考試四次的機會,相對來說已經比以前容易得多。

 

在準備方面,J除了期貨分析師其中一科差幾題而沒有一次考過外,其他都算快速有效率的解決,因此想分享幾個考試小訣竅提供讀者。首先,跟交易一樣最重要的是心態,J都是抱著要考就要快速準備完而且一次過的心態,因此為了怕自己拖延時間,在還沒開始念書之前,就先去報名,而訂出考試日期是重要的,除了有些考試本來就需要早點報名外,更重要的是先確立還剩多少時間,才能排除更明確的念書順序,一般非分析師考試都是兩個科目,大約給自己一個月左右時間即相當足夠。

 

其次在順序方面,先從最有把握的科目開始念起,因為越早讀越會忘記,越需要背誦的法規建議最後念才最有印象在內容方面有空就照著書的章節準備(書不建議買官方的,因為內容太多太雜,直接買仿間整理好的比較有效率,畢竟目的是要考過而不是學習理論),時間不足就直接從各章節考古題來下手,之後就反覆讀歷屆考題。

 

尤其最後幾天最為關鍵,通常J歷屆考題幾乎都會看至少5遍以上,越熟悉就練的越快,看到幾乎題目一掃完就知道答案,這樣就可以安心進考場了,因為幾乎考題都大同小異,而且如同交易一樣,有足夠的樣本數,熟悉了計算流程,到時真的碰到新題目,再推理就好,而且就算放掉新題也無仿,畢竟只要考70分即可。

 

而在準備比較困難的分析師考試中有30分是申論題,J的作法是歷屆考題都先跳過申論題,全力準備選擇題,至少要在70分中拿56分左右,最後幾天再特別去閱讀申論題,尤其是有計算的題目一定要會,而且拿到手,其他開放式的就只能大概有點印象到時再想辦法寫出點東西,看看能不能賺到筆墨分數,這樣若能申論不要太糟糕30分拿個10分左右,結合選擇題56分左右,讓成績達到60分以上就不是難事了。

 

最後,分享給想強化自己履歷或擁有國際級金融證照的讀者,在考完雙分析師或證券分析師後,可以去考CIIA這個 國際投資分析師考試 ,只需要考Final Exam(全英文筆試),因此也比考CFA便宜也快速,至於是否有用途,則如同CFA般,看工作環境了,只能說這是讓讀者能最快速且效率獲得國際等級分析師資格的選擇。

 

 

 

2013年11月21日 星期四

台指2013年11月份結算

 

台指2013年11月份結算,來檢視一下行情走勢和對應的策略表現。

 

201311月走勢1

 

開倉的價格約在8350,一直延續著從十月初以來的上下一百點區間震盪,直到11/6、11/7測試區間底部後跌破開始空方盤勢,但僅跌四個交易日到8100後,隨著國際股市皆創新高的情況下立即反彈,又回到8250的價位,但這次反彈不過8250,後續盤勢偏空看待。(2013/11/21發文時已經長黑盤後)。

 

201311月走勢表

 

從策略的角度來看這個月的盤勢,留倉單狀況偏向空單獲利又回吐,其中較短的已經被刷出場了,較長的仍然是空單續抱。而當沖單的狀況則是稍微好一點,雖然當日盤勢僅有三日能較有獲利(如上表淡紫標記),但大部份的日子波動小也沒進場機會,所以還是有一點獲利。另外也是因為波動率很低,最近當沖單的訊號並不多。

 

20131120結算價

 

台指選擇權結算買賣方損益 這個策略來看,買方242點的成本,最後收在147點,有95點的虧損,期間只有在價格跌到8100那兩日呈現獲利,其餘日子都是虧損的,正常來說採用這樣策略的投資朋友,是考驗著對策略的熟悉和信任。總之這個月仍然是波動很小的月份,繼續撐吧。而12月份合約的新倉價平合計仍然只有約220點,照策略走仍是作買方。

 

從較長期的角度看,這個月過的還算平穩舒服,新合約的開始,要有大獲利的最可能情況是空方波段+波動率上升,反彈若站上8250則保守看待先觀望,而8250以下是抱緊空單的時機,以上不負責任分析。

 

 

2013年11月20日 星期三

推薦書籍-程式交易(方法與實務應用)

 

圖片 1


 

 

前一篇 J 分享的 交易人學資訊 和以前的 資訊人學交易 這兩篇文章中都有提到現在期貨交易和資訊能力已經分不開來,而對於還不熟悉的朋友來說,就算沒有辦法立即使用上程式交易,若能多瞭解它也是非常有幫助,至少瞭解在這個市場上有非常多的人是怎麼運用? 程式交易的策略對於市場又有什麼影響? 這些都是很重要的思考方向。

 

若能再更多瞭解,也才能領會其他人分享的交易策略和看懂績效測試,網路上的資源豐富,許多網站和論壇都有很好的參考資料,能夠看的懂再融入自己的策略中,那就是很好的學習經驗。

 

不過,這一切要怎麼起頭是有點困擾,程式交易如字面,要寫程式、要會交易,像 L 自己是會程式再想交易邏輯,而 J 是有交易想法再來程式化,當兩方面各有學習之後,自然兩人容易溝通,可以互相合作。所以讀者朋友也可以依自己較有經驗的領域來延伸學習。而這篇文章要紀錄的推薦書籍,正是蠻好的參考書,也適合作為對程式交易全面瞭解的第一本書,程式交易:方法與實務應用

 

姜林杰佑教授所出的這本書,看起來很像是教科書,但實際上有非常多的範例和相關知識的整理,讀起來很輕鬆。包含的主題非常全面,談程式也談交易,包含程式的種類介紹、如何應用、市場現況、開發測試、進階的演算法交易等等。L自己從這本書獲得許多不同的觀點,尤其是在進階主題的部份,也是目前自己仍然在努力研究的方向。總之,好書一本,可以多加參考。

 

 

2013年11月18日 星期一

交易人學資訊

 

L曾經寫過一篇資訊人學交易 ,其中提及現在交易的時代中,離不開資訊與交易,然而J與L的最大不同,除了英文字母的寫法相反以外,最重要的是學習歷程的相反,從交易人來學所需要用的資訊能力。

 

J在大學時期是商學院的學生,學習的項目如同多數交易人一樣是主修財務金融,因此與傳統多數財金系畢業的學生相同,在求學的歷程之中完全沒有程式語言的課程,主要都是學習一些財務理論以及財報分析等,喜歡閱讀的書籍也從來都是偏向主觀交易的技術分析與交易心理類書籍,因此並沒有把資訊能力與程式語言認為是必須要會的東西。

 

因此與資訊人開始接觸交易不同,J以前並不太看重交易工具與資訊設備,認為交易想法或對市場的看法比較重要,執行不過就是快速的按滑鼠或按鍵來進出即可,也不會去太在乎幾毫秒以及交易成本對交易的影響,直到工作上開始接觸到Multicharts後一切才開始改變。

 

因為 J 在求學期間即熱愛期貨選擇權交易,即使至今我也連一張股票也沒買過,然而在工作後發現,若要能進入喜愛的衍生性交易商品相關部門,勢必需要程式撰寫的能力,因此為了在這條路上走下去,透過同事的建議開始買了第一本TS的程式開發書籍,才發現原來學習現有的套裝程式真的比想像中容易,但對於完全沒有寫程式經驗的我,迴圈與利用開關來控制的想法在一開始確實難以體會,因此J就透過假設我自己是電腦,我會怎麼運算來思考,一行一行的算過去,存了哪些值在哪個變數,這些變數再下一次跑過的時候,是否又存到了哪去等,漸漸的去掌握邏輯的運算。

 

凡事起頭難,這時透過有程式經驗的朋友提點一下就顯得特別重要,因此一開始除了透過書上程式的練習外,J也得到朋友的免費完整程式碼,讓我模仿以及學習把程式元件化,讓以後方便取用與修改,並了解其中設計用了什麼小方法可以更聰明的簡化過程達成目標。

 

另外,也了解到,原來寫程式最重要的是知道定義與假設並學習除錯(Debug),透過按F1取得說明,了解需要的變數與運算方法,才能知道一些函數是否符合需要,了解K棒走勢的假設,才不至於產生回測高估績效的問題。而在Debug方面,每當寫好一個元件後,透過把變數print出來可以看出電腦在運算的過程該變數的值是否符合預期,才能再逐漸複雜的程式碼中,找到是否有運算瑕疵。

 

在學習程式的過程中,除了語法,其實對非資訊背景的人更重要的是,了解到原來網路上許多資源是可以有效幫助學習的,然而學程式其實算是知易行難,一定要透過自己動手做過,解決自己的問題才會真的學到,而不是買厚厚的程式語法書把他念完,培養一種主動且靠自己去尋找方法解決問題的精神,我覺得將是對於想從一般交易人轉為兼有資訊能力的程式交易者,必須要有的態度。

 

最後,J 也將持續在更多不同語法上作學習,因為一套完整的交易系統不能單靠簡單的MC來組成,資金管理與監控系統的模型也許需要VBA或SQL來解決,API下單機與報價串接則可能要用C相關的語法去撰寫,現行雖然都有免費的網路資源可以使用,但若能更強化自己的能力,在未來更需要交易速度的時代,才能具備有足夠的優勢,期望與J一樣背景的交易人,在看過本篇文章後,能更不害怕學習程式,慢慢作就會越來越有成果的,繼續學習其他語言也就更有心得更好上手了。

 

 

2013年11月13日 星期三

歷史波動率策略設計

 

在 歷史波動率 這一篇中紀錄了歷史波動率的計算和指標語法,就可以拿來作為策略訊號的設計或濾網,基礎想法是在於波動率期間的比較,如果短期的波動率小於長期的波動率,表示目前行情較為穩定、黏著、緩慢,也比較像是多頭的環境中表現的狀況。反之,若短期的波動率大於長期的波動率,表示目前行情的波動較快速、急拉急殺,可能有恐慌氣氛,那就像是空頭盤勢了。

 

以上述波動率比較作為濾網,嘗試搭配最根本的均線策略邏輯,市價大於均線作多、市價小於均線作空,設計一個留倉長波段策略來觀察表現,程式碼如下列:

 

CODE

 

 

主要邏輯在第11、12列,如前述,另出場條件設定為市價反向跌/漲破均線時多少點該出場。以上參數也列出來了,讀者可以自行練習邏輯和參數調整。範例策略使用30分線的週期,進出場的價位節錄如下圖。

 

pic

 

可以先預想勝率和盈虧比和強弱處,它就和基本的均線策略一樣,大波段可以獲利,均線黏著時易洗刷,勝率應低於40%,盈虧比應高於2.5,drawdown起碼25萬以上。就以上圖來觀察,搭配波動率作濾網是有效果的,避開了不少次無謂的洗刷。績效報告如下圖 (2005~2013,交易費用800)。

 

績效結果

 

交易分析

 

績效報告中,最大的亮點是盈虧比很高,尤其是空單的表現,表示這個策略在空方勢時可以抱的很緊、很久。pro/DD 和 kelly值也相當不錯,更多的策略評估可以參考 交易策略評估-Kelly formula 、 交易策略評估-獲利風險比 、交易策略評估-損益期間 。

 

以上,是利用歷史波動率作為策略邏輯的應用,參數都是經過最佳化的,另外值得注意的是這個策略2013年表現並不突出,不至虧損,但幾乎無獲利,因此若要當作實戰的交易邏輯還有得思考修改。

 

 

2013年11月8日 星期五

隱含波動率 (with EXCEL VBA、C#)

 

延續前兩篇 (選擇權評價-BS MODEL (with Excel) 、歷史波動率 )的內容,這篇要來紀錄隱含波動率了。

 

隱含波動率(implied volatility, iv)是以選擇權市價所倒推回它處在多少的波動率之上, 可以表示市場對於指數波動的看法,這也是重要的選擇權交易策略。而要計算它的方法也有很簡單易懂的,就是去試。

 

假設要計算一個市價100的選擇權商品的iv,如同前篇紀錄的,我們已經有了選擇權評價的公式,先設定一組高低點(如1和0),取高低點的中位(0.5),把0.5代入選擇權評價的公式,假設得到150,比市價100高,表示0.5太高了,將剛剛的高點1改為0.5,再取高低點的中位(0.25),再算價格再和市價比,就這樣一直比到高低點的差距很小,就得到iv了。

 

剛剛這段計算的例子寫成程式,以VBA為例就如下:
Function civ(S, K, T, R, Target)
high = 1
low = 0

Do While (high - low) > 0.00001
If PriceC(S, K, T, R, (high + low) / 2) > Target Then
high = (high + low) / 2
Else
low = (high + low) / 2
End If
Loop

civ = (high + low) / 2
End Function

Function piv(S, K, T, R, Target)
high = 1
low = 0

Do While (high - low) > 0.00001
If PriceP(S, K, T, R, (high + low) / 2) > Target Then
high = (high + low) / 2
Else
low = (high + low) / 2
End If
Loop

piv = (high + low) / 2
End Function

Function d1(S, K, T, R, V)
d1 = (Log(S / K) + (R * T) + (V ^ 2 * T / 2)) / (V * Sqr(T))
End Function

Function d2(S, K, T, R, V)
d2 = d1(S, K, T, R, V) - V * Sqr(T)
End Function

Function PriceC(S, K, T, R, V)
PriceC = S * Application.NormSDist(d1(S, K, T, R, V)) - K * Exp(-(R * T)) * Application.NormSDist(d2(S, K, T, R, V))
End Function

Function PriceP(S, K, T, R, V)
PriceP = K * Exp(-R * T) * Application.NormSDist(-d2(S, K, T, R, V)) - S * Application.NormSDist(-d1(S, K, T, R, V))
End Function

其中civ計算call的iv,piv計算put的iv,用到的Function之前有介紹過。

變數名稱

 

S 現貨價格,我們拿來算台指選的話,就拿台指期市價當作S

K 履約價格

T 距離到期日的時間,要年化

R 年利率

V 年化波動率

Target 標的選擇權的市價

 

同樣的程式用c#寫,也在這篇紀錄一下。
class Option
{

public double CallPrice;
public double PutPrice;

public void Price(double S, double K, double R, double T, double V)
{
double a = Math.Log(S / K);
double b_call = (R + 0.5 * Math.Pow(V, 2)) * T;
double b_put = (R - 0.5 * Math.Pow(V, 2)) * T;
double c = V * Math.Sqrt(T);
double d1 = (a + b_call) / c;
double d2 = (a + b_put) / c;
CallPrice = S * ND(d1) - K * Math.Exp(-R * T) * ND(d2);
PutPrice = K * Math.Exp(-R * T) * ND(-d2) - S * ND(-d1);
}

public double PriceC(double S, double K, double R, double T, double V)
{
double a = Math.Log(S / K);
double b_call = (R + 0.5 * Math.Pow(V, 2)) * T;
double b_put = (R - 0.5 * Math.Pow(V, 2)) * T;
double c = V * Math.Sqrt(T);
double d1 = (a + b_call) / c;
double d2 = (a + b_put) / c;
CallPrice = S * ND(d1) - K * Math.Exp(-R * T) * ND(d2);
return CallPrice;
}

public double PriceP(double S, double K, double R, double T, double V)
{
double a = Math.Log(S / K);
double b_call = (R + 0.5 * Math.Pow(V, 2)) * T;
double b_put = (R - 0.5 * Math.Pow(V, 2)) * T;
double c = V * Math.Sqrt(T);
double d1 = (a + b_call) / c;
double d2 = (a + b_put) / c;
PutPrice = K * Math.Exp(-R * T) * ND(-d2) - S * ND(-d1);
return PutPrice;
}

public double ND(double d)
{
double L = 0.0;
double K = 0.0;
double dD = 0.0;
const double a1 = 0.31938153;
const double a2 = -0.356563782;
const double a3 = 1.781477937;
const double a4 = -1.821255978;
const double a5 = 1.330274429;
L = Math.Abs(d);
K = 1.0 / (1.0 + 0.2316419 * L);

dD = 1.0 - 1.0 / Math.Sqrt(2 * Convert.ToDouble(Math.PI)) * Math.Exp(-L * L / 2.0) * (a1 * K + a2 * K * K + a3 * Math.Pow(K, 3.0) + a4 * Math.Pow(K, 4.0) + a5 * Math.Pow(K, 5.0));

if (d < 0) {return 1.0 - dD;}else{return dD;}
}

public double d1(double S, double K, double R, double T, double V)
{
double a = Math.Log(S / K);
double b_call = (R + 0.5 * Math.Pow(V, 2)) * T;
double c = V * Math.Sqrt(T);
double d1 = (a + b_call) / c;
return d1;
}

public double civ(double S, double K, double R, double T, double Target)
{
double high = 1;
double low = 0;

while ((high - low) > 0.00001)
{
if (PriceC(S, K, R, T, (high + low) / 2) > Target) { high = (high + low) / 2; }
else {low = (high + low) / 2;}
}

double civ = (high + low) / 2;
return civ;
}

public double piv(double S, double K, double R, double T, double Target)
{
double high = 1;
double low = 0;

while ((high - low) > 0.00001)
{
if (PriceP(S, K, R, T, (high + low) / 2) > Target)
{high = (high + low) / 2;} else {low = (high + low) / 2;}
}

double piv = (high + low) / 2;
return piv;
}
}

上面是一個class,直接加入類別就可以使用了,呼叫 Price(...) 後,可以拿屬性 CallPrice 和 PutPrice來用,或是分別呼叫PriceC(...) 或 PriceP(...) ,計算civ和piv一樣,可以直接得到回傳值iv。跟VBA不同的是,C#要多寫一個常態分配的函數ND。

 

有了這些,就可以計算出隱含波動率,運用上就看各人解讀了,之後再繼續紀錄。

(註: 範例程式是 L 參考網路上程式後自己撰寫的,讀者可自由複製使用,但程式碼轉載請註明出處 。)

 

 

2013年11月5日 星期二

交易心理-迴歸效應

 

許多讀者一定有碰過或聽聞過下列類似的事。

 

有作交易的容易發生下列現象。

 

  1. 最近作交易蠻順的,決定加碼,沒想到一加碼就賠,一減碼卻又出行情。

  2. 寫好一支交易策略,觀察了好一陣子,覺得蠻穩也蠻賺的,沒想到一上線真實交易卻一路被巴。


 

在金融圈則常常出現下列現象。

 

  1. 當高層主管受不了自營部交易員虧損時,開始要求縮小部位,或是停止下單,隨後好賺的大波動隨即出現。

  2. 當多數客戶開始大量購買某一檔商品、策略、基金,就是該產品回檔的開始。


 

書中所說的一些案例也確實曾聽聞過。

 

  1. 運動員畫刊魔咒,只要運動員上了運動員畫刊雜誌的封面,下一年度的表現就會變差。

  2. 表現得好被誇獎,之後表現就不好,反之,被責罵,之後表現就變好。


 

以上講了這麼多小例子,其實都在反應一個共同的事實,就是運氣在各種事情或現象中都扮演了很重要的角色,決定了短時間一大部分的成敗或是獲利的結果。

 

J用簡單的公式來形容如下

每一次的結果=事情的本質或人的能力+短期的運氣

 

導致常常出現在一連串的成功(賺錢)之後,人的心理沒有考慮到迴歸效應的影響,最後產生不如原本預期的結果(原本預期要持續連續性大賺)。

 

而簡單解釋迴歸現象,讀者可以思考若重複性的從事某一件事情,根據統計的證明,將會發現長期的結果將近於其平均值,表示任何極端連續性事件終將回歸常態。

 

根據書中所提,迴歸現象可以追朔到19世紀達爾文的表兄弟高頓在實驗中發現的現象,當兩個變數之間相關係數不為0或1,則將出現迴歸效應。

 

J舉個交易有關的例子來說明迴歸現象。下圖是交易的次數與獲利次數之間的關係,可能出現的狀況。

 

交易心理-迴歸效應

 

因此讀者可觀察到,除非是第3或第4種狀況,在相關性為1或0的狀況下才有可能賺賠是一致性且連續的出現,故在0~1之間任何種排列皆有可能,但最終狀況1或狀況2皆為勝率50%,所以過程中連續的賺或是賠只是運氣,而在本書中有一句話很清楚的說明了這現象-迴歸到平均值是一個解釋,但是沒有因果關係。

 

說到這就會讓人想起商業雜誌或是投資理財類的書籍中,有許多被稱作成功的人或是成功的案例,其實裡面內含了須多運氣的因子,然而卻被忽略而稱其結果多數來自於努力與專業能力所導致。

 

不只本書中從心理學的大師來看是如此,J也在一些書中有看過下列公式。

成功=能力+運氣

極大的成功=多一點點的能力+很多的運氣

 

不過了解許多事情多受運氣所影響,並不是告訴我們反正命運都決定了大多事的成敗,所以就可以不用努力,也不需要加強能力,反而是要學會看清楚事情或是結果的本質,在過程中有哪些是值得學習的,有哪些是運氣導致須要看淡他。如同交易中連續獲利需要理解這只是運氣,透過這樣的理解來淡化心中過度樂觀的情緒,同樣的連續輸錢,在風險可控制且有合理的回測根據下,是不需要過度悲觀與擔憂,讓交易心理迴歸理智,冷靜的面對下一筆交易,之前的輸贏不該影響下次進場的情緒與原先交易原則。

 

另外,從迴歸效應中也可以了解程式化交易的好處,透過一致性的交易邏輯,足夠多次的交易,降低每次交易輸贏的重要性,反映出長期的獲利性,而非透過少數的大賺翻身,然而能理解運氣與迴歸效應所扮演的角色,並屏除短期輸贏的心理影響,對多數人來相當困難,J期望透過本篇文章的說明,與讀者共勉之。