Showing
2 changed files
with
77 additions
and
47 deletions
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 TOKEN = 'OVIxKODBqM8Pn2dpFtFeSLsDbBvApfTu88rh8wFGOzfvgvPjmBH0A4XKii97VxIDO9shYyTix4qGq32vwvL895Rbss5VSVEiU/XG5lOdyTLgECkSQKOdObSetZwcVHbGmzZJ+0Cz5vZrB5KuImOwrwdB04t89/1O/w1cDnyilFU=' |
5 | const fs = require('fs'); | 5 | const fs = require('fs'); |
6 | const path = require('path'); | 6 | const path = require('path'); |
7 | const HTTPS = require('https'); | 7 | const HTTPS = require('https'); |
8 | -const domain = "2016100990.oss2021.tk" | 8 | +const domain = "2017103989.oss2021.tk" |
9 | const sslport = 23023; | 9 | const sslport = 23023; |
10 | - | ||
11 | const bodyParser = require('body-parser'); | 10 | const bodyParser = require('body-parser'); |
12 | var app = express(); | 11 | var app = express(); |
13 | 12 | ||
13 | +var stockarr = []; | ||
14 | 14 | ||
15 | - | 15 | +app.use('/simages', express.static(__dirname + '/src')); |
16 | -var holder1 = ''; | ||
17 | -var holder2 = ''; | ||
18 | - | ||
19 | - | ||
20 | - | ||
21 | app.use(bodyParser.json()); | 16 | app.use(bodyParser.json()); |
22 | app.post('/hook', function (req, res) { | 17 | app.post('/hook', function (req, res) { |
23 | - | ||
24 | var eventObj = req.body.events[0]; | 18 | var eventObj = req.body.events[0]; |
25 | var source = eventObj.source; | 19 | var source = eventObj.source; |
26 | var message = eventObj.message; | 20 | var message = eventObj.message; |
... | @@ -33,15 +27,14 @@ app.post('/hook', function (req, res) { | ... | @@ -33,15 +27,14 @@ app.post('/hook', function (req, res) { |
33 | { | 27 | { |
34 | if(eventObj.postback.data == 'action=datetemp&selectId=1') | 28 | if(eventObj.postback.data == 'action=datetemp&selectId=1') |
35 | { | 29 | { |
36 | - console.log("optimizer 실행") | 30 | + |
37 | - app.use('/simages', express.static(__dirname + '/src')); | 31 | + optimizer(eventObj.replyToken, eventObj.postback.params.date) |
38 | - optimizer(eventObj.replyToken, holder1, holder2, eventObj.postback.params.date) | 32 | + stockarr.splice(0, stockarr.length); |
39 | - app.use('/simages', express.static(__dirname + '/src')); | ||
40 | } | 33 | } |
41 | } | 34 | } |
42 | else | 35 | else |
43 | { | 36 | { |
44 | - if(eventObj.message.text == '도움말' || '주가 도움말' || '비중 추천 도움말' || '백테스트 도움말') | 37 | + if(eventObj.message.text == '도움말' || eventObj.message.text == '주가 도움말' || eventObj.message.text == '비중 추천 도움말' || eventObj.message.text == '백테스트 도움말') |
45 | { | 38 | { |
46 | printhelp(eventObj.replyToken, eventObj.message.text) | 39 | printhelp(eventObj.replyToken, eventObj.message.text) |
47 | } | 40 | } |
... | @@ -53,7 +46,6 @@ app.post('/hook', function (req, res) { | ... | @@ -53,7 +46,6 @@ app.post('/hook', function (req, res) { |
53 | { | 46 | { |
54 | basicinform(eventObj.replyToken, eventObj.message.text) | 47 | basicinform(eventObj.replyToken, eventObj.message.text) |
55 | } | 48 | } |
56 | - | ||
57 | } | 49 | } |
58 | 50 | ||
59 | res.sendStatus(200); | 51 | res.sendStatus(200); |
... | @@ -80,28 +72,49 @@ function printhelp(replyToken, message){ | ... | @@ -80,28 +72,49 @@ function printhelp(replyToken, message){ |
80 | "type": "action", | 72 | "type": "action", |
81 | "action": { | 73 | "action": { |
82 | "type": "message", | 74 | "type": "message", |
83 | - "label": '주가', | 75 | + "label": '주가 도움말', |
84 | - "text": '주가 기능 도움말' | 76 | + "text": '주가 도움말' |
85 | } | 77 | } |
86 | }, | 78 | }, |
87 | { | 79 | { |
88 | "type": "action", | 80 | "type": "action", |
89 | "action": { | 81 | "action": { |
90 | "type": "message", | 82 | "type": "message", |
91 | - "label": '비중 추천', | 83 | + "label": '비중 추천 도움말', |
92 | - "text": '비중 추천 기능 도움말' | 84 | + "text": '비중 추천 도움말' |
93 | } | 85 | } |
94 | }, | 86 | }, |
95 | { | 87 | { |
96 | "type": "action", | 88 | "type": "action", |
97 | "action": { | 89 | "action": { |
98 | "type": "message", | 90 | "type": "message", |
99 | - "label": '백테스트', | 91 | + "label": '백테스트 도움말', |
100 | - "text": '백테스트 기능 도움말' | 92 | + "text": '백테스트 도움말' |
93 | + } | ||
94 | + } | ||
95 | + ] | ||
101 | } | 96 | } |
102 | } | 97 | } |
103 | ] | 98 | ] |
104 | } | 99 | } |
100 | + },(error, response, body) => { | ||
101 | + console.log(body) | ||
102 | + }); | ||
103 | + } | ||
104 | + else if(message == '주가 도움말') | ||
105 | + { | ||
106 | + request.post( | ||
107 | + { | ||
108 | + url: TARGET_URL, | ||
109 | + headers: { | ||
110 | + 'Authorization': `Bearer ${TOKEN}` | ||
111 | + }, | ||
112 | + json: { | ||
113 | + "replyToken":replyToken, | ||
114 | + "messages":[ | ||
115 | + { | ||
116 | + "type":"text", | ||
117 | + "text":"사용자 : 주가 도움말\n챗봇: 종목명을 알려주세요.\n사용자: 종목명 입력 (ex 삼성전자)\n챗봇 : 현재가 거래량 전일대비 수익률" | ||
105 | } | 118 | } |
106 | ] | 119 | ] |
107 | } | 120 | } |
... | @@ -109,7 +122,7 @@ function printhelp(replyToken, message){ | ... | @@ -109,7 +122,7 @@ function printhelp(replyToken, message){ |
109 | console.log(body) | 122 | console.log(body) |
110 | }); | 123 | }); |
111 | } | 124 | } |
112 | - else if(message == '주가 기능 도움말') | 125 | + else if(message == '비중 추천 도움말') |
113 | { | 126 | { |
114 | request.post( | 127 | request.post( |
115 | { | 128 | { |
... | @@ -122,7 +135,7 @@ function printhelp(replyToken, message){ | ... | @@ -122,7 +135,7 @@ function printhelp(replyToken, message){ |
122 | "messages":[ | 135 | "messages":[ |
123 | { | 136 | { |
124 | "type":"text", | 137 | "type":"text", |
125 | - "text":"사용자 : 주가\n챗봇: 종목명을 알려주세요.\n사용자: 종목명 입력 (ex 삼성전자)\n챗봇 : 현재가 거래량 전일대비 수익률" | 138 | + "text":"사용자 : 비중 추천 도움말\n챗봇 : 포트폴리오에 넣을 종목을 선택해주세요(2 종목 이상)\n사용자 : 종목명 입력 (ex 삼성전자, LG전자 ...)\n챗봇: 전략을 선택해주세요. (gmv, ms , rp)\n사용자: gmv, ms, rp 중 입력\n챗봇 : 케이스에 맞게 함수 실행 후 비중 출력" |
126 | } | 139 | } |
127 | ] | 140 | ] |
128 | } | 141 | } |
... | @@ -130,7 +143,7 @@ function printhelp(replyToken, message){ | ... | @@ -130,7 +143,7 @@ function printhelp(replyToken, message){ |
130 | console.log(body) | 143 | console.log(body) |
131 | }); | 144 | }); |
132 | } | 145 | } |
133 | - else if(message == '비중 추천 기능 도움말') | 146 | + else if(message == '백테스트 도움말') |
134 | { | 147 | { |
135 | request.post( | 148 | request.post( |
136 | { | 149 | { |
... | @@ -143,7 +156,7 @@ function printhelp(replyToken, message){ | ... | @@ -143,7 +156,7 @@ function printhelp(replyToken, message){ |
143 | "messages":[ | 156 | "messages":[ |
144 | { | 157 | { |
145 | "type":"text", | 158 | "type":"text", |
146 | - "text":"사용자 : 비중 추천\n챗봇 : 포트폴리오에 넣을 종목을 선택해주세요(2 종목 이상)\n사용자 : 종목명 입력 (ex 삼성전자, LG전자 ...)\n챗봇: 전략을 선택해주세요. (gmv, ms , rp)\n사용자: gmv, ms, rp 중 입력\n챗봇 : 케이스에 맞게 함수 실행 후 비중 출력" | 159 | + "text":"사용자 : 백테스트 도움말\n챗봇: 포트폴리오에 넣을 종목을 선택해주세요(2 종목 이상)\n사용자: 종목명 입력\n챗봇: 시작할 날짜를 입력해주세요\n사용자: 입력\n챗봇: 전략을 선택해주세요 (gmv, ms , rp)\n사용자: gmv,ms,rp 중 입력\n챗봇: 함수 실행 후 그래프 출력" |
147 | } | 160 | } |
148 | ] | 161 | ] |
149 | } | 162 | } |
... | @@ -151,7 +164,7 @@ function printhelp(replyToken, message){ | ... | @@ -151,7 +164,7 @@ function printhelp(replyToken, message){ |
151 | console.log(body) | 164 | console.log(body) |
152 | }); | 165 | }); |
153 | } | 166 | } |
154 | - else if(message == '백테스트 기능 도움말') | 167 | + else if(message == '주가 도움말') |
155 | { | 168 | { |
156 | request.post( | 169 | request.post( |
157 | { | 170 | { |
... | @@ -164,7 +177,7 @@ function printhelp(replyToken, message){ | ... | @@ -164,7 +177,7 @@ function printhelp(replyToken, message){ |
164 | "messages":[ | 177 | "messages":[ |
165 | { | 178 | { |
166 | "type":"text", | 179 | "type":"text", |
167 | - "text":"사용자 : 백테스트\n챗봇: 포트폴리오에 넣을 종목을 선택해주세요(2 종목 이상)\n사용자: 종목명 입력\n챗봇: 시작할 날짜를 입력해주세요\n사용자: 입력\n챗봇: 전략을 선택해주세요 (gmv, ms , rp)\n사용자: gmv,ms,rp 중 입력\n챗봇: 함수 실행 후 그래프 출력" | 180 | + "text":"사용자 : 주가 도움말\n챗봇: 종목명을 알려주세요.\n사용자: 종목명 입력 (ex 삼성전자)\n챗봇 : 현재가 거래량 전일대비 수익률" |
168 | } | 181 | } |
169 | ] | 182 | ] |
170 | } | 183 | } |
... | @@ -196,6 +209,11 @@ function basicinform(replyToken, message) { | ... | @@ -196,6 +209,11 @@ function basicinform(replyToken, message) { |
196 | { | 209 | { |
197 | "type":"text", | 210 | "type":"text", |
198 | "text":pystring | 211 | "text":pystring |
212 | + }, | ||
213 | + { | ||
214 | + "type":"image", | ||
215 | + "originalContentUrl": "https://2017103989.oss2021.tk:23023/simages/test.png", | ||
216 | + "previewImageUrl": "https://2017103989.oss2021.tk:23023/simages/test.png" | ||
199 | } | 217 | } |
200 | ] | 218 | ] |
201 | } | 219 | } |
... | @@ -258,14 +276,20 @@ function basicinform(replyToken, message) { | ... | @@ -258,14 +276,20 @@ function basicinform(replyToken, message) { |
258 | process.stdout.on("data", Callback); | 276 | process.stdout.on("data", Callback); |
259 | } | 277 | } |
260 | 278 | ||
261 | -function optimizer(replyToken, stock1, stock2, sdate) { | 279 | +function optimizer(replyToken, sdate) { |
262 | sdate = sdate.toString(); | 280 | sdate = sdate.toString(); |
263 | - console.log(typeof(stock1), typeof(stock2), typeof(sdate)) | 281 | + var pystring = '' |
264 | - console.log(stock1, stock2, sdate) | 282 | + var i; |
283 | + for(i = 0; i < stockarr.length; i++) | ||
284 | + { | ||
285 | + pystring += stockarr[i]; | ||
286 | + pystring += ',' | ||
287 | + } | ||
288 | + pystring += sdate; | ||
289 | + console.log(pystring); | ||
265 | const spawn = require("child_process").spawn; | 290 | const spawn = require("child_process").spawn; |
266 | - const process = spawn("python", ["optimizer.py", stock1, stock2, sdate]); | 291 | + const process = spawn("python", ["optimizer.py", pystring]); |
267 | const Callback = (data) => { | 292 | const Callback = (data) => { |
268 | - console.log(stock1, stock2, sdate) | ||
269 | request.post( | 293 | request.post( |
270 | { | 294 | { |
271 | url: TARGET_URL, | 295 | url: TARGET_URL, |
... | @@ -277,7 +301,7 @@ function optimizer(replyToken, stock1, stock2, sdate) { | ... | @@ -277,7 +301,7 @@ function optimizer(replyToken, stock1, stock2, sdate) { |
277 | "messages":[ | 301 | "messages":[ |
278 | { | 302 | { |
279 | "type":"text", | 303 | "type":"text", |
280 | - "text":'조회하신 ' + holder1 +', ' + holder2 + '의 백테스트 결과입니다.' | 304 | + "text":'조회하신 주식의 백테스트 결과입니다.' |
281 | }, | 305 | }, |
282 | { | 306 | { |
283 | "type":"image", | 307 | "type":"image", |
... | @@ -295,8 +319,11 @@ function optimizer(replyToken, stock1, stock2, sdate) { | ... | @@ -295,8 +319,11 @@ function optimizer(replyToken, stock1, stock2, sdate) { |
295 | 319 | ||
296 | function date(replyToken, message) { | 320 | function date(replyToken, message) { |
297 | var holder = message.split(' ') | 321 | var holder = message.split(' ') |
298 | - holder1 = holder[0] | 322 | + var i; |
299 | - holder2 = holder[1] | 323 | + for(i = 0; i < holder.length; i++) |
324 | + { | ||
325 | + stockarr[i] = holder[i]; | ||
326 | + } | ||
300 | var today = new Date(); | 327 | var today = new Date(); |
301 | var year = today.getFullYear(); | 328 | var year = today.getFullYear(); |
302 | var month = today.getMonth() + 1; | 329 | var month = today.getMonth() + 1; |
... | @@ -310,8 +337,6 @@ function date(replyToken, message) { | ... | @@ -310,8 +337,6 @@ function date(replyToken, message) { |
310 | date = '0'+ date | 337 | date = '0'+ date |
311 | } | 338 | } |
312 | var stoday = year + '-' + month + '-' + date; | 339 | var stoday = year + '-' + month + '-' + date; |
313 | - | ||
314 | - | ||
315 | const messageObject = { | 340 | const messageObject = { |
316 | "type": "template", | 341 | "type": "template", |
317 | "altText": "this is a buttons template", | 342 | "altText": "this is a buttons template", |
... | @@ -373,14 +398,11 @@ function date(replyToken, message) { | ... | @@ -373,14 +398,11 @@ function date(replyToken, message) { |
373 | messageObject | 398 | messageObject |
374 | ] | 399 | ] |
375 | 400 | ||
376 | - | ||
377 | } | 401 | } |
378 | },(error, response, body) => { | 402 | },(error, response, body) => { |
379 | console.log(body) | 403 | console.log(body) |
380 | }); | 404 | }); |
381 | 405 | ||
382 | - | ||
383 | - | ||
384 | } | 406 | } |
385 | 407 | ||
386 | try { | 408 | try { |
... | @@ -391,10 +413,9 @@ try { | ... | @@ -391,10 +413,9 @@ try { |
391 | }; | 413 | }; |
392 | 414 | ||
393 | HTTPS.createServer(option, app).listen(sslport, () => { | 415 | HTTPS.createServer(option, app).listen(sslport, () => { |
394 | - console.log(`[HTTPS] Server is started on port hihi ${sslport}`); | 416 | + console.log(`[HTTPS] Server is started on port ${sslport}`); |
395 | }); | 417 | }); |
396 | } catch (error) { | 418 | } catch (error) { |
397 | console.log('[HTTPS] HTTPS 오류가 발생하였습니다. HTTPS 서버는 실행되지 않습니다.'); | 419 | console.log('[HTTPS] HTTPS 오류가 발생하였습니다. HTTPS 서버는 실행되지 않습니다.'); |
398 | console.log(error); | 420 | console.log(error); |
399 | } | 421 | } |
400 | - | ... | ... |
... | @@ -583,10 +583,19 @@ class back_test: | ... | @@ -583,10 +583,19 @@ class back_test: |
583 | # print(back_test().backtest_data(['삼성전자','LG전자'],[0.9,0.1],'2010-01-01', '2021-01-01',10000000,3, 'monthly', 'gmv')['pfo_return'][0]['acc_return_ratio']) | 583 | # print(back_test().backtest_data(['삼성전자','LG전자'],[0.9,0.1],'2010-01-01', '2021-01-01',10000000,3, 'monthly', 'gmv')['pfo_return'][0]['acc_return_ratio']) |
584 | # print(back_test().backtest_data(['삼성전자','LG전자'],[0.9,0.1],'2018-01-01', '2021-01-01',10000000,6, 'monthly', 'gmv')) | 584 | # print(back_test().backtest_data(['삼성전자','LG전자'],[0.9,0.1],'2018-01-01', '2021-01-01',10000000,6, 'monthly', 'gmv')) |
585 | 585 | ||
586 | +args = sys.argv[1].split(",") | ||
586 | 587 | ||
587 | -print(sys.argv[0]) | 588 | +assets = [] |
588 | -data = back_test().backtest_data([sys.argv[1],sys.argv[2]],[0.5,0.5],sys.argv[3], '2021-01-02',10000000,6, 'monthly', 'gmv') | 589 | +gravity = [] |
589 | -# data = back_test().backtest_data(['삼성전자','LG전자'],[0.5,0.5],'2020-01-01', '2021-01-02',10000000,6, 'monthly', 'gmv') | 590 | +for i in range(len(args)-1): |
591 | + assets.append(args[i]) | ||
592 | + gravity.append(0) | ||
593 | + | ||
594 | +data = back_test().backtest_data(assets,gravity,args[-1], '2021-01-02',10000000,6, 'monthly', 'gmv') | ||
595 | + | ||
596 | + | ||
597 | +#data = back_test().backtest_data(['삼성전자','LG전자','호텔신라'],[0.1,0.1,0.8],'2020-01-01', '2021-01-02',10000000,6, 'monthly', 'gmv') | ||
598 | +# data = back_test().backtest_data(['삼성전자','LG전자'],[0.1,0.1],'2020-01-01', '2021-01-02',10000000,6, 'monthly', 'gmv') | ||
590 | x = data['pfo_return'][0]['Date'] | 599 | x = data['pfo_return'][0]['Date'] |
591 | y = data['pfo_return'][0]['acc_return ratio'] | 600 | y = data['pfo_return'][0]['acc_return ratio'] |
592 | y2 = data['bench'][0]['KOSPI_acc_return'] | 601 | y2 = data['bench'][0]['KOSPI_acc_return'] |
... | @@ -610,6 +619,6 @@ plt.ylabel('Return') | ... | @@ -610,6 +619,6 @@ plt.ylabel('Return') |
610 | plt.title('result') | 619 | plt.title('result') |
611 | plt.legend() | 620 | plt.legend() |
612 | plt.show() | 621 | plt.show() |
613 | -plt.savefig("./src/test.png", dpi = 400) | 622 | +plt.savefig("./src/test.png", dpi = 100) |
614 | print("end") | 623 | print("end") |
615 | 624 | ... | ... |
-
Please register or login to post a comment