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期望透過本篇文章的說明,與讀者共勉之。

 

 

2013年10月30日 星期三

Multicharts報價串接DDE

 

本篇先不論有些軟體可以直接串接DDE字串的方法,因為通常可能會用多來源做備援系統或判斷報價速度,透過交易量者較大的在EXCEL上進行判斷,之後取出該格報價作為來源,因此學會EXCEL的串接DDE是特別重要

 

首先準備好報價來源,放置在EXCEL上, J 故意建置兩個分頁,如下圖左下角所示,以便於後續示範如何建立有多分頁的報價字串,注意此處要先存成英文檔名且格式為2007以前使用的.xls(本次示範mc軟體較舊未能試驗是否新版已經支援.xlsx)

 

建置DDE報價1

 

 

下圖為第二分頁,讀者未必要分兩個分頁,需要使用需求與管理是否方便,準備好後我們進行QM的設定。

 

建置DDE報價2

 

打開QM,如下圖選擇Data Sources

 

建置DDE報價3

 

往下拉可以找到universal DDE的選項,點選後按右側,clone(複製),本處讀者當然可以直接使用設定去變更這個未定義的報價來源,但我們通常要製作不只一個報價來源,因此透過複製的方式,可以不斷地建置多重的報價來源

 

建置DDE報價4

 

隨讀者喜好建立名稱,注意,第二欄位只能key 3個字母。

 

建置DDE報價5

 

按下ok後就出現在可用來源裡了,點選他,再按右邊的settings,進入字串設定

 

建置DDE報價6

 

首先示範,有分頁且指定欄位的格式,主要的邏輯為先key入=EXCEL|’[檔名.xls]分頁名’!格子位置完成如下圖。本範例讀者可從本篇最上方第二張圖看到,R2表示第二行,C6表示第六欄,就可以找到成交價的格子,同理R2C8就是累積成交量(某些報價軟體只提供累積成交量,若收取本格則在程式碼中,需要透過減去前一值的方式算出當根K棒單量)。之後再左下角按TEST,若是盤中接報價,即可發現有報價再跳動,若是盤後建置,則可透過在EXCEL上任意地方KEY數字,再還原的做法,讓EXCEL以為有新資訊在跳動

 

建置DDE報價7

 

接著示範不預設商品代碼的作法,首先重新建立另一個資料源。

 

建置DDE報價8

 

進入設定後,KEY法J在此處順便示範不預設分頁的做法,假定讀者並沒有建置分頁可以採用下圖的KEY法,因此主要邏輯就改為=EXCEL|檔名.xls!*, * 的部分,就是本次最大的差異,透過*的方式不先預設報價所在的格子,即可達到同資料源,接許多商品的優勢。

 

字串key好後,一樣在左下角按test,此時會多跳出一個視窗,要key入你要測的報價代碼(EXCEL的格子),如下圖。

 

建置DDE報價9

 

確認後就可以看到如下圖所示,一樣透過在EXCEL上更改報價的方式,讓EXCEL上的報價感覺有跳動,就可以測試有沒有成功。

 

建置DDE報價10

 

完成後,開始建置自訂的商品代碼,可參考J之前的文章 Multicharts建立自訂商品 ,下列步驟就跳快一點。

 

2013年10月23日 星期三

歷史波動率

 

接續前篇 選擇權評價-BS MODEL (with Excel) ,波動率主要有歷史波動率和隱含波動率兩種,此篇要先要紀錄的是歷史波動率。以 L 自己的交易心得來比喻波動率的話,瞭解波動率之前,看期權交易是方向和時間這二維的平面,瞭解波動率之後,看市場和策略像是立體的三維,方向、時間和波動。

 

在使用上,這個值不只對選擇權交易很重要,波動率本身就是選擇權評價重要的一個因素,不瞭解它的話,幾乎可以說別玩了。對於期貨交易也非常有參考價值,在期貨程式交易方面,也可以是不錯的濾網,甚至作為主要邏輯也可以。

 

歷史波動率的計算方法是: 一段期間內的收盤價計算的年化報酬率標準差,這句話不像中文,但其實不會很複雜,拿EXCEL作簡單的五日波動率範例,如下圖。

 

hv_EXCEL

 

步驟是

  1. 列出日期和收盤價

  2. 把收盤價取Log,紀錄在C欄,例如C7的公式是=LN(B7)

  3. 計算報酬率,就是Log相減,例如D7的公式是=C7-C6

  4. 計算五日標準差,例如E7的公式是=STDEV(D3:D7)

  5. 將標準差年化,例如F7的公式是=E7*SQRT(252)


 

這樣就計算好了,剛好可以看到這五日台指的歷史波動率算出來只有5.09%,真是低的可怕。

 

再來補充在Multicharts把歷史波動率寫成指標的語法,如下圖。

 

hv_id

 

計算就和上列的步驟一樣,這個指標可以算兩個期間的歷史波動率,參數是20和60,畫出來的圖如下。

 

hv

 

有了圖就可以觀察行情和波動率的走勢,一般來說,多頭時波動率低,空頭時波動率高。或是換個角度說,波動率高行情大,波動低行情小。以這樣的特性來說,就可以作為濾網和交易邏輯了。

 

深入一點的再紀錄,以上兩個範例計算最近的台指,五日是5.09%,二十日11.97%,表示台指波動是壓縮中(而且壓的很小),那這個波動率的數值意義是什麼?

 

以波動率10%來舉例,這是年化的(計算中有乘一個根號252),假設台指現在8400點,10%是840點,表示一年之後台指在7560~9240點(8400加減840點)的機率大約是68%,這個時間和空間可能比較沒概念。來算一個月的試試,10%是年化的,月的就再除根號12,等於2.89%,等於8400*2.89%=242點,表示一個月之後的台指在8158~8642點的機率是68%。那麼,假設你覺得台指的波動應該會大於這個幅度時,就應該作多波動率。

 

以上所述,要再嚴謹一點的說,68%就是正負一個標準差的常態分配下的機率,實際上指數分配並不是常態分配,這是另一個要深入的主題。要簡單明瞭的說,波動率越大就是波動大,比較會有行情,K線也可能比較大根,這樣就好了。

 

最後再整理一下,之後要繼續紀錄的是波動率在下列幾項的應用

  1. 作為程式的濾網

  2. 作為主要交易邏輯的測試 ( 歷史波動率策略設計 )

  3. 選擇權與隱含波動率  (隱含波動率 (with EXCEL VBA、C#) )


 

 

 

2013年10月20日 星期日

Multicharts建立自訂商品

 

在MC中建立自訂商品,讓我們可以透過外部資訊來研究對走勢的預測性,常見的外部資訊就是籌碼面資料,因此本篇將以台指期OI(未平倉量)作一個示範,讓讀者學習如何自行建立所需的商品於MC中。

 

一開始要先準備所需的外部商品資料檔,常見的可能是TXT檔或是CSV檔,因TXT部分可以先匯入EXCEL中並另存成CSV檔(詳細資料可於 匯入或匯出文字檔案 這個說明網頁中了解細部作法),而本篇將以CSV檔來作介紹,製作成MC可以讀取的格式。

 

首先不論讀者手上擁有的資料為何,至少須將符合如下圖的格式,依照日期、時間(日資料可省略)、開盤價、最高價、最低價、收盤價、交易量(若無可省略)排列,可發現因為OI一天僅有一個數值,故須複製貼上至符合四個價位皆有數值的狀態,存成CSV後關閉。( L 補充: 一般是常用有開高低收的資料,但TICK檔是可以僅有時間和資料兩欄位而已,那同樣也可以只用兩個欄位匯入)

 

MultiCharts中建立自訂商品1

 

接著開啟QutoeManager,在空白處按右鍵,開始建立自訂的商品代碼與相關設定,選法如下圖所示,最後選擇Manually(手動)。

 

MultiCharts中建立自訂商品2

 

跳出如下室窗,key入想取的名稱,並注意Data source如果是盤後資料只做研究用,就選擇ASCII,如果是有接受DDE盤中或盤後自動接受資訊則需要選擇DDE的來源,日後將再詳細介紹DDE建立方法。

 

MultiCharts中建立自訂商品3

 

完成後進入第一個分頁,這部分沒什麼需要動的,只要在描述上面KEY入敘述即可(本例:台指期OI),不KEY也沒差。

 

MultiCharts中建立自訂商品4

 

點選第二個分頁,使用客製化並設定如下圖所示,此處注意如果是籌碼面資料同常可以模仿設定如下,但若是其他商品價格,則須考量其價格跳動的資訊,這部分資訊通常可參考期貨商提供的商品規格網頁。

 

MultiCharts中建立自訂商品5

 

第三個分頁, J 通常習慣在交易區間的選項中選擇使用者自訂,主要是可以更符合交易上的需求,在圖型顯是上也比較好上下對齊,方便研究與觀察,因此即便是日資料, J 還是會將其設定成分線的格式,畢竟日資料也是可以修改成分線資料來匯入,為了保留日後使用彈性,都一律建置成方便DATA1使用的時間

 

MultiCharts中建立自訂商品6

 

完成後就可以在QM中找到這個自訂商品代碼,如下圖所示,在其上按右鍵,選擇匯入資料。

 

MultiCharts中建立自訂商品7

 

此時在跳出視窗中,先選擇要匯入的CSV檔,再調整匯入的周期(本例:DAY)、成交價與當地時間,並檢查QM是否有判讀到正確的欄位(日期、開、高、低、收)若無顯示,則讀者可自行調整成下列格式,一樣可以繼續匯入。

 

MultiCharts中建立自訂商品8

 

按下完成後顯示正在匯入,正常是很快的,如果有過久沒再動,就可能有錯誤,須重新檢查資料是否有誤,另外若不是第一次匯入資料,且已有部分資料與匯入資料重疊時,將跳出室窗詢問是否替代,讀者可自行選擇。

 

MultiCharts中建立自訂商品9

 

完成資料匯入後,打開MC主程式,開啟DATA1的圖(本例:TXF),此時要將想研究的外部資料放在同一張圖上,需要在圖上按下右鍵,選擇新增商品。

 

MultiCharts中建立自訂商品10

 

跳出視窗的第一個分頁中,去選擇商品來源(本例:ASCII),找到需要的商品代碼,如下圖。

 

MultiCharts中建立自訂商品11

 

點選第二個分頁,選擇商品周期(本例僅匯入日層級資料,故若選擇分線或TICK層級將顯示無資料)與顯示時間。

 

MultiCharts中建立自訂商品12

 

最後就大功告成,如下圖所示,可以開始利用DATA2的資料來進行程式撰寫與研究了。

 

MultiCharts中建立自訂商品13

 

 

2013年10月18日 星期五

Multicharts摩台結算日期

 

摩台結算日是每個月倒數第二個交易日,除了如前篇J所分享的 尾盤出場策略1-建立日期表 所述作一個參考表之外,可以利用一些語法來達成。

 

以下就邊照著程式碼作注釋了。

 

var: M(0),DM(0),DW(0),STWSD(0);

if date <> date[1] then STWSD=0;

M=Month(Date); //取得月份
DM=DayOfMonth(Date); //取得幾日
DW=DayOfWeek(Date); //取得星期幾

 

//如果是大月份的話,結算日期對應星期幾來求出摩台結算日

If M=1 or M=3 or M=5 or M=7 or M=8 or M=10 or M=12 then begin

If DM=30 and DW=4 then STWSD =1;
If DM=30 and DW=3 then STWSD =1;
If DM=30 and DW=2 then STWSD =1;
If DM=30 and DW=1 then STWSD =1;
if DM=29 and DW=4 then STWSD =1;
if DM=28 and DW=5 then STWSD =1;
if DM=28 and DW=4 then STWSD =1;


end;

 

//如果是小月份的話,結算日期對應星期幾來求出摩台結算日

If M=4 or M=6 or M=9 or M=11 then begin

If DM=29 and DW=4 then STWSD =1;
If DM=29 and DW=3 then STWSD =1;
If DM=29 and DW=2 then STWSD =1;
If DM=29 and DW=1 then STWSD =1;
if DM=28 and DW=4 then STWSD =1;
if DM=27 and DW=5 then STWSD =1;
if DM=27 and DW=4 then STWSD =1;


end;

 

//如果是2月份的話,結算日期對應星期幾來求出摩台結算日

If M=2 then begin

If DM=27 and DW=4 then STWSD =1;
If DM=27 and DW=3 then STWSD =1;
If DM=27 and DW=2 then STWSD =1;
If DM=27 and DW=1 then STWSD =1;
if DM=26 and DW=4 then STWSD =1;
if DM=25 and DW=5 then STWSD =1;
if DM=25 and DW=4 then STWSD =1;


end;

 

//台股有時過年過節使得結算日期更改,就把這些日期作記號,往後若有變動也是從這裡加進

if date = 1060124 then STWSD = 1;
if date = 1080926 then STWSD = 1;
if date = 1090120 then STWSD = 1;
if date = 1090526 then STWSD = 1;
if date = 1120224 then STWSD = 1;

 

//以這個語法作指標,可以畫個線圖來觀察

plot1(STWSD,"STWSD");

 

如同下圖,就完成囉。

STWSD

 

 

 

2013年10月15日 星期二

交易心理-因果關係與小數法則

 

討論到交易中的因果關係與小數法則,就讓J想到一個常被提及的交易現象,讀者可先觀察下圖,發現似乎當出現突兀量(大量)後市場就會開始量縮往反向走,一般將此K棒的型態稱之為出量反轉。

 

因果1



 

然而透過這樣的觀察就真的可以交易致富? 從  快思慢想  一書中所提及的因果關係來看,我們是型態的尋找者,合理世界的信仰者,因為系統一不善於懷疑,並有自動搜尋因果與建立故事的能力,將看到的現象合理化,除非立刻被否定,否則我們會認為訊息是真的。


 


在交易中除了K棒型態的因果關係,J也常聽到消息面與走勢的因果關係,例如2013/10/3台指的大幅上漲200點,當天就聽到許多朋友再問,到底發生了甚麼事,為何台灣漲這麼多?而此時新聞的資訊則滿足了人們對一致性與連貫性的需求,因為多數人認為,凡是重大的事件應該會有影響力並帶來後果(大漲或大跌),而當我們看到後果(大漲或大跌)就須要有原因來解釋。

 

因此J在看待交易中許多的因果關係上,會認為讀者若用眼睛發現了市場的規律,千萬別因此信以為真,有可能只是受到  認知放鬆  、近因效應與  可用性偏見  的影響應該先想辦法將其現象定義,並透過程式的輔助來驗證長期的績效,是否有顯著性的優勢,才值得相信所發現的規律是真有其規律存在,以避免我們常傾向把不正確的因果思考應用至需要統計推理的情境中。

 

在消息面對交易的因果關係中,J認為若不是長線投資者,短期的價格變動,交易者快速的反應將是決勝的關鍵,而真實發生了什麼事,就等調整完部位再去研究就好,或對於純價格交易者來說不去研究也沒有關係,因為若相信價格反應一切,那就只要能快速因應市場價格的變化即可,免除心理上受到許多消息面的因果關係而影響原本的價格交易行為。

 

小數法則,J把它放在本篇一起討論,是因為小量樣本的結果將使我們更容易把事後才證明是隨機的現象,卻在事前看成是有跡可循的規律,導致許多錯誤的因果連結。

 

引用書中的兩句話,我們來思考樣本數的多寡對結果的影響。

  1. 大樣本比小樣本精確。

  2. 小樣本比大樣本容易得出極端結果。


 

從上述兩句話來看,其實這兩句是同一個意思,大樣本因為比較精確所以要得出極端的結果,在統計機率上是比較低的,而小樣本因為取樣數少,則其結果常受到取樣運氣(Sampling luck)影響,而導出不精確的結果,產生錯誤的因果推論。

 

 

在交易者的聚會中,J常聽見以下說法。

  1. 最近寫了一支當沖策略,是特殊型態的交易,2005年至今交易次數大概80筆,績效還不錯,感覺抓到了市場不為人知的規律。

  2. 最近主觀交易台指很順,所以之後就會開始放大部位了。

  3. 最近新上架的策略一直被巴,所以還要再觀察一下,先試單就好。


 

從第一個例子中可以明顯發現樣本數的多寡影響了判斷,但因為我們對於樣本的大小沒有足夠的敏感度,導致不知交易次數該多少才值得相信在感覺上80或200似乎對許多人來說是沒甚麼差異,然而對於嚴謹的程式交易者來說,筆數不多的策略相對穩定性就不夠,過去回檔小,也許只是剛好沒碰到不利的行情,真實上線後可能跟回測天差地別。

 

第二與第三個例子則可看出,我們常常受到近期小量的交易狀況而在交易信心上有了很大的影響,除非讀者是作高頻交易,否則當樣本數過少,用此結果去判斷是否放大或縮小部位將不是好的作法,並且更不該用近期上線幾筆的交易來推翻先前回測也許超過千筆的長期交易結果。

 

最後透過以上的小案例與心理學的分析,J期望讀者能多留意自己是否也在不知不覺中受到的因果關係與小數法則的影響,建議透過程式交易的輔助,產生盡量多的交易次數,減少直覺誤把隨機事件判斷為系統化的結果,並試著去相信回測的大數法則,其驗證將優於我們眼睛所看到的市場規律與近期小量的表現讓取樣運氣與錯誤的因果連結降低,達成長期穩定的交易。


 



 

2013年10月9日 星期三

尾盤出場策略1-建立日期表

 

J注意到一般朋友進行策略撰寫的時候,可能較容易頭重腳輕,即非常努力思考進場邏輯的創意,卻容易遺忘尾盤出場的創意其實也影響甚大,因此本篇將介紹一個最基本的尾盤出場的方法作為系列的第一篇。

 

此方法基本上說穿了很簡單,就是當沖不要都只在1330前出場,也許常常會圖個方便而沒有使用這樣的做法,又或是使用當沖保證金的人受限於規定都必須於30分前平倉出場,然而J之後會簡單證明市場是殘酷的,越有錢的人或法人可能因為不會用到如此滿的保證金,策略也相對多元,因此多承擔幾分鐘的風險,確實也有其報酬可拿,以下將示範先從建立結算日期表作為FUNCTION,再於訊號中使用。

 

首先,先選擇新增功能函數的頁面。

 

尾盤出場策略1

 

再鍵入名稱,本例以END OF MONTH縮寫取名,讀者可自行依喜好設定,其他項目可不用調整。

 

尾盤出場策略2

 

將結算日期KEY入如下圖所示,每年做一次,但讀者千萬記得若碰到颱風休假調整日期,須要更改之前所預KEY的日期,才不會發生錯誤。

 

尾盤出場策略3

 

最後加上如下的判斷式,讓本FUNCTION可以在結算當天為1,非結算日為0。

(註: L補充,表列的方法是較完整的方式,另外結算日的判斷也可以寫函數,邏輯是(星期三) && (15號~21號) ,但延後結算日可能需要再稍微修改 )

 

尾盤出場策略4

 

J將先前撰寫的 通道突破原型進場策略 拿來作為測試的基準,首先使用固定時間於1325後出場的方式,程式碼如下。

 

尾盤出場策略5

 

績效如下圖,來回手續費共設定為800,自2005年回測至今,獲利55萬回檔約28萬,每筆交易平均賺319元。

 

尾盤出場策略6

 

尾盤出場策略7

 

現在我們將尾盤出場時間修改如下,在非結算日晚點出場,結算當天維持一樣25分出場。

 

尾盤出場策略8

 

其他參數與回測時間皆不變,績效如下圖所示。

 

尾盤出場策略9

 

尾盤出場策略10

 

可以發現獲利明顯增加35萬,MDD幾乎不太影響,平均每筆獲利增加了約200元,效果相當顯著。

 

這樣簡單的測試期望能提醒讀者,不要認為尾盤的出場幾分鐘沒甚麼差別,也許市場規則確實影響了交易的結果,不要怕麻煩,多花一點時間建立一個結算日期表,也許可以幫助大家多獲得一些報酬,然而本篇的測試相當的基本,實際上EOM還有許多用途,日後J將繼續介紹,讀者也可先行思考。

 

另外此種建立日期表的方式,也可用在交易海外事件上,透過J之前分享的 經濟數據 一文中,讀者可先尋找對市場有較大影響的事件公布日期,建立於FUNCTION中,即可回測,也許當日行情確實比其他日子更值得交易。

 

2013年10月5日 星期六

網站介紹_ 程式交易≠HOLY GRAIL _ james選擇權

 

此篇分享兩個優質網站,對於期貨和選擇權分別都有大量的內容可以參考。

 

程式交易≠HOLY GRAIL

主題為期貨程式交易,內容包含程式交易測試、策略邏輯介紹、部位規劃、交易經驗等等,內容非常多元且有深度,往往可以從中得到不一樣的思考心得,可應用在自己的交易中。文章數量和更新速度都是國內少見的優質期貨網站。

 

 程式交易


 

 

 

 

james 的部落格

主題為選擇權策略的網站,包含各種選擇權策略的模型及建立方式、各個選擇權greeks的應用,除了理論上的介紹外,還有實務上的應用,是很好的選擇權交易參考網站。

 

james