楼主: dana.quant
3986 18

[交易平台及行情软件] 【量化策略】配对交易策略及其在RiceQuant量化交易平台上的实现(三) [推广有奖]

  • 0关注
  • 7粉丝

硕士生

52%

还不是VIP/贵宾

-

威望
0
论坛币
1030 个
通用积分
0
学术水平
8 点
热心指数
14 点
信用等级
8 点
经验
3609 点
帖子
103
精华
1
在线时间
55 小时
注册时间
2015-8-30
最后登录
2016-5-17

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
策略执行
ricequant,致力于打造亚太最出色的量化交易平台,www.ricequant.com
第一部分 在这里~~~~~https://bbs.pinggu.org/thread-3906746-1-1.html
第二部分在这里~~~~https://bbs.pinggu.org/thread-3906749-1-1.html
量化策略交流群:
Ricequant 量化策略社区 429907369  

Ricequant高校量化交流群 484490463

通过以上策略研究部分,我们发现最适合做配对交易的股票对为厦工股份(600815), 晋亿实业(601002).接下来我们用RiceQuant量化交易平台来执行我们的策略,回测时间为2013年全年 (一定要手选然后选对),初始资金为100000.0。

  1. import org.apache.commons.math3.stat.regression.SimpleRegression;
  2. import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
  3. import org.apache.commons.math3.analysis.function.Log;
  4.    
  5.     public class PairTrading implements IHStrategy{
  6.         int count = 0;
  7.         double zScore;
  8.         double beta;
  9.         double shareStock1;
  10.         double shareStock2;
  11.         double spread;
  12.         double betShare;
  13.         double buyShare;
  14.         double portfolioValue;
  15.         double dailyReturn;
  16.         double initialCash;
  17.         @Override
  18.         public void init(IHInformer informer, IHInitializers initializers) {
  19.             
  20.    
  21.             String stockId1 = "600815.XSHG";
  22.             String stockId2 = "601002.XSHG";
  23.             double closePrice[][] = new double[200][2];
  24.             // 这些参数值是在研究部分获取的
  25.             double beta = 0.418142479833;
  26.             double mean=7.27385228021;
  27.             double std  = 0.41596412236;
  28.    
  29.    
  30.    
  31.             int numRows = closePrice.length;
  32.             int numCols = closePrice[0].length;
  33.             int period = 199;
  34.         
  35.    
  36.    
  37.             initializers.instruments((universe) -> universe.add(stockId1, stockId2));
  38.             initializers.shortsell().allow();
  39.             initializers.events().statistics((stats, info, trans) -> {
  40.                 //获取两只股票的日线数据
  41.                 double[] closePxInStockId1 = stats.get(stockId1).history(period + 1, HPeriod.Day).getClosingPrice();
  42.                 double[] closePxInStockId2 = stats.get(stockId2).history(period + 1, HPeriod.Day).getClosingPrice();
  43.                 //每次对冲的多头头寸控制为当前持有现金的0.6
  44.                 betShare = info.portfolio().getAvailableCash()*0.6/closePxInStockId2[199];   
  45.                 portfolioValue = info.portfolio().getPortfolioValue();
  46.                 dailyReturn = info.portfolio().getDailyReturn();
  47.                 initialCash = info.portfolio().getInitialCash();
  48.                 buyShare = beta*betShare;
  49.                
  50.                 if (dailyReturn < 0){
  51.                     count = count + 1;
  52.                 }
  53.                
  54.                
  55.                 if (buyShare < 100){
  56.                     buyShare =100;
  57.                 }
  58.                 shareStock1 = info.position(stockId1).getNonClosedTradeQuantity();
  59.                 shareStock2 = info.position(stockId2).getNonClosedTradeQuantity();
  60.                 //计算两只股票之间的价差
  61.                 spread = closePxInStockId2[199] - beta*closePxInStockId1[199];
  62.                 //计算zScore
  63.                 zScore = (spread - mean)/std;
  64.                 informer.plot("zScore", zScore);
  65.     //当入场信号来的时候,进入市场  
  66.                 if ((zScore > 1.1  ) && (shareStock1 == 0) && (shareStock2 == 0)){               
  67.                     trans.sell(stockId2).shares(betShare).commit();
  68.                     trans.buy(stockId1).shares(buyShare).commit();
  69.                 }
  70.                 if ((zScore < -1.5) && (shareStock2 == 0) && (shareStock1 == 0)){
  71.                     trans.sell(stockId1).shares(buyShare).commit();
  72.                     trans.buy(stockId2).shares(betShare).commit();
  73.                 }
  74.     //当出场信号来的时候,离开市场
  75.                 if ((zScore < 0.8) && (zScore > -1.0) && (shareStock1 != 0) && (shareStock2 != 0) ){
  76.                     if (shareStock1 > 0){
  77.                         trans.sell(stockId1).shares(shareStock1).commit();
  78.                     }
  79.                     if (shareStock1 < 0){
  80.                         trans.buy(stockId1).shares(-shareStock1).commit();
  81.                     }   
  82.                     if (shareStock2 > 0){
  83.                         trans.sell(stockId2).shares(shareStock2).commit();
  84.                     }
  85.                     if (shareStock2 < 0){
  86.                         trans.buy(stockId2).shares(-shareStock2).commit();
  87.                         
  88.                     }
  89.                 }            
  90.             });
  91.         }
  92.     }
复制代码

                 });        }    }

几个重要的回测结果为:夏普率2.1236, 最大回撤7.450%,回测收益36.050%,同期基准收益为-7.800%.观察交易详情可以看出交易的时间点较为平均的分散在全年各个时间段。

策略优化

我们发现策略的最大回撤为7.450%。为了降低最大回撤,我们可以加入一个止损的方法,即经典的“Cut the lose and let the winning run”。思路为:如果连续亏损达到四天以上,则平仓退场。回测时间为2013年全年 (一定要手选然后选对),初始资金为100000.0

  1. import org.apache.commons.math3.stat.regression.SimpleRegression;
  2. import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
  3. import org.apache.commons.math3.analysis.function.Log;
  4.    
  5. public class PairTrading implements IHStrategy{
  6.         int count = 0;
  7.         double zScore;
  8.         double beta;
  9.         double shareStock1;
  10.         double shareStock2;
  11.         double spread;
  12.         double betShare;
  13.         double buyShare;
  14.         double portfolioValue;
  15.         double dailyReturn;
  16.         double initialCash;
  17.         @Override
  18.         public void init(IHInformer informer, IHInitializers initializers) {
  19.             
  20.    
  21.             String stockId1 = "600815.XSHG";
  22.             String stockId2 = "601002.XSHG";
  23.             double closePrice[][] = new double[200][2];
  24.             // 这些参数值是在研究部分获取的
  25.             double beta = 0.418142479833;
  26.             double mean=7.27385228021;
  27.             double std  = 0.41596412236;
  28.    
  29.    
  30.    
  31.             int numRows = closePrice.length;
  32.             int numCols = closePrice[0].length;
  33.             int period = 199;
  34.         
  35.    
  36.    
  37.             initializers.instruments((universe) -> universe.add(stockId1, stockId2));
  38.             initializers.shortsell().allow();
  39.             initializers.events().statistics((stats, info, trans) -> {
  40.                 //获取两只股票的日线数据
  41.                 double[] closePxInStockId1 = stats.get(stockId1).history(period + 1, HPeriod.Day).getClosingPrice();
  42.                 double[] closePxInStockId2 = stats.get(stockId2).history(period + 1, HPeriod.Day).getClosingPrice();
  43.                 //每次对冲的多头头寸控制为当前持有现金的0.6
  44.                 betShare = info.portfolio().getAvailableCash()*0.6/closePxInStockId2[199];   
  45.                 portfolioValue = info.portfolio().getPortfolioValue();
  46.                 dailyReturn = info.portfolio().getDailyReturn();
  47.                 initialCash = info.portfolio().getInitialCash();
  48.                 buyShare = beta*betShare;
  49.                 //此处为引入的止损。当每天的收益连续四天以上为负的时候则止损
  50.                 if (dailyReturn < 0){
  51.                     count = count + 1;
  52.                 }
  53.                 if (count > 4){
  54.                    if (shareStock1 > 0){
  55.                         trans.sell(stockId1).shares(shareStock1).commit();
  56.                         }
  57.                    if (shareStock1 < 0){
  58.                        trans.buy(stockId1).shares(-shareStock1).commit();
  59.                     }   
  60.                     if (shareStock2 > 0){
  61.                         trans.sell(stockId2).shares(shareStock2).commit();
  62.                     }
  63.                     if (shareStock2 < 0){
  64.                         trans.buy(stockId2).shares(-shareStock2).commit();
  65.                     }
  66.                     count = 0;
  67.                 }
  68.                 if (buyShare < 100){
  69.                     buyShare =100;
  70.                 }
  71.                 shareStock1 = info.position(stockId1).getNonClosedTradeQuantity();
  72.                 shareStock2 = info.position(stockId2).getNonClosedTradeQuantity();
  73.                 //计算两只股票之间的价差
  74.                 spread = closePxInStockId2[199] - beta*closePxInStockId1[199];
  75.                 //计算zScore
  76.                 zScore = (spread - mean)/std;
  77.                 informer.plot("zScore", zScore);
  78.     //当入场信号来的时候,进入市场  
  79.                 if ((zScore > 1.1  ) && (shareStock1 == 0) && (shareStock2 == 0)){               
  80.                     trans.sell(stockId2).shares(betShare).commit();
  81.                     trans.buy(stockId1).shares(buyShare).commit();
  82.                 }
  83.                 if ((zScore < -1.5) && (shareStock2 == 0) && (shareStock1 == 0)){
  84.                     trans.sell(stockId1).shares(buyShare).commit();
  85.                     trans.buy(stockId2).shares(betShare).commit();
  86.                 }
  87.     //当出场信号来的时候,离开市场
  88.                 if ((zScore < 0.8) && (zScore > -1.0) && (shareStock1 != 0) && (shareStock2 != 0) ){
  89.                     if (shareStock1 > 0){
  90.                         trans.sell(stockId1).shares(shareStock1).commit();
  91.                     }
  92.                     if (shareStock1 < 0){
  93.                         trans.buy(stockId1).shares(-shareStock1).commit();
  94.                     }   
  95.                     if (shareStock2 > 0){
  96.                         trans.sell(stockId2).shares(shareStock2).commit();
  97.                     }
  98.                     if (shareStock2 < 0){
  99.                         trans.buy(stockId2).shares(-shareStock2).commit();
  100.                         
  101.                     }
  102.                 }            
  103.             });
  104.         }
  105.     }
复制代码

最大回撤降低为6.650%。最大回测降低的并不多,但是夏普率提高到了2.3372,回测收益也提高到了41.80%。这为大家提供了一个思路,大家可以尝试不同的止损策略来看看效果如何。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:ricequant 量化交易平台 quant 量化策略 交易平台 交易平台 量化投资 量化策略 金融学

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
客初 + 20 + 20 + 2 精彩帖子
accumulation + 100 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 120  论坛币 + 20  学术水平 + 1  热心指数 + 3  信用等级 + 1   查看全部评分

本帖被以下文库推荐

沙发
长风神舞 在职认证  发表于 2015-9-22 21:21:14 |只看作者 |坛友微信交流群
资源有限,不建议同时一个版面有俩个精华占领头条,并且完全可以做一个主题帖,同时违背论坛规定,加精者请注意!
已有 1 人评分热心指数 收起 理由
客初 + 2 已处理

总评分: 热心指数 + 2   查看全部评分

长风破浪会有时,直挂云帆济沧海!--长风神舞

使用道具

藤椅
客初 企业认证  学生认证  发表于 2015-9-22 22:14:52 |只看作者 |坛友微信交流群
因论坛规定不应有同一版面多个帖子上精华帖,将取消(三)的精华。如需展示,请将(三)的链接放在(二)的帖子末尾。

使用道具

板凳
dana.quant 企业认证  发表于 2015-9-23 10:51:31 |只看作者 |坛友微信交流群
长风神舞 发表于 2015-9-22 21:21
资源有限,不建议同时一个版面有俩个精华占领头条,并且完全可以做一个主题帖,同时违背论坛规定,加精者请 ...
一个主题贴放不下·······我试过了  两个都放不下。。。。。

使用道具

报纸
长风神舞 在职认证  发表于 2015-9-23 12:52:04 |只看作者 |坛友微信交流群
dana.quant 发表于 2015-9-23 10:51
一个主题贴放不下·······我试过了  两个都放不下。。。。。
楼上客初版主已经提供了方案

使用道具

地板
dana.quant 企业认证  发表于 2015-9-23 14:21:46 |只看作者 |坛友微信交流群
长风神舞 发表于 2015-9-23 12:52
楼上客初版主已经提供了方案
恩恩 好的 好的~~谢谢啦~~

使用道具

7
长风神舞 在职认证  发表于 2015-9-23 20:52:33 |只看作者 |坛友微信交流群
fantuanxiaot 发表于 2015-9-23 20:12
你管得事儿还挺多  还到我这里撒野

还记得不 我在你帖子客观的有的评论 最后都被你删了
撒野?解释下,你敢惹事,我可不怕事

使用道具

8
长风神舞 在职认证  发表于 2015-9-23 20:53:47 |只看作者 |坛友微信交流群
dana.quant 发表于 2015-9-23 14:21
恩恩 好的 好的~~谢谢啦~~

使用道具

9
客初 企业认证  学生认证  发表于 2015-9-23 21:30:03 |只看作者 |坛友微信交流群
fantuanxiaot 发表于 2015-9-23 20:12
你管得事儿还挺多  还到我这里撒野

还记得不 我在你帖子客观的有的评论 最后都被你删了
@fantuanxiaot @长风神舞
问题已解决,已撤销负评分。
管理问题和相关误会不宜在公开版面讨论,请在版主议事厅或站内消息讨论。
平和~~
已有 1 人评分经验 论坛币 收起 理由
fantuanxiaot + 80 + 80 精彩帖子

总评分: 经验 + 80  论坛币 + 80   查看全部评分

使用道具

10
fantuanxiaot 发表于 2015-9-24 08:53:57 |只看作者 |坛友微信交流群
客初 发表于 2015-9-23 21:30
@fantuanxiaot @长风神舞
问题已解决,已撤销负评分。
管理问题和相关误会不宜在公开版面讨论, ...
[lol]

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-24 17:06