好久沒有寫文章了。這幾年經歷了不少事情:離開VMware的不捨,拿到融資的開心,重回VMware的親切,以及再也不爭強好勝,只作本身喜歡事情的平和。
html
能夠說,我是幸運的:我這一生都在選擇,而不是被迫接受。高中經過數學和化學雙科競賽拿到了保送資格,並在大三選擇了喜歡的計算機系。在畢業以後的第二年我開通了第一個證券帳戶,進而發現本身實際上是很是喜歡交易的。在創業工做告一段落以後,我便開始構思本身的指標和量化引擎,以指望可以找到一系列更準確表現市場的先行指標,同時驗證本身的操做邏輯,完善本身的交易系統。ide
因而Dresdon便在個人閒暇時間內誕生了。如今它天天幫我評估市場情緒,併爲我篩選出第二天須要觀察的股票。也讓我從選股,覆盤等一系列耗時的工做中解脫了出來。函數
而本文則將對Dresdon裏面包含的一些情緒指數以及量化系統進行簡單的介紹。this
在介紹Dresdon以前,咱們先講解一些籌碼學的基礎知識。spa
籌碼學中最爲本質的組成就是參與交易的人對於該股的買賣,也便是籌碼的買入和賣出。而決定買賣行爲的則經常是交易者的既定策略和交易時的心理。股票大漲,一般是買的人多,賣的人少,或者稱爲多方力量大於空方力量。而大跌則正好相反。插件
與此同時,股票價格的波動也會致使人們對於股票價格的見解發生改變。例如看漲的人會隨着股價的上漲而開始逐漸轉爲看跌,又或者是本來看多的人會隨着股票的大跌而轉爲空方。反之空方也可能會因爲股票的價格波動而轉換爲多方。這也是致使買賣力量發生變化的最根本緣由。3d
若是參與一隻股票交易的人對於股票的後期走勢具備較爲一致的預期,那麼該股票的價格就極可能會出現很是猛烈的漲跌。這種一致預期經常具備特定形態的表現,例如最明顯的揉搓線,仙人指路,大陽以後的縮量陰等等均可以經過籌碼學的角度獲得較爲完美的解釋。code
估計有人會說,那我是否是就盯着具備這些特徵線型的股票買入便可了呢?其實不是的。這些線型經常是買賣力量在當時市場的瞬時特徵。並且因爲這些特徵出現後股價已經發生了較大幅度的變化,所以根據這些單一特徵作出的決策平均收益率並不高,甚至可能會連手續費都沒法覆蓋。orm
爲了提升成功率和平均收益率,咱們經常須要在模型中加入一些輔助判斷依據。這也致使了一個模型經常分爲幾部分邏輯:提示買入的特徵線型,存在於近端及遠端的一些輔助判斷依據。因爲距離當前交易日越遠股價離散程度越高,所以這三部分組成中,買入的特徵線型要明顯,近端的輔助判斷邏輯要嚴格,而遠端的輔助判斷邏輯要具備較高的容錯性。htm
讓咱們以海普瑞(sz002399)在2018年5月初的拉昇爲例:
從上圖中能夠看到,在18年5月的上漲以前,該股呈現出一段很是完美的形態:首先緩慢上漲收取了足夠的籌碼。接下來通過兩個月的盤整將籌碼穩定住,並在五月經過兩根倍量陽線開啓主升浪。
那是否是隻要走出相似的形態就能夠放心的買入了呢?不是的。例如萬里石(sz002785)在類似形態下的拉昇就遭遇了失敗:
也就是說,一個形態的拉昇成功與否不只僅取決於自身的形態,更和市場的總體情緒及市場偏好密切相關。所以在參與交易時的市場情緒是一個很是重要的考量因素。
在買入一隻股票以前,咱們經常須要經過一系列指標來決定是否參與交易,以及股票的交易策略。市場上存在着一系列常見的指標,如創業板指,上證綜指,MACD等。這些指標多多少少都存在着一系列問題:如上證綜指因爲指數編制的緣由失真,或者MACD提供的信息並不特別直觀,須要經過分析背離纔能有效的進行防守等。所以市場上須要一系列準確直觀的指標來輔助用戶決策。
在本節中,咱們就將對Dresdon當前版本所提供的一部分指標進行介紹。
平均價指標主要用來評估當前市場究竟是指數行情仍是題材股行情。
相信不少股民都知道一系列和指數背離相關的俗語,如「只賺指數不賺錢」,「滬強深弱」等。這實際上都是在描述一個事實:因爲上證指數,深證成指,創業板指等指數所選取的成分股以及各成分股所對應的權重不盡相同,所以這些指數並不能徹底地描述整個市場的行情。例如上證指數中佔比最大的一類就是各家銀行,保險以及券商這些金融類股票。在2016年1月到2018年1月這段時間內,這些金融類股票不斷上漲,甚至不少都超過了2015年股災時期的最高價。但期間個股跌幅經常是20%甚至更多。所以對於大多數持有成長股的股民而言,這即是一段長時間的「只賺指數不賺錢」的行情。因此說,一名股民是否能在某段時間內賺到錢和指數關係不大,而是和本身的投資風格關聯更爲密切:若股民投資的是穩健的金融類股票,或者是具備高成長性的白馬股,那麼他將在2016年1月到2018年1月這段時間內取得不錯的收益;若股民對中國的科技發展看好而投資的是科技類股票,那麼他極可能在這段時間內的收益欠佳。
相較於上證指數,深證成指以及創業板指中所包含的成長股的比重更大,所以市場也經常經過比較這些不一樣指數的漲跌幅來判斷市場行情。但這仍然不夠:深證成指中金融地產等行業所佔的權重仍然較大,而創業板指中溫氏股份的比重也遠超於其它成分股。若是地產行業受到政策利好的驅動而大幅上漲,或者溫氏股份的股價因爲豬肉價格波動而產生大幅波動,那麼此時深證成指及創業板指也會失真。所以深證成指和創業板指也只能在必定程度上反映當前市場的投資偏好,而不具備普適性。
而常見的下一個粒度的指數就是板塊指數了。其能較好地表現板塊內部各支股票的運行趨勢。但其也有自身的侷限性:其忽略了其它板塊行情與當前板塊的聯動。例如在弱勢行情下,板塊行情的持續性可能只有幾天;而在強勢行情下,板塊行情可能持續一個月甚至更久。
爲了可以更好地衡量市場的總體投資情緒,咱們在咱們自用的量化系統中抽取了一個新的指標:平均價指標。該指標經過計算去噪後的股價漲跌幅的平均值來衡量市場的總體投資情緒。用戶能夠經過比較三大指數和該指標的差別來較爲準確地判斷當前市場的投資偏好。
該指數的查看頁面以下所示:
最上面的是用來展現指數和指標之間相對關係的指標區。在該區域中,指數的收盤價以藍色線表示,指標由紅色線表示,而鼠標當前位置所指向的交易日則被稱爲遊標。在默認狀況下,二者將以遊標做爲展現的基準,即令當日的指數與指標重合。此時遊標右側的圖形就能表現相應交易往後的究竟是指數行情仍是個股行情。例如在上面所展現的指數中,表示指標的紅線遠低於表示指數的藍線。這也就表示當時市場總體的賺錢效應很是差。除此以外,用戶還能夠經過鼠標的左鍵點擊暫時將遊標固定,或經過再次點擊取消遊標固定。
該頁面的中間區域用來展現各個交易日的指標變更和指數變更的差值,也便是個股相對於指數的單日相對強度。例如上圖中游標所在交易日的指數上漲了0.05%,而平均價指標的漲幅爲-0.65%,所以當日的差值即爲-0.7%,進而在該區域中顯示爲一條綠線。反之若平均價指標表現強於指數,那麼在該區域中顯示爲一條紅線。不管紅線仍是綠線,其長度越長,表示平均價指標和指數之間的差值就越大。
而最下方的則是指標和指數之間差值的累計值。其可以更好地表現出一段趨勢性行情中二者的差值,也將行情究竟是指數行情仍是題材行情這一特徵表現得更爲明顯。
相信不少投資者天天都在問本身這樣一系列問題:何時牛市會來?如今是進場的時機麼?我如今的倉位合適麼?而這一切問題的答案都基於他對市場多空力量的判斷:若他以爲後市將會走強,那麼他就會增長本身的持倉,反之則下降倉位。因爲每一個人對後市都有不一樣的判斷,所以市場造成了動態的多空平衡:在每一個空頭賣出本身持倉的同時,一個多頭就增長了本身的倉位。
而大多數投資者都想作到的一件事就是:買在低點,賣在高點。而從市場總體氛圍的角度來說,那就是買在多頭力量逐漸增加的時間點,而賣在多頭力量開始衰竭的那一刻。所以如何較爲準確地衡量市場的多空力量變化也可以幫助投資者較好地衡量市場的多空力量對比,進而對本身的倉位,持股類型進行調整,作到攻守自如。
爲了可以更好地衡量市場的總體投資情緒,咱們抽取出了多空力量指標。該指標內部經過統計一系列股價波動特徵來衡量整個市場中全部股票的多空力量。其主要分爲三個子指標:
高低值數據。該指標經過統計具備顯著作多/作空情緒的股票數量來展現市場中的多空力量之比。
標準數據。該指標經過統計全部股票的多空力度來展現市場中的多空力量之比。
銳化數據。該指標一樣經過統計全部股票的多空力度來展現市場中的多空力量之比。不一樣的是,其增大了具備較強多空力量的股票的權重,使得指標更爲靈敏。
除此以外,用戶還能夠經過勾選差值數據這一選項來得到更明顯的表觀特徵。該選項將會計算多空力量之差並將其展現在界面中。須要注意的是,該選項會將指標的兩個份量歸結爲一個份量,從而可能致使部分信息再也不在頁面中可見。
下面就是該指標的操做頁面:
該頁面的上半部分是用來展現指數的指數區。用戶能夠經過點擊右上角的齒輪按鈕打開設置頁面。在該設置頁面中,用戶能夠指定須要展現的指數,須要在頁面下部的指標區展現哪個子指標等信息。
而該頁面的下半部分則是指標區。其經過紅柱和綠柱來展現當前市場的多空力量。若用戶選擇查看差值數據,那麼紅柱表示多方力量大於空方力量,而綠柱則表示空方力量大於多方力量。多空力量之差則由紅柱和綠柱的高度表示。
該指標的使用方法其實很是簡單,那就是看整個市場的多空力量數據就能估計出市場的賺錢效應。例如在2018年整年銳化後的多空力量指標均不樂觀:
再好比在2015年6月及2019年4月高低值數據顯示作多情緒持續乏力:
相信投資者經常聽到「倉位控制」這樣一個詞,並在實際的操做中嘗試找到一種最優的倉位控制準則。但在實際操做中,投資者經常因爲不能全面地評估整個市場的多空力量而沒法有效地執行本身的準則,進而沒法良好地執行本身的交易系統。爲此咱們提供了持股指數這一指標來輔助用戶決定本身應該持有的倉位。
持股指數是一個很是靈敏的指標,其經過分析市場中典型個股的多空情緒來預判用戶在短線操做中所應持有的倉位。該指數主要分爲兩個子指標:三日指標和五日指標。二者的區別僅僅是分析時間跨度的不一樣。但相較而言,三日指標較五日指標更爲靈敏,五日指標則相較於三日指標更爲穩健。
下面就是該指標的操做頁面:
該頁面的上半部分是用來展現指數的指數區。用戶能夠經過點擊右上角的齒輪按鈕打開設置頁面。在該設置頁面中,用戶能夠指定須要展現的指數,以及在頁面下部指標區中所展現數據的類型等。該頁面的下半部分則是指數的展現區。該指數提供了三部分信息:紅色的作多情緒線,綠色的作空情緒線,以及經過計算二者之差所獲得的整體情緒。
用戶能夠參考整體情緒線來設置本身的倉位:若是整體情緒線顯示爲指數區上方的紅色線,那麼此時用戶的倉位應高於半倉,而且情緒線越長倉位應當越高;若是整體情緒線顯示爲指數區下方的綠色線,那麼此時用戶的倉位應低於半倉,而且情緒線越長倉位應當越低。
除了上面所提到的三個指標以外,咱們還提供了其它一系列指標。如指示短線多空力量的領先股情緒指標等。只是限於文章篇幅,咱們將再也不對它們進行介紹。
如今咱們已經有了一系列情緒指標的幫助。下一步就要開始添加模型了。
讓咱們仍然以海普瑞(sz002399)在2018年5月初所展現的拉昇形態爲例:
該股首先緩慢上漲收取了足夠的籌碼。接下來通過兩個月的盤整將籌碼穩定住,並在五月經過兩根倍量陽線開啓主升浪。咱們能夠經過下面的腳原本描述該模型的買入條件:
// 當日和前日股價上漲 $isRaisingUp = growth(close()) > 0 && growth(close(), 1) > 0 // 5日前存在着一個長度至少爲30,震盪幅度小於5%的平臺 $isPlatform = platform_exists(0.05, 30, 5) // 在平臺前存在長度至少爲20日,最大上漲幅度爲12%的緩慢增加 $isSlowRaiseBeforePlatform = is_slow_raise(0.12, 20, platform_start(0.05, 30, 5))
同時咱們將賣出條件設定爲股價低於五日線:
$sellCondition = close(0) < ma5(0)
這樣咱們就定義了一個最簡單的模型。接下來,咱們就能夠掃描全部股票,以獲得全部匹配以及這些匹配的平均收益率,最高收益率等一系列信息:
{ "averageBenefit" : 0.007549979051232566, "maxBenefit" : 74.86122362293308, "minBenefit" : -4.13, "totalCount" : 2281, "averageDayCount" : 8.197412099662129, "successRatio" : 0.4194188255527758 }
能夠看到,咱們剛剛建立的模型只有0.7%的平均收益率,但在十餘年中匹配了2281次。這表示咱們的模型的匹配條件過於寬鬆。咱們應該添加更爲嚴格的匹配條件,以提升模型的準確度,提升平均收益率。例如咱們能夠要求當日和前一日的股價上漲均超過1%並再次掃描:
$isRaisingUp = growth(close()) > 0.01 && growth(close(), 1) > 0.01
能夠看到,該模型的各方面表現都有了顯著提升:
{ "averageBenefit" : 0.00878939386175436, "maxBenefit" : 74.86122362293308, "minBenefit" : -4.13, "totalCount" : 1913, "averageDayCount" : 8.12565445026178, "successRatio" : 0.4273821989528796 }
在通過多輪迭代細化模型的買入賣出條件以後,該模型將能達到使人滿意的收益率:
{ "averageBenefit" : 0.049035519980520418, "maxBenefit" : 74.86122362293308, "minBenefit" : -4.000000000000014, "totalCount" : 313, "averageDayCount" : 11.875656742556918, "successRatio" : 0.46059544658493873 }
在當前引擎版本中,咱們的腳本支持了幾乎所有的常見K線數據,並提供了一系列更高層次的K線分析函數:
類別 |
描述 | 示例 |
K線 | 基本K線信息 | open(0), close(1, 4), upper_shadow(0), ma5(0) |
指數 | 常見基本指數及引擎的自定義指數 |
macd(0), buy_stength(0) |
運算符 | 常見運算符 | close(0) - open(0), close(0) > ma5(0) |
函數 | 常見函數及高級擬合函數等 |
max(close(0), open(0)), platform_exists(0.05, 30, 5) |
除了使用腳本以外,用戶還能夠經過自行編寫Java插件的方式來描述模型:
// 當日和前日股價上漲 BooleanHolder isRaisingUp = and(greaterThan(growth(close()), 0), greaterThan(growth(close(), 1), 0)); // 5日前存在着一個長度至少爲30,震盪幅度小於5%的平臺 BooleanHolder platformExists = platformExists(0.05, 30, 5) // 在平臺前存在長度至少爲20日,最大上漲幅度爲12%的緩慢增加 IntHolder platformStart = platformStart(0.05, 30, 5); BooleanHolder isSlowRaiseBeforePlatform = isSlowRaise(0.12, 20, platformStart); BooleanHolder condition = and(isRaisingUp, platformExists, isSlowRaiseBeforePlatform);
在插件中,咱們不只僅能夠定義模型,更能夠添加自定義指數,運算符,函數:
public static Value.Shrink shrink(int index) { return new Value.Shrink(index); } @Operation(key = KEY_SHRINK, resultType = DOUBLE, arguments = { @Arguments(paramTypes = { INT }) }) public static class Shrink extends IndexedVariable<Double> implements DoubleHolder { public Shrink(int index) { this(new IntValue(index)); } public Shrink(IntHolder index) { super(KEY_SHRINK, index); } @Override protected Double recalculate(QuantContext context) { indexValue = index.getValue(context); if (indexValue == null) { return null; } DailyTrading dailyTrading = context.getTradings().get(indexValue); double blockSize = Math.abs(dailyTrading.getClose() - dailyTrading.getOpen()); double totalVariation = dailyTrading.getHigh() - dailyTrading.getLow(); this.value = blockSize > SMALL_DOUBLE_VALUE ? totalVariation / blockSize : Double.MAX_VALUE; return value; } }
而在當前版本中,咱們已經有了十餘個模型,並在持續添加中:
轉載請註明原文地址並標明轉載:http://www.javashuo.com/article/p-zosmbtdn-mz.html
商業轉載請事先與我聯繫:silverfox715@sina.com
公衆號必定幫忙別標成原創,由於協調起來太麻煩了。。。