如何學習透過XQ提供的語法,撰寫自訂指標、選股及交易策略,對於沒有學過程式設計的朋友,是比較困難的,我唸的是經濟系,沒有程式設計的底子,深深知道學習過程會踢到那些鐵板。所以根據學習的進程,試著把當初自己碰到的學習障礙,以及學習的心得,寫成文章,分門別類地整理在這裡,希望可以協助跟我一樣唸文組的朋友,循序漸進,學會使用「XQ量化交易平台」,來撰寫交易策略,執行自動交易。
若是已經有程式設計相關知識的朋友,則請很快的了解這個語法宣告變數、參數等等相關的語法,再參考下面列出來的各種範例及函數,應該就可以很快的上手。
在開始介紹這套量化語法之前,容我先介紹一篇文章:
如果是很會寫程式的朋友,有免費的python可以用,對比每月要付1000~2000元的XQ量化平台,就請各位直接用python進行量化交易即可,若是單純用價量交易期指及選擇權的朋友,Mutichart這產品牌子老底子好,XQ在回測,最佳化等地方,跟人家相比,還有很大的進步空間,同業們大家各有所長,用慣Mutichart的朋友還是留在Mutichart就可以,不見得要改來用XQ。
XQ量化平台適合數學沒有很好,程式沒有很會寫,但對市場有一些獨到的觀察,希望把決策流程系統化的朋友。
以下的內容適合沒有學過程式設計的朋友,如果已經會寫程式的朋友,請直接往下滑,到達「會寫程式者請參考」字樣的地方,再請開始往下看。
基礎篇
要學任何一種程式語言,首先要先學會使用程式編輯器,就像我們用Word來寫文章、打報告,程式編輯器是用來設計程式的軟體,XQ的程式編輯器是XScript編輯器,要如何使用,可以參考以下的連結影片,市場對於這類程式碼編輯器,都稱之為Integrated Development Environment,簡稱IDE,所以下面我們就用IDE來稱呼編輯器。
IDE操作說明影片
打開XQ後,在「策略」選單的最下方,點選XScript編輯器即可進到IDE裡:
打開IDE之後,左邊有各種腳本的範例可以供各位參考,也可以用複製貼上直接COPY出來用,要寫自己的程式,可以按左上方第一個ICON「新增」,按下去之後會跳出下面的視窗:
這個視窗最上面有一排腳本類型,您可以依您的程式目的來決定腳本的種類,接下來請為您的程式命個名,按「確定」後就可以開始撰寫第一個程式,編輯器的底色分成淺色與深色兩種,上面那張圖是淺色,下面這張則是深色。
要改變底色,可以到IDE上面的選單列中,選檢視項目,然後進到佈景主題裡去選。
在初步學會使用語法編輯器之後,接下來就可以使用IDE,學習用XQ語法來撰寫交易程式,在往下學習之前,建議各位先至XQ學習地圖瀏覽XQ語法入門裡的各篇影音內容,這些影音內容是在跟大家介紹,學會XQ語法後,可以做哪些事情,如果這些事情是您想要做的,那麼您才有足夠的學習動機往下學。
跟工廠生產自動化的發展一樣,XQ的目標是讓使用者儘量透過語法,把選股、盯盤,乃至於下單等這些交易的每個環節都自動化,當然使用者也不見得要全自動化,也可以只把特定的環節自動化,自動化的好處是節省您的時間,讓你把有規則可循,千篇一律的事情交給電腦來做,把時間留下來做電腦無法取代的事。 所以學語法不見得是要全部都程式交易,也可以是把某一部份的事情交給電腦來做。
當您確定學習XQ語法是一件值得花心思投入的事情之後,接下來就可以一步一步的學習XQ語法。
語法的基本元素
在XQ量化平台裡,如果你要寫收最高就市價買進一張,可以像下面這麼寫:
if close=high then setposition(1,market);
在這一行程式中,close代表最近一根K線的收盤價,high代表最近一根K棒的最高價,setposition是平台提供的部位控制語法,括號後有兩個數字用逗號分開,第一個數字是希部位交易後的張數或口數,後者則是交易時設定的價位,在這裡,系統讓使用者用close,high,market來代表特定某個數值,系統會回傳指定商品裡的某個數值來作運算,這就是所謂回傳值的的概念,在學習XQ量化平台一開始,先了解回傳值的概念,可以看以下連結的說明。
了解回傳值的概念,以及XQ系統內建的相關回傳值之後,接下來要學習的是在XQ語法上,如何描述前後根K棒的關係,以及建立敘述與腳本的觀念,請看以下的文章:
了解了XQ語法的基本架構之後,就可以理解,這是一種建立在時間序列基礎上的語法,
有了對XQ語法的基本認識之後,我們來舉個實例
if close*1.4<close[90]
//過去90天股價跌了超過四成
and close*1.2<close[20]
//過去20天股價跌了超過兩成
then begin
if close[1]*1.05<close[2]
//前一天跌了超過5%
and close>1.05*close[1]
//最近一個交易日漲了超過5%
then ret=1;
end;
上面這個腳本是用來描述大跌後股價出現長黑後的長紅,這在市場老手眼裡,是一個很靠譜的反轉訊號,我們寫完程式之後,可以透過IDE上方的工具列裡的回測功能,來回測這樣的訊號,到底是不是真的如市場老手所說的,勝率很高。
下面這張圖是這個策略過去五年的回測報告,這裡我停損停利都設為7%:
回測的結果勝率高達88%,代表市場老手口耳相傳的這個江湖秘訣,是有其參考價值的,只是這個策略如果踫到大盤大回檔時,最大區間虧損率達到48%,代表這是一個多頭市場才能使用的交易策略,在大空頭市場千萬別用。
我們學會用程式語言的好處,就是可以把我們觀察到的一些市場現象,用腳本描繪出來,然後再透過回測,看看這樣的現象,能不能變成幫我們自動交易的賺錢工具。
有時候市場現象不需要很複雜的語法才能描繪出來,像上面這個腳本,以我們目前介紹的語法,基本就可以寫出來。
接下來我們回頭來學習每一種語言裡一定會有的幾個元素,這些元素是組合成一個程式常會用到的元素,這些元素在其他的程式語言裡也會有,功能也都大同小異,在這邊學會了,未來要接觸其他程式語言也用得上。
以上是一般語法也都會有的元素,學會使用這些基本元素之後,就可以寫出一些基本的交易語法或自訂的指標。
有了一般的語法知識,也知道如何使用開高低收成交量等回傳值之後,接下來就需要輸出的語法,讓我們可以照自己的意思畫指標、選股票, 或是請電腦在價量符合某個條件時請電腦通知我們,以下就是輸出語法的幾項類別及相關的說明。
「會寫程式者」請參考↓↓↓
輸出語法
輸出語法的目的,是把演算的成果,輸出成有用的指令,像是畫成指標、觸發訊號,或是列出符合演算條件的選股結果,以及最直接的,就是自動執行交易,以下是我寫過的一些說明文章。
從以上的語法,我們已經可以用簡單的腳本,來畫指標、啟動觸發訊號,或是把計算後的數據輸出成文字檔。至於要如何完成全自動的程式交易,還需要有交易語法來支援進場、出場、加碼、減碼等等的交易指令。
XQ量化平台支援的量化指令,我寫了一篇介紹文如下,在這篇文章中,我介紹了XQ的各種交易語法的寫法與定義,然後舉了一些大家常用的交易語法腳本作例子,希望大家可以透過這一專章,知道如何撰寫XQ的自動化交易程式。
學到這裡,已經可以用簡單的語法來自訂指標,或是選股,或是讓寫一個盤中會把符合條件的標的即時通知您的策略雷達,或是直接讓電腦自動化交易。
很多朋友會問我學語法對投資的好處是什麼? 我的回答都是,跟工廠逐漸使用機器人來自動生產一樣,學語法的目的就是儘量把可以形成規則的決策過程自動化,減少人力的需求,讓一個單一的投資者 ,人可以做到以往要一大團隊才能做到的研究,決策及執行交易。
使用數據的相關語法
透過以上的幾篇文章,大致可以學會基本的XS語法,接下來要說明的是,XQ如何使用變數,參數來強化撰寫量化語法的能力。
首先要說明的是參數的概念:
參數
參數的意義與例子
變數
變數的說明
interbarpersist
這個語法是用來宣告在同一根bar裡,變數值的計算,不是直接計算最新值,而是把前一值當做前一根bar的值來運算最新值,這種宣告變數的方式,常被用來在逐筆洗價的腳本中,用來計算累計值之類的數值,以下就是這個語法的說明。
intrabarpersist
學了參數及變數之後,接下來要介紹的是用GetField這個語法,來取得除了開高低收成交量之外的其他欄位。
Getfield
XQ這個語法跟其他程式交易平台最大的差別,就在於它有大量的台股專屬的欄位可以取用,這些欄位的取得,用的就是Getfield的語法。
在撰寫腳本時,當您需要使用這些台股特有的欄位時,您只要在編輯器中打一個英文字母g,不管大小寫,編輯器都會跳出一個如下面附圖中的視窗, 只要您選取getfield(插入),系統就會跳出一個選取欄位的視窗,讓您直接挑選要使用的欄位。
至於使用Getfield語法的範例,以及到底有哪些類型的數據可以透過Getfield來運用,下面的這些文章裡有進一步的說明:
舉個例子,我們可以透過Getfield語法,取得外資買賣超跟外資持股比例這兩個跟外資有關的欄位,這樣我們就可以用程式找出外資持股比例不低且連續大買三天的個股。
以下是對應的寫法:
value1=GetField("外資買賣超");
value2=GetField("外資持股比例");
if value2>20
and trueall(value1>1000,3)
then ret=1;
這樣的策略如果去回測過往五年,勝率都可以接近六成,但如果再加上暴量起漲之類的腳本,找出在起漲點且外資大買的股票,勝率就更高了。
再舉另一個例子,
XQ裡有一個欄位叫作「關鍵券商」,是把過往券商實施庫藏股期間買超最大的前幾家券商視為公司派進出的券商,我們就可以透過Getfield這個語法,取得這個數據。
例如可以像下面的寫法:
value1=GetField("關鍵券商買賣超張數","D")[1];
if trueall(value1>200,3)
then ret=1;
這樣就可以找出關鍵券商連續三天買超都達到200張以上的公司,過去五年,使用這個簡單的腳本,回測的績效如下:
這也是一個除了大盤大空頭走勢之外,績效都很不錯的簡單策略。
在使用getfield時,資料的更新時間,是大家最常問的問題,以下是更新時間的總整理:
學會了GetField之後,另一個XQ特有的語法是GetQuote,可以取得分時走勢圖裡提供的各種即時欄位。
Getquote
Getquote這個語法是為了要讓使用者可以把看盤時看到的數據拿來做運算,所以才設計出來的欄位, 可以參考下面的這篇文章,就知道getqutoe支援了那些欄位:
getquote跟getfield最大的差別在於,getquote取得的是最新的特定欄位的值,所以不能用中括號來呼收前N期的值,因為getquote取得的就是當下的數據,舉個例子:
condition1=false;
condition2=false;
value1= q_SumBidSize;//總委買張數
value2=q_SumAskSize;//總委賣張數
if value1-value2>1000
and value2<500
then condition1=true;
value3=q_InSize;//內盤量
value4=q_OutSize;//外盤量
if value4>1000
and value4/value3>1.5
then condition2=true;
if condition1 or condition2 then
ret=1;
上面這個腳本我是用getquote語法去取得最新的總委買張數跟總委賣張數,以及內盤及外盤量,當系統開始運算時,永遠都是拿最新一筆的資料來計算。
以下是一個用Getquote語法來撰寫盤中出現大單的寫法:
學會變數及參數的使用之後,有些常用的語法,如果每次都要很重覆寫,會很煩,所以XQ提供使用者把一定程序的語法自訂成一個函數,未來要用這樣的運算,只要直接引用該函數即可,所以接下來要學的是函數的概念:
函數
如果有一段程式,我們常會用到,那麼就可以把它寫成函數,之後每次要用到這段程式,只要用函數來寫就可以了。例如我們最常用的移動平均值,是把特定期間的某個值加總後去除以期數,所以XQ就把它寫成一個系統內建的函數如下:
SetBarMode(1);
input:thePrice(numericseries); //"價格序列"
input:Length(numericsimple); //"計算期間"
if Length > 0 then
Average = Summation(thePrice, Length) / Length
else
Average =0;
這麼一來,如果要寫五日移動平均,就不用把前五天的收盤價加總除以五,只要寫:
averge(close,5)
就可以了。
以下是一些函數的相關文章,裡頭有寫函數時要注意的細節,請大家參考:
學會了函數的概念之後,接下來要跟大家介紹XS的內建函數:
內建函數
從上面這個連結,我們會找到大量的內建函數,至於他們的意義,內建函數再多,也不見得符合使用者的需求,這時候就可以透過自訂函數的方式,來創造獨有的函數,用在各種語法的撰寫上。
以下的連結裡有自訂函數的基本流程介紹:
自定函數裡最難以理解的問題是,要如何宣告正確的資料格式:
下面是常用函數的應用例子:
除了英文函數之外,XQ也支援了「中文函數」,以讓使用者可以用它來選股排行,以下是中文函數的介紹:
中文函數
學會如何使用中文函數之後,接下來就可以應用中文函數,在選股的時候,設定各種排行條件,以下的這篇文章,就是來介紹這個功能:
學會了變數,參數及函數的概念之後,基本的程式大約都難不倒您了,但目前我們在設定思考的流程時,一直都是用IF .. Then這樣平鋪直述的語法,但其實很多時候,情況並不單純,需要運用各種不同的流程控制方法,所以各種不同的程式語言,都支援了流程控制的相關語法,以讓使用者可以進行更複雜的語法撰寫,接下來我們就來學習XQ裡的一些常用流程控制語法。
流程控制
if… then
begin … end
switch … case
迴圈
當要重覆執行某些指令時,我們可以使用迴圈相關的語法,如果一開始就知道要執行多少次,用的是For這個語法,如果不知道要執行多少次,就用while這個語法,詳細的說明如下面的連結:
以上是基礎的XS語法介紹,在進入到更進階的語法介紹前,先來學習當寫錯時,要如何運用勘誤的功能來修正錯誤。
勘誤
在寫出符合自己想法的腳本後,可以使用「回測」的功能來看看自己的腳本是不是一個具有實戰效果的腳本 ,如何使用回測的功能,請看下面的連結。
回測
以上算是完整的把XS的語法都學了一遍,建議在往下學習之前,請瀏覽一下XQ語法應用裡的各篇文章,這些文章都是為了回答學習者 疑問而撰寫的文章,應該可以協助您建構更清晰的觀念,補強上面各篇文章沒有講清楚的地方。
進階篇
在學會XQ語法的基礎應用之後,接下來,跟大家介紹一些常用的進階語法,學會這些語法之後,有些原本寫不出來的,或是寫出來跟原來的意思不一致的,應該可以得到蠻大幅度的改善。首先跟大家介紹的,是在時序及時間上常被拿來使用的函數及語法。
時間與頻率的語法
首先還是先複習一下時間的格式
接下來,請看時間與頻率的設定 ,透過這一篇文章可以學會BarFreq,Barinterval及CurrentTime的用法,用來指定程式運算的頻率及指定的時間。
時序常用內建函數
接下來跟大家介紹一些時序設定上常用的的函數。
這個語法是用來計算某一特定日期距離現在是多少根bar:
Getbaroffset
barslast
這個函數是用來計算上一次符合特定條件距離現在多少跟bar。
它的說明如下:連結
CurrentBar
當使用者需要知道目前是算到第幾根bar時,可以使用CurrentBar這個函數,說明如下:連結
關於資料讀取範圍的設定及相關知識
資料讀取範圍的設定,是XQ這種以K棒時序為計算基礎的語法裡,很容易因為沒有定義清楚,而容易出錯的部份,以下的這個連結,有清楚的說明了這部份的觀念
在學習完時序概念之後,接下來建議大家多了解XQ內建的一些函數,這些常被使用的函數,可以加快腳本撰寫的速度。
常用的函數
邏輯函數
數學函數
腳本範例
統計函數
腳本範例
技術分析函數
了解了技術指標常用的函數之後,大家可以先從這些技術指標的設計原理著手,了解當年這些設計技術指標的人,是怎麼創造出這些指標的。
了解了技術指標設計的思維之後,我整理了用XQ設計指標的一樣腳本範例,大家可以對照這些指標的公式,自己撰寫腳本,再跟文章中的腳本來對照一下,這樣,學習的效果會非常好,我當初就是這麼學會一些撰寫腳本的技巧的。
型態相關函數
型態學是大家常用的分析方式,系統也內建了一些型態函數,具體說明請見這篇:
腳本範例
學習了常用的函數之後,接下來跟大家介紹如何在一個腳本裡,使用不同的商品來一起加人運算。
跨商品
除了跨商品之外,有可能會用到跨頻率,例如日KD在高檔,週KD在低檔黃金交叉的情況,請參考以下的說明:
跨頻率
陣列
陣列是一個各種程式語言都會支援的語法,請參考下面的說明文章:
實戰篇
在慢慢熟悉了XQ語法之後,接下來要透過各種寫過的腳本,來跟大家討論,我是如何運用程式,打造一個有體系的決策機制。
我的決策流程基本如下:
一、透過大盤分析,研判目前大盤是處於多頭還是空頭市場,進而決定我的持股比例。
二、透過各種選股策略,決定我的觀察清單。
三、透過各種自訂指標的撰寫,在圖像化的指標中,找出一些不斷動覆出現的規律,把它轉換成盤中即時交易策略。
四、把選股策略與盤中即時交易策略整合成一個完整的交易策略。
下面這篇文章是這個架構的詳細說明:
接下來就把結構中的各個部份分述如下:
大盤分析
我習慣順勢而為,基本不會逆勢操作,所以我會花很大的時間來研判目前市場是處於多頭還是空頭市場,以下分別跟大家介紹XS裡提供那 研判大盤的欄位,以及我如何運用這些數據,打造一個研判大盤多空方向的機制。
以下分別先介紹一些大盤分析特別可以使用的欄位:
大盤分析可以使用的欄位
接下來介紹一些大盤相關的技術指標:
大盤相關指標
上漲下跌家數差RSI指標
MFO資金流震盪指標
上漲家數有沒有200檔
OTC與上市成交量比值
上漲下跌家數
DBCD
綜合多個大盤指標,就可組合成大盤多空對策分數:
有了這些指標,就可以組合成大盤多空檢查表這樣的頁面,透過這樣的頁面來研判大盤未來的多空趨勢:
或是打造成大盤儀表板:
甚至於,把大盤多空變成一個函數:
透過以上的工具,我們可以決定投資組合的持股比例,就算您是作當沖的,大盤分析還是很重要,多頭市場先買後賣,空頭市場先賣後買,大盤分析還是非常的重要。
在決定好持股比例之後,接下來要解決買什麼的問題,也就是要如何定選股策略。這時候就要進到XQ的「選股中心」。
選股中心
首先,先來看一下選股中心的使用介紹:
學習如何打造具個人特色的選股策略:
特別是如何把財報欄位應用在選股中:
以及如何把選股時應用的欄位呈現在選股結果中:
以及如打造自己的選股排行榜:
學會了選股中心的使用概念後,接下來介紹一些選股的常用語,這些常用語我都先寫成腳本,大家可以下載來直接使用:
接下來介紹一些選股策略的範例
選股策略範例
學會了如何選股之後,接下來就是要選擇進場時機,進場時機基本上就跟當天的價量或前一天公佈的籌碼數據息息相關,要如何運用這些資料來決定進場時機,或者說寫出進場時點的規則,最好的方法就是透過視覺化的指標,從指標與K線圖的相互關係中,找到進場的規則,所以接下來要學習的是自訂指標。
自訂指標
自訂指標是一個學習語法的好方法,一方面演算的數據可以視覺化呈現,二方面可以透過前賢們發明過的指標,學習如何用語法演算有意義的數據,為了讓大家可以加快學習的速度,把盡量收集了坊間常見的各種技術指標,用XS語法來撰寫,然後以A~Z的順序,排列在下方,大家可以拿這些指標的寫法作為學習的範本。
自訂指標轉換成交易策略
從股性出發的自訂指標
盤中短線指標
籌碼指標
有了各種指標之後,就可以打造個股的儀表板:
透過自訂指標訂出進場時機的規則,接下來就是使用策略雷達來產出作多及作空訊號
策略雷達
下面是一些撰寫策略雷達時,我覺得應該學習的寫法及用法:
以上是策略雷達常用的語法,到這裡,已經學會完整的自動化投資決策流程。
接下來就是把這些流程串在一起,變成一個自動化的投資策略,請看以下的幾篇相關的介紹文:
從上面的文章中,我們可以了解到,一個完整的交易策略,往往會包括了選股策略及交易時機。
以下,我就分門別列的跟大家分享不同的交易策略,這些策略的語法都不難理解,主要是希望可以啟發大家的靈感,打造出自己專屬的交易策略。
極短線交易策略
大盤大跌後的對應交易策略
籌碼型交易策略
波段交易策略
從基本面出發的交易策略
價值型投資交易策略
在看過這麼多的交易策略之後,接下來先學會把這些交易策略變成自己的策略:
在累積了很多私房策略之後,接下來就可以同時啟動多個交易策略,然後再從跑出來的訊號中,選擇要真的去執行交易的標的:
就算是人不在電腦前面,也可收到訊號:
以上是讓電腦自動產生多空訊號的流程。
接下來則是介紹「自動執行交易」,由於交易語法目前還在測試中,所臉這裡先跟大家介紹在策略雷達中如何把策略結合交易指令,未來等交易語法要正式開放時再跟大家作做介紹。
程式自動下單
以上是目前我收集到的XQ量化平台學習內容,這份內容會置頂且會不斷的更新,目標是讓大家透過這上面介紹的文章,就可以完整了學習XQ量化平台的語法,並且寫出您專屬的量化交易策略,如果大家需要加強那方面的說明,請不要客氣,讓我知道,我會把它附上去的。