2013年12月17日 星期二

臺指期、臺指選擇權2014年5月15日歐洲掛牌上市

 

期交所發布了新聞稿,可到期交所網站看全文。其中有重點說明:

 

一、掛牌商品:期交所授權 EUREX 推出新臺幣計價,以 TX 及TXO 為標的之一天期期貨契約

 

二、交易時段:限於期交所與 EUREX 均為交易日之期交所盤後時段。本商品規劃在 EUREX 之交易時間為德國時間 7:45~21:00 (日光節約時間 8:45~21:00),即臺灣時間 14:45~4:00 (日光節約時間14:45~3:00)。

 

三、不影響我國期貨市場正常交易時段之交易人部位:因該商品之最後結算價為當日臺股期貨契約及臺指選擇權之每日結算價,不會造成臺股期貨及臺指選擇權之盤後價格波動風險,故對我國期貨市場正常交易時段之交易人部位風險並無影響

 

四、在 EUREX 交易時,遵循 EUREX 相關規範:本商品在 EUREX交易,視同國外期貨商品,應遵循 EUREX 交易、結算、市場監視等規範。

 

五、每日未沖銷部位處理方式:每日 EUREX 交易時段結束,期交所次日開盤前,期交所帳戶最終受益人(交易人)於 EUREX 之未沖銷部位將實物交割為 TX 及 TXO 部位,並移轉回期交所,併入該交易人於期交所之 TX 及 TXO 未沖銷部位,該交易人部位應依我國期貨市場交易、結算、市場監視及保證金等相關規範,由期貨商完成相關檢核後,始完成部位移轉之程序。

 

以上五個重點是新聞內容,以下是L的一些觀察和想法。

 

既然是台灣盤後時間的台指期權交易,那很自然就要跟摩台比一比了

 

從投資人的角度來看交易和避險需求,

一、Eurex台指交易時段很長,會到台灣時間凌晨4點,比摩台長。

二、新台幣計價,標的就是台指期,而摩台期是美元計價,標的是摩台指數。Eurex台指對於台灣投資人當然是比較直觀方便。

 

從商品本身的設計來看影響,

一、摩台和台指是近似但不同,再加上摩台和台指交易時段白天是重疊的,使得流動性分散。

二、Eurex台指和台指是完全一樣的標的,晚上的交易部位到了白天會直接轉換成台指。時段是區隔的,不會影響現有台指流動性,反而在晚上的部位轉回台指會增加台指的流動性。

 

從投資人和商品的角度來想,Eurex台指都比摩台的優勢多,只要看到時候Eurex台指的成本多少,量是不是夠大。如果量夠大,或許以後晚上就是看它而不再是摩台了,然後就繼續開發盤後的台指交易策略。

 

當然重點是量會不會夠,在Eurex看到有前例可尋,Eurex KOSPI Product (OKS2)

 

這個商品是韓國交易所的KOSPI 200 指數選擇權在Eurex交易,時段區隔,韓元計價。我們期交所應該就是參考他們的模式來設計Eurex台指。他們的產品是成功的,L看近期成交量在7萬口以上,有時會到15萬口以上,所以Eurex台指應該也是蠻看好的。

 

 

2013年12月14日 星期六

秒K應用

 

一般多數交易者在使用或觀看K棒的時候,通常從1分、5分、10分線開始著手,稍微想做些差異化的時候可能使用2分線、3分線、7分線等較少見的K棒周期,然而若跳脫分線框架,當科技進步,電腦效能日新月異,秒線的使用在MC上也已經完全不是問題,也許現今交易的戰場已經不是分線可因應?為了證明這個想法或差異化我們既有的策略,我們開始思考使用秒k來作交易,至於該要設定多少秒呢?

 

J這邊可以提供讀者一個方向,首先看一個例子,3分線表示180秒,若設定為177秒,則因為177/(180-177)=59,所以表示當一般的3分線走了59根K棒之後,因為每一根省下3秒的時間,導致在177秒的K棒設定下,圖上已經畫出了60根K,反之設定成183秒則比原本分線少1根K棒。

 

透過多或少製造1根K棒,也許能讓我們減少一些在整分時敲單的滑價(因一般程式單若是用指標型撰寫將在00秒時敲單),而本篇將延續海龜通道突破策略的精神,稍微小改程式碼成為利用close價突破來進單的指標型策略,以反映秒k收盤價的微小差異在近年來的影響。

 

程式碼修改如下圖。

 

1

 

建立用close所創造的高低區間,回取K棒數(HL)參數讀者可自行嘗試。

進場與出場也以最簡單的方式修改如下圖。

 

2

 

須注意,在撰寫秒線以下層級時,TIME要改為TIME_S才不會錯誤喔!另外本篇利用之前提及的尾盤出場策略1-建立日期表,作最後進場與出場時間調整,以及漲跌幅超過6%的進場限制。

 

在參數相同的情況下,本篇利用最多加碼5口來突顯出3分線與177秒的差異,首先我們先來看3分線的表現如何,回測時間為2007年至今,來回成本單筆設定800元。

 

3

 

再看看177秒的績效圖如下。

 

4

 

可以發現兩者在同樣狀況下,177秒K的回檔略小於3分線,而且獲利大約多了快100萬。再來觀察近年來表現,如下圖所示。

 

5

 

上方的圖是3分線,可以看出近年來已經無法再創新高(上次新高點大約為2011年2月),而下圖177秒K的在2013年9月還有再創新高。

 

經過本篇的實驗證實,也許過往的簡單模型在近年來無法表現得令人滿意,但透過細微的變化,許多邏輯仍然是持續有效的,只是現在交易的戰場或許已經拉到秒K上了,讀者可以再延伸思考透過不同的以往的K棒計算,可能也會有更好的表現。

 

 

2013年12月13日 星期五

QuoteManager 回補期交所行情資料(C#)

 

下單系統有時候難免會出狀況,行情漏接是偶爾會碰到的問題,這時事後就要處理行情的回補。如果是有訂閱行情資料的可以線上回補即可,但沒有的呢? 可能要請別人匯出文字檔來回補,但就是有點麻煩。其實偶爾漏個一兩天,還是有簡便方法可以自己處理的,就是直接拿期交所行情來回補。

 

期交所的網站有過去三十日的行情資料提供下載,如圖。

 

download

 

我們下載之後可以得到一個ZIP檔,解壓縮後得到RPT檔,其實就是文字檔,裡面包含當日所有期貨商品的TICK資料,不過我們僅需要台指期的資料而已,這時就要作些小小處理,先看RPT檔的格式。

 

rpt

 

格式為日期,商品,月份,時間,價位,成交量,還有跨月價差用的欄位。而我們想要轉資料進的QuoteManager,要求的TICK檔格式為日期,時間,價位,成交量,如下圖。

 

tick format

 

所以可以利用一個小程式,將格式轉換輸出文字檔就OK了,如下圖,一個來源的RPT和一個輸出的TXT,兩個檔案的路徑和一個執行按鈕。

 

form

 

程式很短,我們只需要兩個輸出入串流,

FileInfo source = new FileInfo(textBox1.Text);
StreamReader sr = source.OpenText();

FileInfo destination = new FileInfo(textBox2.Text);
StreamWriter sw = destination.CreateText();

 

設定來源及目的的檔案路徑,然後處理來源的期交所資料,

其中要處理的部分有:

1. 只要台指期近月

2.成交量要除以2

3.處理成QM的TICK格式(有符號/、: 這個)

 

關於期交所資料每日下載的排程設定可以參考前文,取得期交所每日行情資料 。

程式碼如下,歡迎參考指教。

 
namespace RPTtoQM
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

FileInfo source = new FileInfo(textBox1.Text);
StreamReader sr = source.OpenText();

FileInfo destination = new FileInfo(textBox2.Text);
StreamWriter sw = destination.CreateText();

String tmps = "";
String month = "";
int qty=0;

while( sr.Peek()>=0 )
{
tmps = sr.ReadLine();

if ( tmps.Length>=10 && tmps.Substring(9, 2) == "TX")
{
if (month == "") { month = tmps.Substring(17, 6); }

if (tmps.Substring(17, 6) == month && tmps.Substring(23, 4)==" ")
{
if (tmps.Length == 50) { qty = Int32.Parse(tmps.Substring(41, 3)) /2 ; }
else if (tmps.Length == 49) { qty = Int32.Parse(tmps.Substring(41, 2)) / 2; }
else if (tmps.Length == 48) { qty = Int32.Parse(tmps.Substring(41, 1)) / 2; }

sw.Write(tmps.Substring(0, 4) + @"/" + tmps.Substring(4, 2) + @"/" + tmps.Substring(6, 2) +","
+ tmps.Substring(29, 2) + @":" + tmps.Substring(31, 2) + @":" + tmps.Substring(33, 2) + ","
+ tmps.Substring(36, 4) + "," + qty.ToString() +
"\r\n");
}
}

}

sw.Flush();
sw.Close();
sr.Close();

}
}
}

 

 

 

2013年12月11日 星期三

選擇權GREEKS實作(C#)

 

在能夠計算 選擇權評價-BS MODEL (with Excel) 及 隱含波動率 (with EXCEL VBA、C#) 之後,再來剩GREEKS了,要計算四個影響價格的變數是Delta、Gamma、 Vega、Theta,完成這部份就可以得出目前選擇權部位組合的各項數值。關於這些希臘字母的定義和作用,都需要深入瞭解後才能對選擇權策略有所掌握,進而設計出選擇權策略。

 

此篇要紀錄的僅是關於系統開發,雖說大部份的交易軟體都會提供GREEKS資料,但總要是自己寫的才能確定正確性,因為券商軟體算的不一定對。當然也有許多人不在意些微差距,或根本沒在觀察GREEKS,但那樣操作選擇權是無法進步的,再說若要自己建立策略模組,這些也只是第一步而已。

 

大部份設計選擇權監視程式的軟體是EXCEL,因為最簡便,直接利用公式和一些函數設計就可以完成,若要即時串接部位的話,大部份是寫VBA程式和券商API串接,而行情的部份可以用DDE或API來接收。

 

但是EXCEL會有效能問題,如果接受行情多,再加上運算邏輯複雜,EXCEL很可能會有延遲的狀況,因此比較好的方式還是自己寫程式,可以先由券商API所提供的範例程式來測試,可能是VB、C#、C++或Delphi等等,選一個好寫的來測試收行情、回報、部位。此篇L要紀錄的是以C#來實作選擇權GREEKS。

 

整段範例程式碼貼在最後面,需要先說明一下前因後果,先有一個DataTable是用來紀錄未平倉的選擇權部位,這個副程式所要處理的是計算目前所有未平倉選擇權部位的GREEKS並寫進DataTable,這個DataTable再與DataGridView串接,就可以顯示在FORM上

 

這個DataTable,取名dtOI,至少有以下的欄位:

 

dtOI.Columns.Add(new DataColumn("SettleM", typeof(string))); //月份

dtOI.Columns.Add(new DataColumn("Strike", typeof(double))); //履約價

dtOI.Columns.Add(new DataColumn("CP", typeof(string))); //Call or Put

dtOI.Columns.Add(new DataColumn("BS", typeof(string))); //Buy or Short

dtOI.Columns.Add(new DataColumn("Qty", typeof(string))); //口數

dtOI.Columns.Add(new DataColumn("Match", typeof(double))); //成交價

dtOI.Columns.Add(new DataColumn("Market", typeof(double))); //市價

dtOI.Columns.Add(new DataColumn("VOL(%)", typeof(double))); //隱含波動率

dtOI.Columns.Add(new DataColumn("DELTA", typeof(double))); //DELTA

dtOI.Columns.Add(new DataColumn("GAMMA", typeof(double)));//GAMMA

dtOI.Columns.Add(new DataColumn("THETA", typeof(double))); //THETA

dtOI.Columns.Add(new DataColumn("VEGA", typeof(double))); //VEGA

 

在執行副程式之前,除了最後五欄之外都是準備好的,然後有一些變數要準備

AssetPrice 期貨價格

Strike 履約價

InterestRate 利率

Expiry 到期因子

Target 選擇權的市價

 

還有之前紀錄隱含波動率的類別,一開始要NEW一下。

Option op = new Option();

 

然後就開始了,看片段來說明一下

 

圖片 1

 

圖片 3

 

圖片 4

 

以下PUT的部份就依此類推。程式碼如後所貼,有一些使用到的參數及關聯FORM的變數沒有仔細說明,不過整個架構已經是可以瞭解的了。以前 L 設計時找不到完整的參考資料,一步步的自己設計,現在若有同樣需求的朋友看到這邊可以自由取用,歡迎參考及指正

 
private void Greeks()
{
int i = 0;
AssetPrice = double.Parse(label16.Text);

while (i < dtOI.Rows.Count)
{
Strike = double.Parse(dtOI.Rows[i]["Strike"].ToString());
Target = double.Parse(dtOI.Rows[i]["Market"].ToString());
Qty = double.Parse(dtOI.Rows[i]["Qty"].ToString());

//期貨
if (dtOI.Rows[i]["CP"].ToString() == "")
{
if (dtOI.Rows[i]["BS"].ToString().Trim() == "B")
{
dtOI.Rows[i].SetField("DELTA", 200 * Qty );
}
if (dtOI.Rows[i]["BS"].ToString().Trim() == "S")
{
dtOI.Rows[i].SetField("DELTA", -200 * Qty );
}
}

//CALL civ(double AssetPrice, double Strike, double InterestRate, double Expiry, double Target)
if ((dtOI.Rows[i]["CP"].ToString().Trim()) == "C")
{
if (dtOI.Rows[i]["PId"].ToString().Trim() == "TXO")
{
if (dtOI.Rows[i]["SettleM"].ToString().Trim() == label10.Text.Substring(0, 6)) //近月
{
AssetPrice = double.Parse(label16.Text);
Expiry = Expirynear;
}

if (dtOI.Rows[i]["SettleM"].ToString().Trim() == label11.Text.Substring(0, 6)) //遠月
{
if (label22.Text != "")
{
AssetPrice = double.Parse(label22.Text);
}
else { AssetPrice = double.Parse(label16.Text); }
Expiry = Expiryfar;
}
}
else //週選
{
if (wnFid != "MX")
{
if (dtOI.Rows[i]["PId"].ToString().Trim().Substring(1, 2) == wnFid.Substring(1, 2)) //近週
{
AssetPrice = double.Parse(label23.Text);
Expiry = Expirywn;
}
}

if (wfFid != "MX")
{
if (dtOI.Rows[i]["PId"].ToString().Trim().Substring(1, 2) == wfFid.Substring(1, 2)) //遠週
{
AssetPrice = double.Parse(label22.Text);
Expiry = Expirywf;
}
}
}

civ = op.civ(AssetPrice, Strike, InterestRate, Expiry, Target);
d1 = op.d1(AssetPrice, Strike, InterestRate, Expiry, civ);
nd1 = Math.Exp(-0.5 * d1 * d1) / Math.Sqrt(2 * Math.PI);
nd2 = op.NormsDist(d1 - civ * Math.Sqrt(Expiry));

//DELTA NormsDist(double x) d1(double AssetPrice, double Strike, double InterestRate, double Expiry, double Volatility)
DELTA = op.NormsDist(d1);
GAMMA = nd1 / (AssetPrice * civ * Math.Sqrt(Expiry));
THETA = (-(AssetPrice * nd1 * civ / (2 * Math.Sqrt(Expiry))) - InterestRate * Strike * Math.Exp(-InterestRate * Expiry) * nd2) / 365;
VEGA = (AssetPrice * (Math.Sqrt(Expiry)) * nd1) / 100;

dtOI.Rows[i].SetField("VOL(%)", Math.Round(civ * 100, 4));

if (dtOI.Rows[i]["BS"].ToString().Trim() == "B")
{
dtOI.Rows[i].SetField("DELTA", Math.Round(DELTA * 50 * Qty , 0));
dtOI.Rows[i].SetField("GAMMA", Math.Round(GAMMA * 50 * Qty * AssetPrice / 100, 0));
dtOI.Rows[i].SetField("THETA", Math.Round(THETA * 50 * Qty, 0));
dtOI.Rows[i].SetField("VEGA", Math.Round(VEGA * 50 * Qty, 0));
}
else if (dtOI.Rows[i]["BS"].ToString().Trim() == "S")
{
dtOI.Rows[i].SetField("DELTA", Math.Round(-DELTA * 50 * Qty , 0));
dtOI.Rows[i].SetField("GAMMA", Math.Round(-GAMMA * 50 * Qty * AssetPrice / 100, 0));
dtOI.Rows[i].SetField("THETA", Math.Round(-THETA * 50 * Qty, 0));
dtOI.Rows[i].SetField("VEGA", Math.Round(-VEGA * 50 * Qty, 0));
}
}

//PUT piv(double AssetPrice, double Strike, double InterestRate, double Expiry, double Target)
if ((dtOI.Rows[i]["CP"].ToString().Trim()) == "P")
{
if (dtOI.Rows[i]["PId"].ToString().Trim() == "TXO")
{
if (dtOI.Rows[i]["SettleM"].ToString().Trim() == label10.Text.Substring(0, 6)) //近月
{
AssetPrice = double.Parse(label16.Text);
Expiry = Expirynear;
}

if (dtOI.Rows[i]["SettleM"].ToString().Trim() == label11.Text.Substring(0, 6)) //遠月
{
if (label22.Text != "")
{
AssetPrice = double.Parse(label22.Text);
}
else { AssetPrice = double.Parse(label16.Text); }
Expiry = Expiryfar;
}
}
else //週選
{

if (wnFid != "MX")
{
if (dtOI.Rows[i]["PId"].ToString().Trim().Substring(1, 2) == wnFid.Substring(1, 2)) //近週
{
AssetPrice = double.Parse(label23.Text);
Expiry = Expirywn;
}
}

if (wfFid != "MX")
{
if (dtOI.Rows[i]["PId"].ToString().Trim().Substring(1, 2) == wfFid.Substring(1, 2)) //遠週
{
AssetPrice = double.Parse(label22.Text);
Expiry = Expirywf;
}
}
}

piv = op.piv(AssetPrice, Strike, InterestRate, Expiry, Target);
d1 = op.d1(AssetPrice, Strike, InterestRate, Expiry, piv);
nd1 = Math.Exp(-0.5 * d1 * d1) / Math.Sqrt(2 * Math.PI);
nd2 = op.NormsDist(d1 - piv * Math.Sqrt(Expiry));

//DELTA NormsDist(double x) d1(double AssetPrice, double Strike, double InterestRate, double Expiry, double Volatility)
DELTA = op.NormsDist(d1) - 1;
GAMMA = nd1 / (AssetPrice * piv * Math.Sqrt(Expiry));
THETA = (-(AssetPrice * nd1 * piv / (2 * Math.Sqrt(Expiry))) + InterestRate * Strike * Math.Exp(-InterestRate * Expiry) * nd2) / 365;
VEGA = (AssetPrice * (Math.Sqrt(Expiry)) * nd1) / 100;

dtOI.Rows[i].SetField("VOL(%)", Math.Round(piv * 100, 4));

if (dtOI.Rows[i]["BS"].ToString().Trim() == "B")
{
dtOI.Rows[i].SetField("DELTA", Math.Round(DELTA * 50 * Qty , 0));
dtOI.Rows[i].SetField("GAMMA", Math.Round(GAMMA * 50 * Qty * AssetPrice / 100, 0));
dtOI.Rows[i].SetField("THETA", Math.Round(THETA * 50 * Qty, 0));
dtOI.Rows[i].SetField("VEGA", Math.Round(VEGA * 50 * Qty, 0));
}
else if (dtOI.Rows[i]["BS"].ToString().Trim() == "S")
{
dtOI.Rows[i].SetField("DELTA", Math.Round(-DELTA * 50 * Qty , 0));
dtOI.Rows[i].SetField("GAMMA", Math.Round(-GAMMA * 50 * Qty * AssetPrice / 100, 0));
dtOI.Rows[i].SetField("THETA", Math.Round(-THETA * 50 * Qty, 0));
dtOI.Rows[i].SetField("VEGA", Math.Round(-VEGA * 50 * Qty, 0));
}
}

//dtOI.Rows[i].SetField("VOL(%)", i);
i = i + 1;
}

}

 

 

 

2013年12月6日 星期五

波段突破策略(with ATR)

 

紀錄一個常用也好用的邏輯,突破策略。區間突破最常使用在當沖程式裡,不過波段的程式使用起來也不差,基本邏輯就是由開盤向上漲多少要突破作多,向下跌多少要突破做空,很單純,最主要的因素只有這個突破的臨界點是如何決定?

 

先前曾經紀錄過簡單當沖突破的測試 - 當沖逆勢單進場。其中提到開盤點為準,漲50點作多,跌50點作空,如果沒翻就擺到收盤,這樣的邏輯在近年是無法獲利的。但是波段程式就不一樣了,能獲利。只是突破的區間要思考,不是單純點數或比例就能適用的。

 

這時 Average True Range(ATR) 平均真實範圍 就是個好用的指標,當行情波動大時,這個區間確認也應該放大,波動小時,則區間也小,因此加上波動性的指標有用處,ATR比其它波動性指標直接方便的是它本身就是價格的表示,而不是比例或無法對應的數字。例如ATR 100點,就是近期日高低點數平均在100點,而開盤後往上50點或往下50點的區間內都很正常,而我們設定的突破邏輯就是市價漲超過50點作多,跌超過50點作空。

 

搭配觀察指標和策略訊號的程式碼範例如下。

 

id

 

bkatr

 

在策略設計的部份只有一個參數,是要決定ATR用多少期間,其中變數TRX是每日的TR值,ATR用來紀錄…ATR,TR的陣列和其中註記//replace AverageArray的部份是因為Multicharts內建的AverageArray用起來不對勁,就自己再寫進策略裡,內容就是把TRX一個個放進TR陣列裡,放到最後一個時順便算一下裡面那些TR的平均值紀錄到ATR。

 

再詳細一點的紀錄程式,因為ATR在這個例子中使用的是日線層級,但實際運用的K線可能是10min、5min、8min之類的,會要再搭配其它的指標,所以才使用這種Array的方式將TR記錄下來,在新的一天開始時計算一次( date <> date[1] ),然後看是要多少個TR的平均,一個一個放進去,另外特別注意Array第一個位置是0起始,所以for迴圈裡目標值減一,這樣個數才對。

 

這個Array+For迴圈的方法在使用不同k線層級的指標時蠻好用的,可以多加利用,如果是常coding的朋友可能會覺得一個地方怪怪的,平常都是for i=0 to X,這邊因為i是 Multicharts 的關鍵字所以不能用,常常都要再改成 j….,是特別的習慣。

 

回到突破邏輯,以ATR所計算的近日高低作為區間,它近期的進出及績效(2005~2013,10min)如下。

 

chart

 

performance

 

trade

 

以一個不加濾網、不加出場邏輯、未設停損停利的邏輯來說,這樣的績效是蠻不錯的,值得繼續研究開發。

 

延伸一點的說,區間可以使用其它的波動性指標來調整、或直接用N日高低區間、或布林通道的區間、或參考CDP之類的,都可嘗試看看。這樣的突破邏輯應該是每個人都會測試過的基本款,不過應用時如何決定區間指標和如何搭配濾網就是深入的工夫了。

 

 

2013年12月5日 星期四

尾盤出場策略2-加強判斷

 

一支交易策略可簡單分成進場主邏輯、出場主邏輯,而當沖策略在尾盤必須出場的特性,使得其重要性在出場設計上不容小覷,然而根據 J 幾年來的觀察,似乎許多交易者並不太在乎這點,大多專心於進場與一般停損的設計,而最後出場僅使用指定時間出場,因此本篇延續 尾盤出場策略1-建立日期表,來簡單介紹一些尾盤現象對績效的影響性,提供讀者思考更多在尾盤邏輯設計的一些想法。

 

本篇測試的策略在進場主邏輯部分延續 通道突破策略  一文中所使用的程式碼,讀者可先行參考,然而為了增加交易次數以突顯出尾盤的影響性,本篇改用台指期1分線交易,參數也稍微修改,並配合尾盤出場策略1-建立日期表 所使用的最終出場時間作為初始設計,其出場設計如下圖,讀者可先回憶一下。

 

圖片 1

 

2007年至今交易績效如下(手續費來回共800元)

圖片 2

 

現在,開始進入本篇的尾盤出場邏輯,主要新增的想法是,交易時間以及賺賠對於出場快慢的影響,以及是否該逆勢找好的點出場(例如作多拉高出),或順勢出場(例如下跌後多單出場),讓我們直接看程式碼與績效得到簡單結論。

 

圖片 3

 

從上圖中可發現,若策略處於虧損狀態,且12點50分至13點時是上漲的,則於13點後就盡快出場,如同虧損時找有利的點出場,其改善的績效如下圖。

 

圖片 4

 

獲利增加約10萬,MDD幾乎不變,效果不錯,然而若是條件相反,當策略賺錢早點出場則會如何呢?直接看下圖績效來得到結論。

 

圖片 5

 

可發現獲利明顯減少23萬,MDD幾乎不變,符合虧損時早點讓部位出場,賺錢時讓獲利奔馳的精神,然而讓賺錢的部位一直持有到尾盤就是最好的嗎? J用同樣的手法找到稍微能繼續改善績效的方法,一樣直接來看程式碼。

 

圖片 6

 

其想法主要在思考,若是賺錢的時候,大多數當沖順勢策略應該也是賺錢,而假定多數策略與K棒周期的影響大約都在13:10至13:20分左右出場,因此若行情在此時間轉為與今日當沖走勢反向,也許顯示法人在尾盤作價上並不積極,持有過久也不一定能吃到13:30當沖強制平倉以及現貨收盤後期貨的順勢行情,使得順短期的勢先出場較有優勢,其績效如下。

 

圖片 7

 

獲利上升6萬,MDD續減少,反之此時若改為逆勢出場(即條件3與4對調),績效如下。

 

圖片 8

 

顯示若尾盤趨勢持續順勢,不該提早出場,將大幅減少獲利與增加MDD。

 

最後,透過尾盤簡單的上漲與下跌現象,與交易時間的特色,將有助於進一步改善交易績效,而本篇並非特別要研究其成因為何,只是挑出可能相對有意義的時間去做測試,得出符合一般賺錢精神的結論,賠錢快出,而且逆勢找好機會出效果不錯;賺錢要等轉弱再出,否則持有久一點較有優勢再了解簡單的尾盤狀況後,更進階讀者則可思考如何精進賠錢逆勢出的方法,賺錢順勢出的方法,也許可以找到更明顯改善績效的交易邏輯。

 

 

2013年12月3日 星期二

Average True Range(ATR) 平均真實範圍

 

之前紀錄過觀察行情波動的技術指標,有 歷史波動率 及 動能指標-ADX與Momentum ,此外常見的另一個指標是Average True Range(ATR) 平均真實範圍。目的都是由波動程度來輔助策略,應用在合適的盤勢及避開不合適的盤勢。而不同的計算方法則是各有其依據,每個人能領略並應用的程度也不同,但多認識一下總是好的。

 

定義的連結如 Average True Range - ATR,先計算其中的TR,取以下三者的最大值

  1. 今高-今低

  2. (今高-昨收)的絕對值

  3. (今低-昨收)的絕對值


然後再計算N個TR的簡易平均值

 

ATR定義

 

在說明中有簡單提到,高的行情波動會有高的ATR值,低的行情波動會有低的ATR值。

 

ATR值的計算很簡單,在MULTICHARTS裡也有內建了這個函數可以直接使用,例如下圖,使用AvgTrueRange,一個參數是要多少期間的平均數。

 

mc_atr

 

直接套用指標觀察圖形

 

mc_atr_pic

 

ATR如同其他波動性指標,在很多方面都可以應用,例如

 

  1. 單一指標的高低比較,由設定的門檻判斷波動的高低值。

  2. 長短期的ATR互相比較,判斷近期相對的波動率程度走向。

  3. 將ATR應用在帶狀指標的範圍決定上。

  4. 應用在出場的條件,例如遇上K棒遠大於ATR的區間時,是否適合停損停利。

  5. 也可以應用在停損的設定上,ATR小讓停損小,ATR大讓停損大。

  6. 某些基於K棒強弱度的策略邏輯可以應用ATR過濾不具代表性的K棒。


 

以上提到的各項都各自有測試應用的價值,L自己也有應用到的部份,不過以目前的應用程度來說,還不及ADX的順手,在有不同想法時仍會想到測試使用看看,或許有更多的好用之處,就請朋友們動手使用看看囉~

 

 

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