diff options
-rw-r--r-- | portfolio.py | 11 | ||||
-rw-r--r-- | test.py | 142 | ||||
-rw-r--r-- | test_portfolio.json | 356 |
3 files changed, 502 insertions, 7 deletions
diff --git a/portfolio.py b/portfolio.py index a4fbf94..1d8bfd5 100644 --- a/portfolio.py +++ b/portfolio.py | |||
@@ -221,6 +221,10 @@ class Balance: | |||
221 | self.used = Amount(currency, used_value) | 221 | self.used = Amount(currency, used_value) |
222 | 222 | ||
223 | @classmethod | 223 | @classmethod |
224 | def from_hash(cls, currency, hash_): | ||
225 | return cls(currency, hash_["total"], hash_["free"], hash_["used"]) | ||
226 | |||
227 | @classmethod | ||
224 | def in_currency(cls, other_currency, market, action="average", type="total"): | 228 | def in_currency(cls, other_currency, market, action="average", type="total"): |
225 | amounts = {} | 229 | amounts = {} |
226 | for currency in cls.known_balances: | 230 | for currency in cls.known_balances: |
@@ -235,10 +239,6 @@ class Balance: | |||
235 | return cls.known_balances.keys() | 239 | return cls.known_balances.keys() |
236 | 240 | ||
237 | @classmethod | 241 | @classmethod |
238 | def from_hash(cls, currency, hash_): | ||
239 | return cls(currency, hash_["total"], hash_["free"], hash_["used"]) | ||
240 | |||
241 | @classmethod | ||
242 | def _fill_balances(cls, hash_): | 242 | def _fill_balances(cls, hash_): |
243 | for key in hash_: | 243 | for key in hash_: |
244 | if key in ["info", "free", "used", "total"]: | 244 | if key in ["info", "free", "used", "total"]: |
@@ -270,9 +270,6 @@ class Balance: | |||
270 | new_repartition = cls.dispatch_assets(total_base_value) | 270 | new_repartition = cls.dispatch_assets(total_base_value) |
271 | Trade.compute_trades(values_in_base, new_repartition, market=market) | 271 | Trade.compute_trades(values_in_base, new_repartition, market=market) |
272 | 272 | ||
273 | def __int__(self): | ||
274 | return int(self.total) | ||
275 | |||
276 | def __repr__(self): | 273 | def __repr__(self): |
277 | return "Balance({} [{}/{}/{}])".format(self.currency, str(self.free), str(self.used), str(self.total)) | 274 | return "Balance({} [{}/{}/{}])".format(self.currency, str(self.free), str(self.used), str(self.total)) |
278 | 275 | ||
@@ -251,5 +251,147 @@ class PortfolioTest(unittest.TestCase): | |||
251 | def tearDown(self): | 251 | def tearDown(self): |
252 | self.patcher.stop() | 252 | self.patcher.stop() |
253 | 253 | ||
254 | class BalanceTest(unittest.TestCase): | ||
255 | def setUp(self): | ||
256 | super(BalanceTest, self).setUp() | ||
257 | |||
258 | self.fetch_balance = { | ||
259 | "free": "foo", | ||
260 | "info": "bar", | ||
261 | "used": "baz", | ||
262 | "total": "bazz", | ||
263 | "USDT": { | ||
264 | "free": 6.0, | ||
265 | "used": 1.2, | ||
266 | "total": 7.2 | ||
267 | }, | ||
268 | "XVG": { | ||
269 | "free": 16, | ||
270 | "used": 0.0, | ||
271 | "total": 16 | ||
272 | }, | ||
273 | "XMR": { | ||
274 | "free": 0.0, | ||
275 | "used": 0.0, | ||
276 | "total": 0.0 | ||
277 | }, | ||
278 | } | ||
279 | self.patcher = mock.patch.multiple(portfolio.Balance, known_balances={}, trades={}) | ||
280 | self.patcher.start() | ||
281 | |||
282 | def test_values(self): | ||
283 | balance = portfolio.Balance("BTC", 0.65, 0.35, 0.30) | ||
284 | self.assertEqual(0.65, balance.total.value) | ||
285 | self.assertEqual(0.35, balance.free.value) | ||
286 | self.assertEqual(0.30, balance.used.value) | ||
287 | self.assertEqual("BTC", balance.currency) | ||
288 | |||
289 | balance = portfolio.Balance.from_hash("BTC", { "total": 0.65, "free": 0.35, "used": 0.30}) | ||
290 | self.assertEqual(0.65, balance.total.value) | ||
291 | self.assertEqual(0.35, balance.free.value) | ||
292 | self.assertEqual(0.30, balance.used.value) | ||
293 | self.assertEqual("BTC", balance.currency) | ||
294 | |||
295 | @mock.patch.object(portfolio.Amount, "get_ticker") | ||
296 | def test_in_currency(self, get_ticker): | ||
297 | portfolio.Balance.known_balances = { | ||
298 | "BTC": portfolio.Balance("BTC", 0.65, 0.35, 0.30), | ||
299 | "ETH": portfolio.Balance("ETH", 3, 3, 0), | ||
300 | } | ||
301 | market = mock.Mock() | ||
302 | get_ticker.return_value = { | ||
303 | "bid": 0.09, | ||
304 | "ask": 0.11, | ||
305 | "average": 0.1, | ||
306 | } | ||
307 | |||
308 | amounts = portfolio.Balance.in_currency("BTC", market) | ||
309 | self.assertEqual("BTC", amounts["ETH"].currency) | ||
310 | self.assertEqual(0.65, amounts["BTC"].value) | ||
311 | self.assertEqual(0.30, amounts["ETH"].value) | ||
312 | |||
313 | amounts = portfolio.Balance.in_currency("BTC", market, action="bid") | ||
314 | self.assertEqual(0.65, amounts["BTC"].value) | ||
315 | self.assertEqual(0.27, amounts["ETH"].value) | ||
316 | |||
317 | amounts = portfolio.Balance.in_currency("BTC", market, action="bid", type="used") | ||
318 | self.assertEqual(0.30, amounts["BTC"].value) | ||
319 | self.assertEqual(0, amounts["ETH"].value) | ||
320 | |||
321 | def test_currencies(self): | ||
322 | portfolio.Balance.known_balances = { | ||
323 | "BTC": portfolio.Balance("BTC", 0.65, 0.35, 0.30), | ||
324 | "ETH": portfolio.Balance("ETH", 3, 3, 0), | ||
325 | } | ||
326 | self.assertListEqual(["BTC", "ETH"], list(portfolio.Balance.currencies())) | ||
327 | |||
328 | @mock.patch.object(portfolio.market, "fetch_balance") | ||
329 | def test_fetch_balances(self, fetch_balance): | ||
330 | fetch_balance.return_value = self.fetch_balance | ||
331 | |||
332 | portfolio.Balance.fetch_balances(portfolio.market) | ||
333 | self.assertNotIn("XMR", portfolio.Balance.currencies()) | ||
334 | self.assertEqual(["USDT", "XVG"], list(portfolio.Balance.currencies())) | ||
335 | |||
336 | @mock.patch.object(portfolio.Portfolio, "repartition_pertenthousand") | ||
337 | @mock.patch.object(portfolio.market, "fetch_balance") | ||
338 | def test_dispatch_assets(self, fetch_balance, repartition): | ||
339 | fetch_balance.return_value = self.fetch_balance | ||
340 | portfolio.Balance.fetch_balances(portfolio.market) | ||
341 | |||
342 | self.assertNotIn("XEM", portfolio.Balance.currencies()) | ||
343 | |||
344 | repartition.return_value = { | ||
345 | "XEM": 7500, | ||
346 | "BTC": 2600, | ||
347 | } | ||
348 | |||
349 | amounts = portfolio.Balance.dispatch_assets(portfolio.Amount("BTC", 10.1)) | ||
350 | self.assertIn("XEM", portfolio.Balance.currencies()) | ||
351 | self.assertEqual(2.6, amounts["BTC"].value) | ||
352 | self.assertEqual(7.5, amounts["XEM"].value) | ||
353 | |||
354 | @mock.patch.object(portfolio.Portfolio, "repartition_pertenthousand") | ||
355 | @mock.patch.object(portfolio.Amount, "get_ticker") | ||
356 | @mock.patch.object(portfolio.Trade, "compute_trades") | ||
357 | def test_prepare_trades(self, compute_trades, get_ticker, repartition): | ||
358 | repartition.return_value = { | ||
359 | "XEM": 7500, | ||
360 | "BTC": 2500, | ||
361 | } | ||
362 | get_ticker.side_effect = [ | ||
363 | { "average": 0.0001 }, | ||
364 | { "average": 0.000001 } | ||
365 | ] | ||
366 | market = mock.Mock() | ||
367 | market.fetch_balance.return_value = { | ||
368 | "USDT": { | ||
369 | "free": 10000.0, | ||
370 | "used": 0.0, | ||
371 | "total": 10000.0 | ||
372 | }, | ||
373 | "XVG": { | ||
374 | "free": 10000.0, | ||
375 | "used": 0.0, | ||
376 | "total": 10000.0 | ||
377 | }, | ||
378 | } | ||
379 | portfolio.Balance.prepare_trades(market) | ||
380 | compute_trades.assert_called() | ||
381 | |||
382 | call = compute_trades.call_args | ||
383 | self.assertEqual(market, call[1]["market"]) | ||
384 | self.assertEqual(1, call[0][0]["USDT"].value) | ||
385 | self.assertEqual(0.01, call[0][0]["XVG"].value) | ||
386 | self.assertEqual(0.2525, call[0][1]["BTC"].value) | ||
387 | self.assertEqual(0.7575, call[0][1]["XEM"].value) | ||
388 | |||
389 | def test__repr(self): | ||
390 | balance = portfolio.Balance("BTX", 3, 1, 2) | ||
391 | self.assertEqual("Balance(BTX [1.00000000 BTX/2.00000000 BTX/3.00000000 BTX])", repr(balance)) | ||
392 | |||
393 | def tearDown(self): | ||
394 | self.patcher.stop() | ||
395 | |||
254 | if __name__ == '__main__': | 396 | if __name__ == '__main__': |
255 | unittest.main() | 397 | unittest.main() |
diff --git a/test_portfolio.json b/test_portfolio.json new file mode 100644 index 0000000..a2ba3f0 --- /dev/null +++ b/test_portfolio.json | |||
@@ -0,0 +1,356 @@ | |||
1 | { | ||
2 | "portfolio_1": { | ||
3 | "holding": { | ||
4 | "logo": [ | ||
5 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/ETC.png' title='Ethereum Classic'></img>", | ||
6 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/USDT.png' title='Tether'></img>", | ||
7 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/GAS.png' title='Gas'></img>", | ||
8 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/BTC.png' title='Bitcoin'></img>", | ||
9 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/ETH.png' title='Ethereum'></img>", | ||
10 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/FCT.png' title='Factoids'></img>" | ||
11 | ], | ||
12 | "direction": [ | ||
13 | "long", | ||
14 | "long", | ||
15 | "long", | ||
16 | "long", | ||
17 | "long", | ||
18 | "long" | ||
19 | ], | ||
20 | "weight": [ | ||
21 | 11.27, | ||
22 | 12.26, | ||
23 | 13.08, | ||
24 | 14.29, | ||
25 | 15.69, | ||
26 | 33.41 | ||
27 | ], | ||
28 | "bid_ask_spread": [ | ||
29 | 0.669, | ||
30 | 0.243, | ||
31 | 0.301, | ||
32 | 0.243, | ||
33 | 0.094, | ||
34 | 0 | ||
35 | ], | ||
36 | "holding_time": [ | ||
37 | 1, | ||
38 | 1, | ||
39 | 1, | ||
40 | 274, | ||
41 | 1, | ||
42 | 1 | ||
43 | ], | ||
44 | "weekly_return_usdt": [ | ||
45 | -0.2515, | ||
46 | 0, | ||
47 | 0.0266, | ||
48 | -0.1353, | ||
49 | -0.2352, | ||
50 | -0.315 | ||
51 | ], | ||
52 | "_row": [ | ||
53 | "Ethereum C (ETC)", | ||
54 | "Tether (USDT)", | ||
55 | "Gas (GAS)", | ||
56 | "Bitcoin (BTC)", | ||
57 | "Ethereum (ETH)", | ||
58 | "Factoids (FCT)" | ||
59 | ] | ||
60 | }, | ||
61 | "weights": { | ||
62 | "USDT": [ 0, 0, 0, 0, 0, 0, 0.1577, 0.1083, 0, 0.1226 ], | ||
63 | "AMP": [ 0, 0, 0.1854, 0, 0, 0, 0, 0, 0, 0 ], | ||
64 | "ARDR": [ 0, 0, 0, 0.0718, 0, 0, 0, 0, 0, 0 ], | ||
65 | "BBR": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
66 | "BCH": [ 0.1126, 0.0386, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
67 | "BCN": [ 0, 0, 0, 0, 0, 0.1467, 0, 0, 0, 0 ], | ||
68 | "BCY": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
69 | "BELA": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
70 | "BLK": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
71 | "BTC": [ 0.1667, 0.2857, 0.2857, 0.2857, 0.2857, 0.2857, 0.1429, 0.1429, 0.2857, 0.1429 ], | ||
72 | "BTCD": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
73 | "BTM": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
74 | "BTS": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
75 | "BTSs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
76 | "BURST": [ 0, 0, 0, 0, 0.2959, 0, 0, 0, 0, 0 ], | ||
77 | "CLAM": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
78 | "CLAMs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
79 | "CURE": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
80 | "DASH": [ 0.0919, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
81 | "DASHs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
82 | "DCR": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
83 | "DGB": [ 0, 0, 0, 0, 0, 0, 0.1177, 0, 0.1015, 0 ], | ||
84 | "DOGE": [ 0, 0, 0, 0, 0, 0.1092, 0.2092, 0, 0.1805, 0 ], | ||
85 | "DOGEs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
86 | "EMC2": [ 0, 0, 0, 0, 0, 0.3456, 0, 0, 0, 0 ], | ||
87 | "ETC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1127 ], | ||
88 | "ETH": [ 0.3568, 0, 0, 0, 0, 0, 0, 0, 0, 0.1569 ], | ||
89 | "ETHs": [ 0, 0, 0, 0.3085, 0, 0, 0, 0, 0, 0 ], | ||
90 | "EXP": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
91 | "FCT": [ 0, 0, 0, 0, 0, 0, 0, 0.1922, 0, 0.3341 ], | ||
92 | "FCTs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
93 | "FLDC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
94 | "FLO": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
95 | "GAME": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
96 | "GAS": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1308 ], | ||
97 | "GNT": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
98 | "GRC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
99 | "HZ": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
100 | "IOC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
101 | "LSK": [ 0, 0.2231, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
102 | "LTC": [ 0.2656, 0, 0, 0, 0.2175, 0, 0, 0, 0, 0 ], | ||
103 | "LTCs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
104 | "MAID": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
105 | "MAIDs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
106 | "NAUT": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
107 | "NAV": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
108 | "NOTE": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
109 | "NXC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
110 | "NXT": [ 0, 0, 0.1297, 0, 0, 0, 0.1445, 0, 0, 0 ], | ||
111 | "OMG": [ 0, 0, 0, 0, 0, 0, 0, 0.1757, 0, 0 ], | ||
112 | "OMNI": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
113 | "PINK": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
114 | "POT": [ 0, 0, 0.148, 0, 0, 0, 0, 0.1959, 0, 0 ], | ||
115 | "PPC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
116 | "QTL": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
117 | "RADS": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
118 | "RBY": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
119 | "REP": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
120 | "SBD": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
121 | "SC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0.0623, 0 ], | ||
122 | "SDC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
123 | "SJCX": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
124 | "STEEM": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
125 | "STR": [ 0, 0, 0, 0, 0.0599, 0.1127, 0, 0.185, 0, 0 ], | ||
126 | "STRAT": [ 0, 0, 0, 0.0944, 0.1409, 0, 0.2281, 0, 0, 0 ], | ||
127 | "SYS": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
128 | "VOX": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
129 | "VRC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
130 | "VTC": [ 0, 0, 0.2512, 0, 0, 0, 0, 0, 0, 0 ], | ||
131 | "XBC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
132 | "XCP": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
133 | "XEM": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
134 | "XMG": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
135 | "XMR": [ 0.0064, 0.0068, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
136 | "XMRs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
137 | "XRP": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
138 | "XRPs": [ 0, 0.4457, 0, 0.2397, 0, 0, 0, 0, 0, 0 ], | ||
139 | "XVC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
140 | "ZEC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0.3701, 0 ], | ||
141 | "_row": [ | ||
142 | "2017-11-13", | ||
143 | "2017-11-20", | ||
144 | "2017-11-27", | ||
145 | "2017-12-04", | ||
146 | "2017-12-11", | ||
147 | "2017-12-18", | ||
148 | "2017-12-25", | ||
149 | "2018-01-01", | ||
150 | "2018-01-08", | ||
151 | "2018-01-15" | ||
152 | ] | ||
153 | } | ||
154 | }, | ||
155 | "portfolio_2": { | ||
156 | "holding": { | ||
157 | "logo": [ | ||
158 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/XVC.png' title='Vcash'></img>", | ||
159 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/USDT.png' title='Tether'></img>", | ||
160 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/STRAT.png' title='Stratis'></img>", | ||
161 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/STEEM.png' title='Steem'></img>", | ||
162 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/OMG.png' title='OmiseGo'></img>", | ||
163 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/XEM.png' title='NEM'></img>", | ||
164 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/XMR.png' title='Monero'></img>", | ||
165 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/FCT.png' title='Factoids'></img>", | ||
166 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/ETC.png' title='Ethereum Classic'></img>", | ||
167 | "<img src='https://cryptoportfolio.io/wp-content/uploads/portfolio/logo/ZRX.png' title='0x'></img>" | ||
168 | ], | ||
169 | "direction": [ | ||
170 | "long", | ||
171 | "long", | ||
172 | "long", | ||
173 | "long", | ||
174 | "long", | ||
175 | "long", | ||
176 | "long", | ||
177 | "long", | ||
178 | "long", | ||
179 | "long" | ||
180 | ], | ||
181 | "weight": [ | ||
182 | 10, | ||
183 | 10, | ||
184 | 10, | ||
185 | 10, | ||
186 | 10, | ||
187 | 10, | ||
188 | 10, | ||
189 | 10, | ||
190 | 10, | ||
191 | 10 | ||
192 | ], | ||
193 | "bid_ask_spread": [ | ||
194 | 1.699, | ||
195 | 0.076, | ||
196 | 0.216, | ||
197 | 0.076, | ||
198 | 0.363, | ||
199 | 0.133, | ||
200 | 0.306, | ||
201 | 0.479, | ||
202 | 0.181, | ||
203 | 0.264 | ||
204 | ], | ||
205 | "holding_time": [ | ||
206 | 1, | ||
207 | 1, | ||
208 | 1, | ||
209 | 1, | ||
210 | 15, | ||
211 | 1, | ||
212 | 1, | ||
213 | 15, | ||
214 | 8, | ||
215 | 1 | ||
216 | ], | ||
217 | "weekly_return_usdt": [ | ||
218 | -0.1887, | ||
219 | 0, | ||
220 | -0.2292, | ||
221 | -0.3314, | ||
222 | -0.2335, | ||
223 | -0.2816, | ||
224 | -0.1052, | ||
225 | -0.315, | ||
226 | -0.2515, | ||
227 | -0.3732 | ||
228 | ], | ||
229 | "_row": [ | ||
230 | "Vcash (XVC)", | ||
231 | "Tether (USDT)", | ||
232 | "Stratis (STRAT)", | ||
233 | "Steem (STEEM)", | ||
234 | "OmiseGo (OMG)", | ||
235 | "NEM (XEM)", | ||
236 | "Monero (XMR)", | ||
237 | "Factoids (FCT)", | ||
238 | "Ethereum C (ETC)", | ||
239 | "0x (ZRX)" | ||
240 | ] | ||
241 | }, | ||
242 | "weights": { | ||
243 | "USDT": [ 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0.1 ], | ||
244 | "AMP": [ 0, 0, 0.1111, 0, 0, 0, 0.1, 0, 0, 0 ], | ||
245 | "ARDR": [ 0, 0, 0, 0.1111, 0.2, 0, 0, 0, 0, 0 ], | ||
246 | "BBR": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
247 | "BCH": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
248 | "BCN": [ 0, 0, 0, 0, 0, 0.1111, 0, 0, 0, 0 ], | ||
249 | "BCY": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
250 | "BELA": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
251 | "BITS": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
252 | "BLK": [ 0, 0.125, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
253 | "BTC": [ 1.1102e-16, 0, 0, 0, 1.1102e-16, 0, 2.2204e-16, 0, 1.1102e-16, 1.1102e-16 ], | ||
254 | "BTCD": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
255 | "BTM": [ 0, 0, 0, 0, 0, 0, 0, 0.1, 0, 0 ], | ||
256 | "BTS": [ 0.1, 0.125, 0.1111, 0, 0, 0.1111, 0.1, 0, 0, 0 ], | ||
257 | "BTSs": [ 0, 0, 0, 0.1111, 0, 0, 0, 0, 0, 0 ], | ||
258 | "BURST": [ 0, 0, 0, 0, 0.2, 0.1111, 0.1, 0, 0, 0 ], | ||
259 | "C2": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
260 | "CLAM": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
261 | "CLAMs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
262 | "CURE": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
263 | "DASH": [ 0.1, 0.125, 0.1111, 0, 0, 0, 0, 0, 0, 0 ], | ||
264 | "DASHs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
265 | "DCR": [ 0.1, 0, 0.1111, 0, 0, 0, 0, 0, 0, 0 ], | ||
266 | "DGB": [ 0, 0, 0, 0, 0, 0.1111, 0.1, 0, 0, 0 ], | ||
267 | "DOGE": [ 0, 0, 0, 0, 0, 0.1111, 0.1, 0, 0, 0 ], | ||
268 | "DOGEs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
269 | "EMC2": [ 0, 0, 0, 0.1111, 0, 0.1111, 0, 0, 0, 0 ], | ||
270 | "ETC": [ 0.1, 0.125, 0, 0, 0, 0, 0, 0, 0.1, 0.1 ], | ||
271 | "ETH": [ 0.1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
272 | "ETHs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
273 | "EXP": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
274 | "FCT": [ 0, 0, 0, 0, 0, 0, 0, 0.1, 0.1, 0.1 ], | ||
275 | "FCTs": [ 0, 0, 0, 0.1111, 0, 0, 0, 0, 0, 0 ], | ||
276 | "FLDC": [ 0, 0, 0, 0, 0.2, 0, 0, 0, 0, 0 ], | ||
277 | "FLO": [ 0, 0, 0, 0, 0, 0, 0, 0.1, 0, 0 ], | ||
278 | "GAME": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
279 | "GAS": [ 0, 0.125, 0, 0, 0, 0, 0, 0, 0.1, 0 ], | ||
280 | "GNO": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
281 | "GNT": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
282 | "GRC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
283 | "HUC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
284 | "HZ": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
285 | "IOC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
286 | "LBC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
287 | "LSK": [ 0, 0.125, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
288 | "LTC": [ 0.1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
289 | "LTCs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
290 | "MAID": [ 0.1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
291 | "MAIDs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
292 | "MYR": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
293 | "NAUT": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
294 | "NAV": [ 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0 ], | ||
295 | "NEOS": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
296 | "NMC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
297 | "NOBL": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
298 | "NOTE": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
299 | "NSR": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
300 | "NXC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
301 | "NXT": [ 0, 0, 0.1111, 0.1111, 0, 0.1111, 0, 0, 0, 0 ], | ||
302 | "OMG": [ 0, 0, 0, 0, 0, 0, 0, 0.1, 0.1, 0.1 ], | ||
303 | "OMNI": [ 0.1, 0, 0, 0, 0, 0, 0, 0.1, 0.1, 0 ], | ||
304 | "PASC": [ 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0 ], | ||
305 | "PINK": [ 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0 ], | ||
306 | "POT": [ 0, 0, 0.1111, 0.1111, 0, 0, 0, 0.1, 0, 0 ], | ||
307 | "PPC": [ 0, 0, 0, 0, 0, 0, 0, 0.1, 0.1, 0 ], | ||
308 | "QBK": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
309 | "QORA": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
310 | "QTL": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
311 | "RADS": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
312 | "RBY": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
313 | "REP": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
314 | "RIC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0 ], | ||
315 | "SBD": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
316 | "SC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
317 | "SDC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
318 | "SJCX": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
319 | "STEEM": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1 ], | ||
320 | "STORJ": [ 0, 0, 0, 0, 0, 0, 0, 0.1, 0, 0 ], | ||
321 | "STR": [ 0, 0, 0.1111, 0.1111, 0.2, 0.1111, 0, 0.1, 0, 0 ], | ||
322 | "STRAT": [ 0, 0, 0, 0, 0.2, 0, 0.1, 0, 0, 0.1 ], | ||
323 | "SYS": [ 0, 0, 0.1111, 0, 0, 0, 0, 0, 0, 0 ], | ||
324 | "UNITY": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
325 | "VIA": [ 0, 0, 0, 0, 0, 0, 0, 0.1, 0.1, 0 ], | ||
326 | "VOX": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
327 | "VRC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
328 | "VTC": [ 0.1, 0, 0.1111, 0.1111, 0, 0, 0, 0, 0, 0 ], | ||
329 | "XBC": [ 0.1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
330 | "XCP": [ 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0 ], | ||
331 | "XEM": [ 0, 0, 0, 0, 0, 0.1111, 0, 0, 0, 0.1 ], | ||
332 | "XMG": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
333 | "XMR": [ 0, 0.125, 0, 0, 0, 0, 0, 0, 0, 0.1 ], | ||
334 | "XMRs": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
335 | "XPM": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
336 | "XRP": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
337 | "XRPs": [ 0, 0.125, 0, 0.1111, 0, 0, 0, 0, 0, 0 ], | ||
338 | "XVC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1 ], | ||
339 | "ZEC": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], | ||
340 | "ZRX": [ 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0.1 ], | ||
341 | "_row": [ | ||
342 | "2017-11-13", | ||
343 | "2017-11-20", | ||
344 | "2017-11-27", | ||
345 | "2017-12-04", | ||
346 | "2017-12-11", | ||
347 | "2017-12-18", | ||
348 | "2017-12-25", | ||
349 | "2018-01-01", | ||
350 | "2018-01-08", | ||
351 | "2018-01-15" | ||
352 | ] | ||
353 | } | ||
354 | } | ||
355 | } | ||
356 | |||