標籤:

經典K線鎚子止跌量化策略測試

本文主要針對經典K線中的鎚子止跌形態,用C++編程,採用策略為出現鎚子止跌信號後第二天依開盤價買入,第三天收盤賣出,針對在過去2年內,分析A股3000股票並統計成功率和盈利情況。一則可以發現鎚子止跌是否有效,二則可以不斷優化策略找出更好的量化策略

1.針對鎚子止跌線

鎚子止跌定義:鎚子線是K線經典形態的一種,其K線實體處於頂端,並帶有較長的下影線。它一般出現在股價連續下跌的底部, 通常被認為是底部止跌反轉的信號。實體與下影線比例越懸殊,則信號越具有參考價值。從K線形成分析,股票連續下跌後,空方佔優,隨後多方發起反攻,至收盤多方相對佔優,形成下長影

以上為鎚子止跌的理論依據,為了識別是鎚子線還是吊頂線,我們可以使用均線來排除事實上的弔頸線

2.量化測試軟體,這裡使用本人開發的蝸牛股票分析軟體蝸牛股票分析軟體輕量式的股票分析軟體,該軟體功能較多,涉及早盤競價選股,尾盤選股,基於波非那切6大類的綜合選股,另外還有龍虎榜選股等

在這裡我們主要使用新增加的量化功能來完成對策略的測試,目前該軟體提供開源的策略插件SDK,下載地址是ccsdu2004/stockAddon

3.鎚子量化策略的制定

滿足一下2個條件:

  • 鎚子線高點不超過10日均線,20日均線
  • 鎚子線要求下長影不低於3倍實體且上長影很小

鎚子線代碼為:

bool isChuiZiK(const Stock& stock){ float high = std::max(stock.current,stock.start); float low = std::min(stock.current,stock.start); if(!isEqual(stock.top,high)) return false; if(!isEqual(stock.top,stock.current)) return false; if(stock.top - stock.low <= 0.05f) return false; return (low - stock.low)*0.333f > high - low;}

判斷代碼為:

//低於10,21日均線 if(std::get<1>(ma21[i]) > stocks[i].current && std::get<1>(ma10[i]) >= stocks[i].current) { //鎚子線 bool ok = isChuiZiK(stocks[i]); if(ok) { CHECK_AND_ADD(i+1); } }

全體代碼為:

#include <utility>#include "../../SnailStock/SnailAddonHost.h"#include <iostream>SnailAddonHost* addonHost = nullptr;StockIndicator* indicator10 = nullptr;StockIndicator* indicator21 = nullptr;StockIndicator* indicator5 = nullptr;extern "C" SNAIL_API_EXPORT SnailAddon* get_snail_interface(SnailAddonHost* host,int flag);inline bool isHarden(const Stock& stock){return stock.increase > 9.6f;}inline bool isEqual(float a,float b){return fabsf(a-b) <= 0.03f;}QString maker_ = "蝸牛(snail007.com)";QString desc = "鎚子量化策略";#define CHECK_AND_ADD(j) int k = 0; std::tuple<QString,float> buy(QString("下一交易日"),0.0f); if(j < stocks.size()) { buy = std::make_tuple<QString,float>(stocks[j].date,stocks[j].start); } std::tuple<QString,float> sale(QString(""),0.0f); if(j+1<stocks.size()) { k = 1; sale = std::make_tuple<QString,float>(stocks[j+1].date,stocks[j+1].current); } addonHost->append(code,name,buy,sale,k,desc); bool isChuiZiK(const Stock& stock){ float high = std::max(stock.current,stock.start); float low = std::min(stock.current,stock.start); if(!isEqual(stock.top,high)) return false; if(!isEqual(stock.top,stock.current)) return false; if(stock.top - stock.low <= 0.04f) return false; return (low - stock.low)*0.333 >= high - low;}class SnailAddonImpl : public SnailAddon{ void destroy(){delete this;} const QString maker()const{return maker_;} const QString version()const{return "1.0.0.4";} const QString description()const{return desc;} const QString tips()const{return "蝸牛標準策略";} void onRecevied(const QString& code,const QVector<Stock>& list) { const int span = 21; if(list.size() <= span) return; indicator5->clear(); indicator10->clear(); indicator21->clear(); auto set = addonHost->getStockList(); QString name; if(set.contains(code)) name = set[code].name; CalcData ma10,ma21,vol5; foreach(Stock stock,list) { ma10.push_back(indicator10->update(stock)); ma21.push_back(indicator21->update(stock)); vol5.push_back(indicator5->update(stock)); } QVector<Stock> stocks = list.mid(span); vol5 = vol5.mid(span); ma10 = ma10.mid(span); ma21 = ma21.mid(span); for(int i=0;i<stocks.size();i++) { //低於10,21日均線 if(std::get<1>(ma21[i]) > stocks[i].current && std::get<1>(ma10[i]) >= stocks[i].current) { //鎚子線 bool ok = isChuiZiK(stocks[i]);// && stocks[i].tradeVolume >= 2*std::get<1>(vol5[i]); if(ok) { CHECK_AND_ADD(i+1); } } } }private:};SnailAddon* get_snail_interface(SnailAddonHost* host,int flag){ if(flag != SNAIL_ADDON_VERSION_INT || !host) return nullptr; addonHost = host; indicator10 = addonHost->createIndicator(SnailAddonHost::TAG_Indicator_Ma,10,0,0); indicator21 = addonHost->createIndicator(SnailAddonHost::TAG_Indicator_Ma,21,0,0); indicator5 = addonHost->createIndicator(SnailAddonHost::TAG_Indicator_VolMa,21,0,0); return new SnailAddonImpl();}

代碼還是很簡單的,凡是會編程的基本能看懂

沒有使用網上一些在線量化測試軟體的原因是基於編程可以更好的控制量化粒度

數據量較大且需要分析歷史數據,較為耗時

統計結果如下:

幾乎55%的準確率,看來鎚子止跌就飛浪得虛名也

在過去2年多內,共出現8459次買入信號,準確率54.88%左右,平均收益0.18%,離散度16

下面提高下鎚子下長影的比重為4倍以上再分析下

結論如下:

能夠發現準確率和收益率都有提升,可以說明鎚子止跌線越標準,準確率越高

但是這個收益率還是不能接受,需要再次優化

首先看看那些高漲幅的買入點賣出點對應的K線形態

顯然高漲幅的鎚子止跌線都有高成交量,那就增加成交量方面的檢查,當日成交量如果大於前5日2倍成交率則判斷為優質鎚子

再上結論

準確率60%多,平均收益1.46%,離散度1 .好傢夥 結果讓人難以置信

當然次數僅有105次也符合常理,凡是高準確率的形態其出現幾率比較較低

以下為按日期排序

當然本策略還可以進一步優化

幾個可以考慮優化的原則

1.今日開盤買入 明日收盤賣出,絕非較優策略,可以考慮從第二天的賣點出發,考慮優化

2.今日買入可以拉長賣出日期 或者破位後離場

3.出現鎚子信號後可以考慮支撐位,壓力位

4.單一策略無法通吃熊市和牛市,可以考慮分段對待

本策略3年今出現100多次,可以使用多策略混合模式,增加交易機會

本文經供參考,不足為買賣股票的憑證,如果有好的策略需要測試可以聯繫本人測試,也可以下載插件介面並自己操作

推薦閱讀:

從LTCM到次貸危機:量化投資的困境與出路
已有python基礎想學習量化。要配新電腦了,請問該用什麼配置?
小奮一號正式起航
劉夏,從倫敦投行走出的頂尖交易員 | 連載三:金融危機——最壞的時光,也是最好的時光!
國內外的做市商(market maker)有哪些差異?

TAG:股票 | 量化 |