박하늘

backtest update

1 var express = require('express'); 1 var express = require('express');
2 const request = require('request'); 2 const request = require('request');
3 const TARGET_URL = 'https://api.line.me/v2/bot/message/reply' 3 const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
4 -const TOKEN = "sGB5EZq14+Lu4sc6Gt6NJ1Sx/rDtE1BsTyfZeNX42XVVjcgX1kk6/Uj1H40IQ1X3y8MzJLvKGifhioNCJLWQkWH2i95EtNDQyGn7Iqu6MnQRE7pg/z7klGgswS9974s0EKX90FcCfAIndNSYAG+d5gdB04t89/1O/w1cDnyilFU=" 4 +const PUSH_TARGET_URL = 'https://api.line.me/v2/bot/message/push'
5 +const TOKEN = "OVIxKODBqM8Pn2dpFtFeSLsDbBvApfTu88rh8wFGOzfvgvPjmBH0A4XKii97VxIDO9shYyTix4qGq32vwvL895Rbss5VSVEiU/XG5lOdyTLgECkSQKOdObSetZwcVHbGmzZJ+0Cz5vZrB5KuImOwrwdB04t89/1O/w1cDnyilFU="
5 const fs = require('fs'); 6 const fs = require('fs');
6 const path = require('path'); 7 const path = require('path');
7 const HTTPS = require('https'); 8 const HTTPS = require('https');
8 -const domain = "2016100990.oss2021.tk" 9 +const domain = "2017103989.oss2021.tk"
9 const sslport = 23023; 10 const sslport = 23023;
10 const bodyParser = require('body-parser'); 11 const bodyParser = require('body-parser');
11 var app = express(); 12 var app = express();
...@@ -13,6 +14,7 @@ var app = express(); ...@@ -13,6 +14,7 @@ var app = express();
13 var stockarr = []; 14 var stockarr = [];
14 var pastreply = ""; 15 var pastreply = "";
15 var tatic =""; 16 var tatic ="";
17 +var backtest = 0;
16 app.use('/simages', express.static(__dirname + '/src')); 18 app.use('/simages', express.static(__dirname + '/src'));
17 app.use(bodyParser.json()); 19 app.use(bodyParser.json());
18 app.post('/hook', function (req, res) { 20 app.post('/hook', function (req, res) {
...@@ -26,34 +28,32 @@ app.post('/hook', function (req, res) { ...@@ -26,34 +28,32 @@ app.post('/hook', function (req, res) {
26 console.log('[request message]', eventObj.message); 28 console.log('[request message]', eventObj.message);
27 if(eventObj.type == 'postback') 29 if(eventObj.type == 'postback')
28 { 30 {
29 - if(eventObj.postback.data == 'action=datetemp&selectId=1' && pastreply == "비중 추천"){ 31 + if(eventObj.postback.data == 'action=datetemp&selectId=1' && backtest == 0)
30 - console.log(stockarr); 32 + {
31 weight_recommend(eventObj.replyToken, eventObj.postback.params.date) 33 weight_recommend(eventObj.replyToken, eventObj.postback.params.date)
34 + stockarr.splice(0, stockarr.length);
32 tatic = "" 35 tatic = ""
33 pastreply = "" 36 pastreply = ""
34 } 37 }
35 - else 38 + else if(eventObj.postback.data == 'action=datetemp&selectId=1' && backtest == 1)
36 { 39 {
37 - optimizer(eventObj.replyToken, eventObj.postback.params.date) 40 + optimizer(eventObj.source.userId, eventObj.postback.params.date)
38 stockarr.splice(0, stockarr.length); 41 stockarr.splice(0, stockarr.length);
42 + tatic = ""
43 + pastreply = ""
44 + backtest = 0;
39 } 45 }
40 } 46 }
41 else 47 else
42 - { console.log(eventObj.message.text) 48 + {
43 - console.log(pastreply)
44 if(eventObj.message.text == '도움말' || eventObj.message.text == '주가 도움말' || eventObj.message.text == '비중 추천 도움말' || eventObj.message.text == '백테스트 도움말') 49 if(eventObj.message.text == '도움말' || eventObj.message.text == '주가 도움말' || eventObj.message.text == '비중 추천 도움말' || eventObj.message.text == '백테스트 도움말')
45 { 50 {
46 printhelp(eventObj.replyToken, eventObj.message.text) 51 printhelp(eventObj.replyToken, eventObj.message.text)
47 } 52 }
48 - else if(eventObj.message.text == '백테스트')
49 - {
50 - date(eventObj.replyToken, eventObj.message.text)
51 - }
52 else if (eventObj.message.text == '주가') 53 else if (eventObj.message.text == '주가')
53 { 54 {
54 basicinform_pre(eventObj.replyToken, eventObj.message.text) 55 basicinform_pre(eventObj.replyToken, eventObj.message.text)
55 pastreply = '주가' 56 pastreply = '주가'
56 - console.log(pastreply);
57 } 57 }
58 else if ( pastreply == '주가' && eventObj.message.text.indexOf(' ') == -1){ 58 else if ( pastreply == '주가' && eventObj.message.text.indexOf(' ') == -1){
59 basicinform(eventObj.replyToken, eventObj.message.text) 59 basicinform(eventObj.replyToken, eventObj.message.text)
...@@ -62,9 +62,13 @@ app.post('/hook', function (req, res) { ...@@ -62,9 +62,13 @@ app.post('/hook', function (req, res) {
62 weight_1(eventObj.replyToken, eventObj.message.text) 62 weight_1(eventObj.replyToken, eventObj.message.text)
63 pastreply = '비중 추천' 63 pastreply = '비중 추천'
64 } 64 }
65 - else if (pastreply = '비중 추천' && eventObj.message.text.indexOf(' ') != -1){ 65 + else if (eventObj.message.text == '백테스트'){
66 + weight_1(eventObj.replyToken, eventObj.message.text)
67 + pastreply = '비중 추천'
68 + backtest = 1
69 + }
70 + else if (pastreply == '비중 추천' && eventObj.message.text.indexOf(' ') != -1){
66 var holder = eventObj.message.text.split(' ') 71 var holder = eventObj.message.text.split(' ')
67 - console.log("holder",holder)
68 var i; 72 var i;
69 for(i = 0; i < holder.length; i++) 73 for(i = 0; i < holder.length; i++)
70 { 74 {
...@@ -74,7 +78,7 @@ app.post('/hook', function (req, res) { ...@@ -74,7 +78,7 @@ app.post('/hook', function (req, res) {
74 pastreply = "전략" 78 pastreply = "전략"
75 } 79 }
76 80
77 - else if (pastreply = "전략" && (eventObj.message.text == 'gmv' || eventObj.message.text == 'ms') || eventObj.message.text == 'rp'){ 81 + else if (pastreply == "전략" && (eventObj.message.text == 'gmv' || eventObj.message.text == 'ms') || eventObj.message.text == 'rp'){
78 tatic = eventObj.message.text 82 tatic = eventObj.message.text
79 pastreply = "비중 추천" 83 pastreply = "비중 추천"
80 date(eventObj.replyToken, eventObj.message.text) 84 date(eventObj.replyToken, eventObj.message.text)
...@@ -257,7 +261,7 @@ function printhelp(replyToken, message){ ...@@ -257,7 +261,7 @@ function printhelp(replyToken, message){
257 "messages":[ 261 "messages":[
258 { 262 {
259 "type":"text", 263 "type":"text",
260 - "text":"사용자 : 비중 추천 도움말\n챗봇 : 포트폴리오에 넣을 종목을 선택해주세요(2 종목 이상)\n사용자 : 종목명 입력 (ex 삼성전자, LG전자 ...)\n챗봇: 전략을 선택해주세요. (gmv, ms , rp)\n사용자: gmv, ms, rp 중 입력\n챗봇 : 케이스에 맞게 함수 실행 후 비중 출력" 264 + "text":"사용자 : 비중 추천\n챗봇 : 포트폴리오에 넣을 종목을 선택해주세요(2 종목 이상)\n사용자: 종목명 입력\n챗봇: 시작할 날짜를 입력해주세요\n사용자 : 종목명 입력 (ex 삼성전자, LG전자 ...)\n챗봇: 전략을 선택해주세요. (gmv, ms , rp)\n사용자: gmv, ms, rp 중 입력\n챗봇 : 케이스에 맞게 함수 실행 후 비중 출력"
261 } 265 }
262 ] 266 ]
263 } 267 }
...@@ -278,7 +282,7 @@ function printhelp(replyToken, message){ ...@@ -278,7 +282,7 @@ function printhelp(replyToken, message){
278 "messages":[ 282 "messages":[
279 { 283 {
280 "type":"text", 284 "type":"text",
281 - "text":"사용자 : 백테스트 도움말\n챗봇: 포트폴리오에 넣을 종목을 선택해주세요(2 종목 이상)\n사용자: 종목명 입력\n챗봇: 시작할 날짜를 입력해주세요\n사용자: 입력\n챗봇: 전략을 선택해주세요 (gmv, ms , rp)\n사용자: gmv,ms,rp 중 입력\n챗봇: 함수 실행 후 그래프 출력" 285 + "text":"사용자 : 백테스트\n챗봇: 포트폴리오에 넣을 종목을 선택해주세요(2 종목 이상)\n사용자: 종목명 입력\n챗봇: 시작할 날짜를 입력해주세요\n사용자: 입력\n챗봇: 전략을 선택해주세요 (gmv, ms , rp)\n사용자: gmv,ms,rp 중 입력\n챗봇: 함수 실행 후 그래프 출력"
282 } 286 }
283 ] 287 ]
284 } 288 }
...@@ -299,7 +303,7 @@ function printhelp(replyToken, message){ ...@@ -299,7 +303,7 @@ function printhelp(replyToken, message){
299 "messages":[ 303 "messages":[
300 { 304 {
301 "type":"text", 305 "type":"text",
302 - "text":"사용자 : 주가 도움말\n챗봇: 종목명을 알려주세요.\n사용자: 종목명 입력 (ex 삼성전자)\n챗봇 : 현재가 거래량 전일대비 수익률" 306 + "text":"사용자 : 주가\n챗봇: 종목명을 알려주세요.\n사용자: 종목명 입력 (ex 삼성전자)\n챗봇 : 현재가 거래량 전일대비 수익률"
303 } 307 }
304 ] 308 ]
305 } 309 }
...@@ -394,7 +398,7 @@ function basicinform(replyToken, message) { ...@@ -394,7 +398,7 @@ function basicinform(replyToken, message) {
394 398
395 } 399 }
396 400
397 -function optimizer(replyToken, sdate) { 401 +function optimizer(userid, sdate) {
398 sdate = sdate.toString(); 402 sdate = sdate.toString();
399 var pystring = '' 403 var pystring = ''
400 var i; 404 var i;
...@@ -406,16 +410,16 @@ function optimizer(replyToken, sdate) { ...@@ -406,16 +410,16 @@ function optimizer(replyToken, sdate) {
406 pystring += sdate; 410 pystring += sdate;
407 console.log(pystring); 411 console.log(pystring);
408 const spawn = require("child_process").spawn; 412 const spawn = require("child_process").spawn;
409 - const process = spawn("python", ["optimizer.py", pystring]); 413 + const process = spawn("python", ["optimizer.py", pystring, 'backtest', tatic]);
410 const Callback = (data) => { 414 const Callback = (data) => {
411 request.post( 415 request.post(
412 { 416 {
413 - url: TARGET_URL, 417 + url: PUSH_TARGET_URL,
414 headers: { 418 headers: {
415 'Authorization': `Bearer ${TOKEN}` 419 'Authorization': `Bearer ${TOKEN}`
416 }, 420 },
417 json: { 421 json: {
418 - "replyToken":replyToken, 422 + "to": userid,
419 "messages":[ 423 "messages":[
420 { 424 {
421 "type":"text", 425 "type":"text",
......
...@@ -606,36 +606,37 @@ else: ...@@ -606,36 +606,37 @@ else:
606 for i in range(len(args)-1): 606 for i in range(len(args)-1):
607 assets.append(args[i]) 607 assets.append(args[i])
608 gravity.append(0) 608 gravity.append(0)
609 - 609 + data = back_test().backtest_data(assets,gravity,args[-1], '2021-06-01',10000000,6, 'monthly', sys.argv[3])
610 - data = back_test().backtest_data(assets,gravity,args[-1], '2021-06-01',10000000,6, 'monthly', 'gmv') 610 +
611 - 611 +
612 - 612 +
613 - #data = back_test().backtest_data(['삼성전자','LG전자','호텔신라'],[0.1,0.1,0.8],'2020-01-01', '2021-01-02',10000000,6, 'monthly', 'gmv') 613 +
614 - # data = back_test().backtest_data(['삼성전자','LG전자'],[0.1,0.1],'2020-01-01', '2021-01-02',10000000,6, 'monthly', 'gmv') 614 +#data = back_test().backtest_data(['삼성전자','LG전자','카카오','호텔신라'],[0,0,0,0],'2020-01-01', '2021-01-02',10000000,6, 'monthly', 'ms')
615 - x = data['pfo_return'][0]['Date'] 615 +# data = back_test().backtest_data(['삼성전자','LG전자'],[0.1,0.1],'2020-01-01', '2021-01-02',10000000,6, 'monthly', 'gmv')
616 - y = data['pfo_return'][0]['acc_return ratio'] 616 +x = data['pfo_return'][0]['Date']
617 - y2 = data['bench'][0]['KOSPI_acc_return'] 617 +y = data['pfo_return'][0]['acc_return ratio']
618 - y3 = data['bench'][0]['S&P500_acc_return'] 618 +y2 = data['bench'][0]['KOSPI_acc_return']
619 - x_ticks = [] 619 +y3 = data['bench'][0]['S&P500_acc_return']
620 - for i,j in enumerate(x): 620 +x_ticks = []
621 - if (i % 6) == 0: 621 +for i,j in enumerate(x):
622 - x_ticks.append(j) 622 + if (i % 6) == 0:
623 - else: 623 + x_ticks.append(j)
624 - x_ticks.append('') 624 + else:
625 - x_ticks[-1]= x[-1] 625 + x_ticks.append('')
626 - plt.figure(figsize=(10,5)) 626 +x_ticks[-1]= x[-1]
627 - ax=plt.gca() 627 +plt.figure(figsize=(10,5))
628 - ax.xaxis.set_major_locator(ticker.MultipleLocator(12)) 628 +ax=plt.gca()
629 - plt.plot(x,y,label = 'gmv result') 629 +ax.xaxis.set_major_locator(ticker.MultipleLocator(12))
630 - plt.plot(x,y2 ,label = 'kospi result') 630 +plt.plot(x,y,label = 'gmv result')
631 - plt.plot(x,y3, label = 's&p500 result') 631 +plt.plot(x,y2 ,label = 'kospi result')
632 - plt.xticks(x_ticks,rotation=60) 632 +plt.plot(x,y3, label = 's&p500 result')
633 - plt.xlabel('Date') 633 +plt.xticks(x_ticks,rotation=60)
634 - plt.ylabel('Return') 634 +plt.xlabel('Date')
635 - plt.title('result') 635 +plt.ylabel('Return')
636 - plt.legend() 636 +plt.title('result')
637 - plt.show() 637 +plt.legend()
638 - plt.savefig("./src/test.png", dpi = 100) 638 +plt.show()
639 - print("end") 639 +plt.savefig("./src/test.png", dpi = 100)
640 +print("end")
640 641
641 642
......