test_doc
test_AF_EqualWeight.cpp
浏览该文件的文档.
1 /*
2  * test_AF_EqualWeight.cpp
3  *
4  * Created on: 2018-2-10
5  * Author: fasiondog
6  */
7 
8 
9 #ifdef TEST_ALL_IN_ONE
10  #include <boost/test/unit_test.hpp>
11 #else
12  #define BOOST_TEST_MODULE test_hikyuu_trade_sys_suite
13  #include <boost/test/unit_test.hpp>
14 #endif
15 
16 #include <hikyuu/StockManager.h>
17 #include <hikyuu/trade_manage/crt/crtTM.h>
18 #include <hikyuu/trade_sys/system/crt/SYS_Simple.h>
19 #include <hikyuu/trade_sys/selector/crt/SE_Fixed.h>
20 #include <hikyuu/trade_sys/allocatefunds/crt/AF_EqualWeight.h>
21 
22 using namespace hku;
23 
31 BOOST_AUTO_TEST_CASE( test_AF_EqualWeight_not_adjust_hold) {
32  StockManager& sm = StockManager::instance();
33 
34  SEPtr se = SE_Fixed();
35  AFPtr af = AF_EqualWeight();
36  TMPtr tm = crtTM(Datetime(200101010000L), 100000);
37  TMPtr subtm = crtTM(Datetime(200101010000L), 0);
38  SYSPtr sys = SYS_Simple(subtm->clone());
39 
40  SystemList se_list;
41  SystemList hold_list;
42  SystemList ac_list;
43  SystemWeightList sw_list;
44 
45  af->setTM(tm);
46  af->setParam<bool>("adjust_hold_sys", false);
47 
49  af->setParam<bool>("adjust_hold_sys", false);
50  af->setParam<int>("max_sys_num", 1);
51  tm->reset();
52  se->clear();
53  sys->setTM(subtm->clone());
54  se->addStock(sm["sh600000"], sys);
55  se_list = se->getSelectedSystemList(Datetime(201802100000L));
56  BOOST_CHECK(se_list.size() == 1);
57  BOOST_CHECK(hold_list.size() == 0);
58  BOOST_CHECK(se_list[0]->getTM()->currentCash() == 0);
59 
60  sw_list = af->_allocateWeight(Datetime(201802100000L), se_list);
61  ac_list = af->getAllocatedSystemList(Datetime(201802100000L), se_list, hold_list);
62  BOOST_CHECK(sw_list.size() == 1);
63  BOOST_CHECK(sw_list[0].getSYS()->getStock() == sm["sh600000"]);
64  BOOST_CHECK(sw_list[0].getWeight() == 1);
65  BOOST_CHECK(se_list[0]->getTM()->currentCash() == 100000);
66  BOOST_CHECK(tm->currentCash() == 0);
67  BOOST_CHECK(ac_list.size() == 1);
68  BOOST_CHECK(ac_list[0] == sw_list[0].getSYS());
69 
71  af->setParam<int>("max_sys_num", 1);
72  tm->reset();
73  se->clear();
74  sys->setTM(subtm->clone());
75  se->addStock(sm["sh600000"], sys);
76  se->addStock(sm["sh600004"], sys);
77  se_list = se->getSelectedSystemList(Datetime(201802100000L));
78  BOOST_CHECK(se_list.size() > af->getParam<int>("max_sys_num"));
79  BOOST_CHECK(hold_list.size() == 0);
80  BOOST_CHECK(se_list[0]->getTM()->currentCash() == 0);
81  BOOST_CHECK(se_list[1]->getTM()->currentCash() == 0);
82  BOOST_CHECK(tm->currentCash() == 100000);
83 
84  sw_list = af->_allocateWeight(Datetime(201802100000L), se_list);
85  ac_list = af->getAllocatedSystemList(Datetime(201802100000L), se_list, hold_list);
86  BOOST_CHECK(sw_list.size() == 2);
87  BOOST_CHECK(sw_list[0].getSYS()->getStock() == sm["sh600000"]);
88  BOOST_CHECK(sw_list[0].getWeight() == 1);
89  BOOST_CHECK(se_list[0]->getTM()->currentCash() == 0);
90  BOOST_CHECK(tm->currentCash() == 0);
91  BOOST_CHECK(ac_list.size() == 1);
92  BOOST_CHECK(ac_list[0] == sw_list[1].getSYS());
93  BOOST_CHECK(ac_list[0]->getTM()->currentCash() == 100000);
94 
96  af->setParam<int>("max_sys_num", 2);
97  tm->reset();
98  se->clear();
99  sys->setTM(subtm->clone());
100  se->addStock(sm["sh600000"], sys);
101  se_list = se->getSelectedSystemList(Datetime(201802100000L));
102  se->clear();
103  se->addStock(sm["sh600004"], sys);
104  se->addStock(sm["sz000001"], sys);
105  hold_list = se->getSelectedSystemList(Datetime(201802100000L));
106  BOOST_CHECK(se_list.size() != 0);
107  BOOST_CHECK(hold_list.size() == af->getParam<int>("max_sys_num"));
108  BOOST_CHECK(tm->currentCash() == 100000);
109 
110  sw_list = af->_allocateWeight(Datetime(201802100000L), se_list);
111  ac_list = af->getAllocatedSystemList(Datetime(201802100000L), se_list, hold_list);
112  BOOST_CHECK(sw_list.size() == 1);
113  BOOST_CHECK(sw_list[0].getSYS()->getStock() == sm["sh600000"]);
114  BOOST_CHECK(sw_list[0].getWeight() == 1);
115  BOOST_CHECK(se_list[0]->getTM()->currentCash() == 0);
116  BOOST_CHECK(tm->currentCash() == 100000);
117  BOOST_CHECK(ac_list.size() == 2);
118  BOOST_CHECK(ac_list[0]->getStock() == sm["sh600004"]);
119  BOOST_CHECK(ac_list[1]->getStock() == sm["sz000001"]);
120  BOOST_CHECK(ac_list[0]->getTM()->currentCash() == 0);
121  BOOST_CHECK(ac_list[1]->getTM()->currentCash() == 0);
122 
124  af->setParam<int>("max_sys_num", 1);
125  tm->reset();
126  se->clear();
127  sys->setTM(subtm->clone());
128  se->addStock(sm["sh600000"], sys);
129  se_list = se->getSelectedSystemList(Datetime(201802100000L));
130  se->clear();
131  se->addStock(sm["sh600004"], sys);
132  se->addStock(sm["sz000001"], sys);
133  hold_list = se->getSelectedSystemList(Datetime(201802100000L));
134  BOOST_CHECK(se_list.size() != 0);
135  BOOST_CHECK(hold_list.size() > af->getParam<int>("max_sys_num"));
136  BOOST_CHECK(tm->currentCash() == 100000);
137  BOOST_CHECK(hold_list[0]->getTM()->currentCash() == 0);
138  BOOST_CHECK(hold_list[1]->getTM()->currentCash() == 0);
139 
140  sw_list = af->_allocateWeight(Datetime(201802100000L), se_list);
141  ac_list = af->getAllocatedSystemList(Datetime(201802100000L), se_list, hold_list);
142  BOOST_CHECK(sw_list.size() == 1);
143  BOOST_CHECK(sw_list[0].getSYS()->getStock() == sm["sh600000"]);
144  BOOST_CHECK(sw_list[0].getWeight() == 1);
145  BOOST_CHECK(se_list[0]->getTM()->currentCash() == 0);
146  BOOST_CHECK(tm->currentCash() == 100000);
147  BOOST_CHECK(ac_list.size() == 2);
148  BOOST_CHECK(ac_list[0]->getStock() == sm["sh600004"]);
149  BOOST_CHECK(ac_list[1]->getStock() == sm["sz000001"]);
150  BOOST_CHECK(ac_list[0]->getTM()->currentCash() == 0);
151  BOOST_CHECK(ac_list[1]->getTM()->currentCash() == 0);
152 
154  af->setParam<int>("max_sys_num", 4);
155  tm->reset();
156  se->clear();
157  sys->setTM(subtm->clone());
158  se->addStock(sm["sh600000"], sys);
159  se->addStock(sm["sh600005"], sys);
160  se->addStock(sm["sz000002"], sys);
161  se->addStock(sm["sz000004"], sys);
162  se->addStock(sm["sz000005"], sys);
163  se_list = se->getSelectedSystemList(Datetime(201802100000L));
164  se->clear();
165  se->addStock(sm["sh600004"], sys);
166  se->addStock(sm["sz000001"], sys);
167  hold_list = se->getSelectedSystemList(Datetime(201802100000L));
168  BOOST_CHECK(se_list.size() != 0);
169  BOOST_CHECK(hold_list.size() < af->getParam<int>("max_sys_num"));
170  BOOST_CHECK(tm->currentCash() == 100000);
171  BOOST_CHECK(hold_list[0]->getTM()->currentCash() == 0);
172  BOOST_CHECK(hold_list[1]->getTM()->currentCash() == 0);
173 
174  sw_list = af->_allocateWeight(Datetime(201802100000L), se_list);
175  ac_list = af->getAllocatedSystemList(Datetime(201802100000L), se_list, hold_list);
176  BOOST_CHECK(sw_list.size() == 5);
177  BOOST_CHECK(tm->currentCash() == 0);
178  BOOST_CHECK(ac_list.size() == 4);
179  std::set<Stock> stk_set;
180 
181  for (auto iter = ac_list.begin(); iter != ac_list.end(); ++iter) {
182  stk_set.insert((*iter)->getStock());
183  }
184  BOOST_CHECK(stk_set.find(sm["sh600004"]) != stk_set.end());
185  BOOST_CHECK(stk_set.find(sm["sz000001"]) != stk_set.end());
186  BOOST_CHECK(ac_list[0] == hold_list[0]);
187  BOOST_CHECK(ac_list[1] == hold_list[1]);
188  BOOST_CHECK(ac_list[0]->getTM()->currentCash() == 0);
189  BOOST_CHECK(ac_list[1]->getTM()->currentCash() == 0);
190 
191  /*
192  std::cout << "current cash: " << tm->currentCash() << std::endl;
193  std::cout << "sw_list:===============>" << std::endl;
194  for (auto iter = sw_list.begin(); iter != sw_list.end(); ++iter) {
195  std::cout << *iter << std::endl;;
196  }
197 
198  std::cout << std::fixed;
199  std::cout.precision(4);
200 
201  std::cout << "ac_list:===============>" << std::endl;
202  for (auto iter = ac_list.begin(); iter != ac_list.end(); ++iter) {
203  std::cout << (*iter)->getTM()->currentCash() << std::endl;
204  std::cout << (*iter)->getStock() << std::endl;
205  }
206 
207  std::cout.unsetf(std::ostream::floatfield);
208  std::cout.precision();
209  */
210 }
211 
212 
214 //BOOST_AUTO_TEST_CASE( test_AF_EqualWeight_adjust_hold) {
215 //TODO test_AF_EqualWeight_adjust_hold
216 //}
217 
BOOST_AUTO_TEST_CASE(test_AF_EqualWeight_not_adjust_hold)