-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkis_domstk.py
More file actions
1335 lines (1091 loc) · 75.5 KB
/
kis_domstk.py
File metadata and controls
1335 lines (1091 loc) · 75.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 15 16:57:19 2023
@author: Administrator
"""
import kis_auth as kis
import time, copy
import requests
import json
import pandas as pd
from collections import namedtuple
from datetime import datetime
from pandas import DataFrame
#====| [국내주식] 주문/계좌 |============================================================================================================================
##############################################################################################
# [국내주식] 주문/계좌 > 주식주문(현금)[v1_국내주식-001]
##############################################################################################
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output API 문서 참조 등
def get_order_cash(ord_dv="", itm_no="", qty=0, unpr=0, tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식주문(현금)
url = '/uapi/domestic-stock/v1/trading/order-cash'
if ord_dv == "buy":
tr_id = "VTTC0802U" # 주식 현금 매수 주문 [실제투자] TTTC0802U : 주식 현금 매수 주문
elif ord_dv == "sell":
tr_id = "VTTC0801U" # 주식 현금 매도 주문 [실제투자] TTTC0801U : 주식 현금 매도 주문
else:
print("매수현금/매도현금 구분 확인요망!!!")
return None
if itm_no == "":
print("주문종목번호 확인요망!!!")
return None
if qty == 0:
print("주문수량 확인요망!!!")
return None
if unpr == 0:
print("주문단가 확인요망!!!")
return None
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"PDNO": itm_no, # 종목코드(6자리) ETN의 경우, Q로 시작 (EX. Q500001)
"ORD_DVSN": "00", # 주문구분 00:지정가, 01:시장가, 02:조건부지정가 나머지주문구분 API 문서 참조
"ORD_QTY": str(int(qty)), # 주문주식수
"ORD_UNPR": str(int(unpr)) # 주문단가
}
res = kis._url_fetch(url, tr_id, tr_cont, params, postFlag=True)
if str(res.getBody().rt_cd) == "0":
current_data = pd.DataFrame(res.getBody().output, index=[0])
dataframe = current_data
else:
print(res.getBody().msg_cd + "," + res.getBody().msg1)
#print(res.getErrorCode() + "," + res.getErrorMessage())
dataframe = None
return dataframe
##############################################################################################
# [국내주식] 주문/계좌 > 주식주문(정정취소)[v1_국내주식-003]
##############################################################################################
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output API 문서 참조 등
def get_order_rvsecncl(ord_orgno="", orgn_odno="", ord_dvsn="", rvse_cncl_dvsn_cd="", ord_qty=0, ord_unpr=0, qty_all_ord_yn="", tr_cont="", dataframe=None): # 국내주식주문 > 주식주문(정정취소)
url = '/uapi/domestic-stock/v1/trading/order-rvsecncl'
tr_id = "TTTC0803U" # 주식 정정 취소 주문 [모의투자] VTTC0803U : 주식 정정 취소 주문
if ord_orgno == "":
print("주문조직번호 확인요망!!!")
return None
if orgn_odno == "":
print("원주문번호 확인요망!!!")
return None
if ord_dvsn == "":
print("주문구분 확인요망!!!")
return None
if not rvse_cncl_dvsn_cd in ["01","02"]:
print("정정취소구분코드 확인요망!!!") # 정정:01. 취소:02
return None
if qty_all_ord_yn == "Y" and ord_qty > 0:
print("잔량전부 취소/정정주문인 경우 주문수량 0 처리!!!")
ord_qty = 0
if qty_all_ord_yn == "N" and ord_qty == 0:
print("취소/정정 수량 확인요망!!!")
return None
if rvse_cncl_dvsn_cd == "01" and ord_unpr == 0:
print("주문단가 확인요망!!!")
return None
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"KRX_FWDG_ORD_ORGNO": ord_orgno, # 주문조직번호 API output의 odno(주문번호) 값 입력주문시 한국투자증권 시스템에서 채번된 주문조직번호
"ORGN_ODNO": orgn_odno, # 주식일별주문체결조회 API output의 odno(주문번호) 값 입력주문시 한국투자증권 시스템에서 채번된 주문번호
"ORD_DVSN": ord_dvsn, # 주문구분 00:지정가, 01:시장가, 02:조건부지정가 나머지주문구분 API 문서 참조
"RVSE_CNCL_DVSN_CD": rvse_cncl_dvsn_cd, # 정정 : 01, 취소 : 02
"ORD_QTY": str(int(ord_qty)), # 주문주식수 [잔량전부 취소/정정주문] "0" 설정 ( QTY_ALL_ORD_YN=Y 설정 ) [잔량일부 취소/정정주문] 취소/정정 수량
"ORD_UNPR": str(int(ord_unpr)), # 주문단가 [정정] 정정주문 1주당 가격 [취소] "0" 설정
"QTY_ALL_ORD_YN": qty_all_ord_yn # 잔량전부주문여부 [정정/취소] Y : 잔량전부, N : 잔량일부
}
res = kis._url_fetch(url, tr_id, tr_cont, params, postFlag=True)
if str(res.getBody().rt_cd) == "0":
current_data = pd.DataFrame(res.getBody().output, index=[0])
dataframe = current_data
else:
print(res.getBody().msg_cd + "," + res.getBody().msg1)
#print(res.getErrorCode() + "," + res.getErrorMessage())
dataframe = None
return dataframe
##############################################################################################
# [국내주식] 주문/계좌 > 주식정정취소가능주문조회[v1_국내주식-004]
##############################################################################################
# 국내주식주문 > 주식정정취소가능주문조회 List를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output API 문서 참조 등
def get_inquire_psbl_rvsecncl_lst(tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식정정취소가능주문조회
url = '/uapi/domestic-stock/v1/trading/inquire-psbl-rvsecncl'
tr_id = "TTTC8036R"
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"INQR_DVSN_1": "1", # 조회구분1(정렬순서) 0:조회순서, 1:주문순, 2:종목순
"INQR_DVSN_2": "0", # 조회구분2 0:전체, 1:매도, 2:매수
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
# Assuming 'output2' is a dictionary that you want to convert to a DataFrame
# current_data = res.getBody().output # getBody() kis_auth.py 존재
current_data = pd.DataFrame(res.getBody().output)
# Append to the existing DataFrame if it exists
if dataframe is not None:
dataframe = pd.concat([dataframe, current_data], ignore_index=True) #
else:
dataframe = current_data
tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk100, res.getBody().ctx_area_nk100 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재
# print(tr_cont, FK100, NK100)
if tr_cont == "D" or tr_cont == "E": # 마지막 페이지
print("The End")
current_data = pd.DataFrame(dataframe)
dataframe = current_data
return dataframe
elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리
print('Call Next')
return get_inquire_psbl_rvsecncl_lst("N", FK100, NK100, dataframe)
##############################################################################################
# [국내주식] 주문/계좌 > 주식일별주문체결조회
##############################################################################################
# 국내주식주문 > 주식일별주문체결조회 Object를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# dv 기간구분 - 01:3개월 이내(TTTC8001R), 02:3개월 이전(CTSC9115R)
# Output: DataFrame (Option) output2 API 문서 참조 등
def get_inquire_daily_ccld_obj(dv="01", inqr_strt_dt=None, inqr_end_dt=None, tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식일별주문체결조회
url = '/uapi/domestic-stock/v1/trading/inquire-daily-ccld'
if dv == "01":
tr_id = "TTTC8001R" # 01:3개월 이내 국내주식체결내역 (월단위 ex: 2024.04.25 이면 2024.01월~04월조회)
else:
tr_id = "CTSC9115R" # 02:3개월 이전 국내주식체결내역 (월단위 ex: 2024.04.25 이면 2024.01월이전)
if inqr_strt_dt is None:
inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자
if inqr_end_dt is None:
inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"INQR_STRT_DT": inqr_strt_dt, # 조회시작일자
"INQR_END_DT": inqr_end_dt, # 조회종료일자
"SLL_BUY_DVSN_CD": "00", # 매도매수구분코드 00:전체 01:매도, 02:매수
"INQR_DVSN": "01", # 조회구분(정렬순서) 00:역순, 01:정순
"PDNO": "", # 종목번호(6자리)
"CCLD_DVSN": "00", # 체결구분 00:전체, 01:체결, 02:미체결
"ORD_GNO_BRNO": "", # 사용안함
"ODNO": "", # 주문번호
"INQR_DVSN_3": "00", # 조회구분3 00:전체, 01:현금, 02:융자, 03:대출, 04:대주
"INQR_DVSN_1": "0", # 조회구분1 공란 : 전체, 1 : ELW, 2 : 프리보드
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
# Assuming 'output2' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output2, index=[0])
dataframe = current_data
return dataframe
# 주식일별주문체결조회 종목별 List를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# dv 기간구분 - 01:3개월 이내(TTTC8001R), 02:3개월 이전(CTSC9115R)
# Output: DataFrame (Option) output1 API 문서 참조 등
def get_inquire_daily_ccld_lst(dv="01", ccld_dvsn="00", inqr_strt_dt="", inqr_end_dt="", tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식일별주문체결조회
url = '/uapi/domestic-stock/v1/trading/inquire-daily-ccld'
if dv == "01":
tr_id = "TTTC8001R" # 01:3개월 이내 국내주식체결내역 (월단위 ex: 2024.04.25 이면 2024.01월~04월조회)
else:
tr_id = "CTSC9115R" # 02:3개월 이전 국내주식체결내역 (월단위 ex: 2024.04.25 이면 2024.01월이전)
if inqr_strt_dt == "":
inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자
if inqr_end_dt == "":
inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"INQR_STRT_DT": inqr_strt_dt, # 조회시작일자
"INQR_END_DT": inqr_end_dt, # 조회종료일자
"SLL_BUY_DVSN_CD": "00", # 매도매수구분코드 00:전체 01:매도, 02:매수
"INQR_DVSN": "01", # 조회구분(정렬순서) 00:역순, 01:정순
"PDNO": "", # 종목번호(6자리)
"CCLD_DVSN": ccld_dvsn, #체결구분 00:전체, 01:체결, 02:미체결
"ORD_GNO_BRNO": "", # 사용안함
"ODNO": "", #주문번호
"INQR_DVSN_3": "00", # 조회구분3 00:전체, 01:현금, 02:융자, 03:대출, 04:대주
"INQR_DVSN_1": "", # 조회구분1 공란 : 전체, 1 : ELW, 2 : 프리보드
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출, kis_auth.py에 존재
# Assuming 'output1' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output1)
# Append to the existing DataFrame if it exists
if dataframe is not None:
dataframe = pd.concat([dataframe, current_data], ignore_index=True) #
else:
dataframe = current_data
tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk100, res.getBody().ctx_area_nk100 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재
# print(dv, tr_cont, FK100, NK100)
if tr_cont == "D" or tr_cont == "E":
print("The End")
# 종목코드(PDNO)별로 데이터를 그룹화하여 출력
if not dataframe.empty:
try:
grouped_data = dataframe.groupby('PDNO') # 'PDNO'는 종목 번호 열 이름입니다.
for code, group in grouped_data:
print(f"\n종목 코드: {code}")
print(group)
except KeyError as e:
print(f"KeyError: {e} - The column for grouping does not exist.")
else:
print("No data available to group.")
return dataframe
elif tr_cont == "F" or tr_cont == "M":
print('Call Next')
time.sleep(1) # 초당 호출 제한 방지
return get_inquire_daily_ccld_lst(dv, ccld_dvsn ,inqr_strt_dt, inqr_end_dt, "N", FK100, NK100, dataframe)
##############################################################################################
# [국내주식] 주문/계좌 > 주식잔고조회(현재잔고)
##############################################################################################
# 주식계좌잔고 Object를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output2 - 예수금총금액, 익일정산금액, 가수도정산금액, 전일매수금액, 금일매수금액, 총평가금액... 등
def get_inquire_balance_obj(tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식잔고조회(현재잔고)
url = '/uapi/domestic-stock/v1/trading/inquire-balance'
tr_id = "TTTC8434R"
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"AFHR_FLPR_YN": "N", # 시간외단일가여부 Y:시간외단일가
"OFL_YN": "", #오프라인여부 사용안함
"INQR_DVSN": "00", # 00 : 전체
"UNPR_DVSN": "01", # 단가구분 01:기본값
"FUND_STTL_ICLD_YN": "N", # 펀드결제분포함여부 N:포함하지않음
"FNCG_AMT_AUTO_RDPT_YN": "N",
"PRCS_DVSN": "00", # 00 : 전일매매포함, 01 : 전일매매미포함
#"COST_ICLD_YN": "N",
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
# Assuming 'output2' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output2) # getBody() kis_auth.py 존재
dataframe = current_data
return dataframe
# 주식계좌잔고 종목별 List를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output2 - 종목번호, 상품명(종목명), 매매구분명(매수매도구분), 전일매수수량 ... 등
def get_inquire_balance_lst(tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식잔고조회(현재종목별 잔고)
url = '/uapi/domestic-stock/v1/trading/inquire-balance'
tr_id = "TTTC8434R"
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"AFHR_FLPR_YN": "N", # 시간외단일가여부 Y:시간외단일가
"OFL_YN": "", #오프라인여부 사용안함
"INQR_DVSN": "00", # 00 : 전체
"UNPR_DVSN": "01", # 단가구분 01:기본값
"FUND_STTL_ICLD_YN": "N", # 펀드결제분포함여부 N:포함하지않음
"FNCG_AMT_AUTO_RDPT_YN": "N",
"PRCS_DVSN": "00", # 00 : 전일매매포함, 01 : 전일매매미포함
#"COST_ICLD_YN": "N",
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출, kis_auth.py에 존재
# Assuming 'output1' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output1)
# Append to the existing DataFrame if it exists
if dataframe is not None:
dataframe = pd.concat([dataframe, current_data], ignore_index=True) #
else:
dataframe = current_data
tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk100, res.getBody().ctx_area_nk100 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재
print(tr_cont, FK100, NK100)
if tr_cont == "D" or tr_cont == "E": # 마지막 페이지
print("The End")
return dataframe
elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리
print('Call Next')
return get_inquire_balance_lst("N", FK100, NK100, dataframe)
##############################################################################################
# [국내주식] 주문/계좌 > 매수가능조회
##############################################################################################
# 국내주식주문 > 매수가능조회[v1_국내주식-007] List를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output2 -
def get_inquire_psbl_order(pdno="", ord_unpr=0, tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 매수가능조회
url = '/uapi/domestic-stock/v1/trading/inquire-psbl-order'
tr_id = "TTTC8908R"
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"PDNO": pdno, # 상품번호
"ORD_UNPR": ord_unpr, # 주문단가 1주당 가격 ※ 시장가(ORD_DVSN:01)로 조회 시, 공란으로 입력
"ORD_DVSN": "00", # 주문구분 공란 시, 매수수량 없이 매수금액만 조회됨 00 : 지정가,01 : 시장가,02 : 조건부지정가,03 : 최유리지정가
"CMA_EVLU_AMT_ICLD_YN": "N", # CMA평가금액포함여부 Y : 포함, N : 포함하지 않음
"OVRS_ICLD_YN": "Y" # 해외포함여부 Y : 포함, N : 포함하지 않음
}
res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출, kis_auth.py에 존재
# print(res.getBody())
if res.isOK():
# API 응답의 output 속성이 스칼라 값인지 확인
output_data = res.getBody().output
if not isinstance(output_data, list):
# 스칼라 값이면 리스트로 감싸서 반환
output_data = [output_data]
# DataFrame 생성 시 index 매개변수를 추가하여 스칼라 값일 경우 처리
# tdf = pd.DataFrame(output_data, index=[0])
#cf1 = ['ord_psbl_cash', 'ruse_psbl_amt', 'fund_rpch_chgs', 'psbl_qty_calc_unpr', 'nrcvb_buy_amt', 'nrcvb_buy_qty', 'max_buy_amt', 'max_buy_qty', 'cma_evlu_amt', 'ovrs_re_use_amt_wcrc', 'ord_psbl_frcr_amt_wcrc']
#cf2 = ['주문가능현금', '주문가능대용', '재사용가능금액', '펀드환매대금', '가능수량계산단가', '미수없는매수금액', '미수없는매수수량', '최대매수금액', '최대매수수량', 'CMA평가금액', '해외재사용금액원화', '주문가능외화금액원화']
#tdf = tdf[cf1]
#ren_dict = dict(zip(cf1, cf2))
# return tdf.rename(columns=ren_dict)
# DataFrame 생성 시 index 매개변수를 추가하여 스칼라 값일 경우 처리
current_data = pd.DataFrame(output_data, index=[0])
return current_data
else:
res.printError()
return pd.DataFrame()
##############################################################################################
# [국내주식] 주문/계좌 > 주식예약주문[v1_국내주식-017]
##############################################################################################
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output API 문서 참조 등
def get_order_resv(ord_dv="", itm_no="", qty=0, unpr=0, ord_dvsn_cd="", tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식주문(현금)
url = '/uapi/domestic-stock/v1/trading/order-resv'
tr_id = "CTSC0008U" # 국내예약매수입력, 주문예약매도입력
if ord_dv == "buy":
sll_buy_dvsn_cd = "02" # 주식 예약 매수 주문
elif ord_dv == "sell":
sll_buy_dvsn_cd = "01" # 주식 예약 매도 주문
else:
print("매도매수구분코드 확인요망!!!")
return None
if itm_no == "":
print("주문종목번호 확인요망!!!")
return None
if qty == 0:
print("주문수량 확인요망!!!")
return None
if unpr == 0:
print("주문단가 확인요망!!!")
return None
if ord_dvsn_cd == "":
print("주문구분코드 확인요망!!!")
return None
if unpr == 0:
print("주문단가 확인요망!!!")
return None
ord_objt_cbcl_dvsn_cd = "10" # [매도매수구분코드 01:매도/02:매수시 사용] 10 : 현금 이 아닌경우는 API문서 참조
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"PDNO": itm_no, # 종목코드(6자리) ETN의 경우, Q로 시작 (EX. Q500001)
"ORD_QTY": str(int(qty)), # 주문주식수
"ORD_UNPR": str(int(unpr)), # 주문단가
"SLL_BUY_DVSN_CD": sll_buy_dvsn_cd, # 매도매수구분코드 01 : 매도, 02 : 매수
"ORD_DVSN_CD": "00", # 주문구분 00:지정가, 01:시장가, 02:조건부지정가, 05 : 장전 시간외
"ORD_OBJT_CBLC_DVSN_CD": ord_objt_cbcl_dvsn_cd, # [매도매수구분코드 01:매도/02:매수시 사용] 10 : 현금
# [매도매수구분코드 01:매도시 사용] 12:주식담보대출, 14:대여상환, 21:자기융자신규, 22:유통대주신규, 23:유통융자신규,
# 24:자기대주신규, 25:자기융자상환, 26:유통대주상환, 27:유통융자상환, 28:자기대주상환
"RSVN_ORD_END_DT": "" # 예약주문종료일자 * (YYYYMMDD) 현재 일자보다 이후로 설정해야 함
# * RSVN_ORD_END_DT(예약주문종료일자)를 안 넣으면 다음날 주문처리되고 예약주문은 종료됨
# * RSVN_ORD_END_DT(예약주문종료일자)는 익영업일부터 달력일 기준으로 공휴일 포함하여 최대 30일이 되는 일자까지 입력 가능
}
res = kis._url_fetch(url, tr_id, tr_cont, params, postFlag=True)
if str(res.getBody().rt_cd) == "0":
current_data = res.getBody().output # getBody() kis_auth.py 존재
dataframe = current_data
else:
print(res.getBody().msg_cd + "," + res.getBody().msg1)
#print(res.getErrorCode() + "," + res.getErrorMessage())
dataframe = None
return dataframe
##############################################################################################
# [국내주식] 주문/계좌 > 주식예약주문취소[v1_국내주식-018,019]
##############################################################################################
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output API 문서 참조 등
def get_order_resv_cncl(rsvn_ord_seq="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 주식예약주문취소
url = '/uapi/domestic-stock/v1/trading/order-resv-rvsecncl'
tr_id = "CTSC0009U" # 국내주식예약 취소주문
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"RSVN_ORD_SEQ": str(int(rsvn_ord_seq)) # 예약주문순번 [정정/취소]
}
res = kis._url_fetch(url, tr_id, tr_cont, params, postFlag=True)
if str(res.getBody().rt_cd) == "0":
current_data = res.getBody().output # getBody() kis_auth.py 존재
dataframe = current_data
else:
print(res.getBody().msg_cd + "," + res.getBody().msg1)
#print(res.getErrorCode() + "," + res.getErrorMessage())
dataframe = None
return dataframe
##############################################################################################
# [국내주식] 주문/계좌 > 주식예약주문정정[v1_국내주식-018,019]
# get_order_resv_rvse(rsvn_ord_seq="", pdno="", ord_qty=0, ord_unpr=0, ord_dvsn="", sll_buy_dvsn_cd=""): # 국내주식주문 > 주식예약주문정정취소
##############################################################################################
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output API 문서 참조 등
def get_order_resv_rvse(pdno="", ord_qty=0, ord_unpr=0, sll_buy_dvsn_cd="", ord_dvsn="", ord_objt_cblc_dvsn_cd="",
rsvn_ord_seq="", rsvn_ord_orgno="", rsvn_ord_ord_dt="", tr_cont="", FK100="", NK100="", dataframe=None ): # 국내주식주문 > 주식예약주문정정취소
url = '/uapi/domestic-stock/v1/trading/order-resv-rvsecncl'
tr_id = "CTSC0013U" # 국내주식예약정정주문 * 모의투자 사용 불가
if ord_qty == 0:
print("주문주식수 확인요망!!!") #
return None
if ord_unpr == 0:
print("주문단가 확인요망!!!") # 정정] 1주당 가격 * 장전 시간외, 시장가의 경우 1주당 가격을 공란으로 비우지 않음 "0"으로 입력 권고
return None
if sll_buy_dvsn_cd == "":
print("매수매도구분코드 확인요망!!!") # [정정] 01 : 매도 02 : 매수
return None
if ord_dvsn == "":
print("주문구분코드 확인요망!!!") # [정정] 00 : 지정가, 01 : 시장가, 02 : 조건부지정가, 05 : 장전 시간외
return None
ord_objt_cblc_dvsn_cd = "10" # 주문대상잔고구분코드 기본값 10 : 현금으로 셋팅
#if ord_objt_cblc_dvsn_cd == "":
# print("주문대상잔고구분코드!!!") # 10 : 현금, 12 : 주식담보대출, 14 : 대여상환, 21 : 자기융자신규
# return None
if rsvn_ord_seq == "":
print("예약주문번호 확인요망(rsvn_ord_seq)!!!")
return None
print(rsvn_ord_seq)
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"PDNO": pdno, # 종목코드(6자리)
"ORD_QTY": str(int(ord_qty)), # 주문주식수 [잔량전부 취소/정정주문] "0" 설정 ( QTY_ALL_ORD_YN=Y 설정 ) [잔량일부 취소/정정주문] 취소/정정 수량
"ORD_UNPR": str(int(ord_unpr)), # 주문단가 [정정] 1주당 가격 * 장전 시간외, 시장가의 경우 1주당 가격을 공란으로 비우지 않음 "0"으로 입력 권고
"SLL_BUY_DVSN_CD": sll_buy_dvsn_cd, # 매도매수구분코드 [정정] 01 : 매도, 02 : 매수
"ORD_DVSN_CD": ord_dvsn, # 주문구분 [정정]00 : 지정가, 01 : 시장가, 02 : 조건부지정가, 05 : 장전 시간외
"ORD_OBJT_CBLC_DVSN_CD": ord_objt_cblc_dvsn_cd, # 주문대상잔고구분코드 [정정]10 : 현금, 12 : 주식담보대출, 14 : 대여상환, 21 : 자기융자신규 나머지는 API문서 참조
"LOAN_DT": "", # 대출일자 [정정] 입력필수아님
"RSVN_ORD_END_DT": "", # 예약주문종료일자 [정정] 입력필수아님
"CTAL_TLNO": "", # 연락전화번호 [정정] 입력필수아님
"RSVN_ORD_SEQ": str(int(rsvn_ord_seq)), # 예약주문순번 [정정/취소] 입력필수
"RSVN_ORD_ORGNO": "", # 예약주문조직번호 [정정/취소] 입력불필요
"RSVN_ORD_ORD_DT": "" # 예약주문주문일자 [정정/취소] 입력불필요
}
res = kis._url_fetch(url, tr_id, tr_cont, params, postFlag=True)
if str(res.getBody().rt_cd) == "0":
current_data = res.getBody().output # getBody() kis_auth.py 존재
print(res.getBody().msg_cd + "," + res.getBody().msg1)
dataframe = current_data
else:
print(res.getBody().msg_cd + "," + res.getBody().msg1)
#print(res.getErrorCode() + "," + res.getErrorMessage())
dataframe = None
return dataframe
##############################################################################################
# [국내주식] 주문/계좌 > 주식예약주문조회[v1_국내주식-020]
##############################################################################################
# [국내주식] 주문/계좌 > 주식예약주문조회[v1_국내주식-020] List를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output2 -
def get_order_resv_ccnl(inqr_strt_dt=None, inqr_end_dt=None, ord_seq=0, tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 매수가능조회
url = '/uapi/domestic-stock/v1/trading/order-resv-ccnl'
tr_id = "CTSC0004R"
if inqr_strt_dt is None:
inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자
if inqr_end_dt is None:
inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자
params = {
"RSVN_ORD_ORD_DT": inqr_strt_dt, # 예약주문시작일자
"RSVN_ORD_END_DT": inqr_end_dt, # 예약주문종료일자
"RSVN_ORD_SEQ": ord_seq, # 예약주문순번
"TMNL_MDIA_KIND_CD": "00", # 단말매체종류코드
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"PRCS_DVSN_CD": "0", # 처리구분코드
"CNCL_YN": "", # 오프라인여부 사용안함
"PDNO": "", # 종목코드(6자리) (공백 입력 시 전체 조회)
"SLL_BUY_DVSN_CD": "", # 매도매수구분코드
"CTX_AREA_FK200": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK200 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK200": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK200 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출, kis_auth.py에 존재
# Assuming 'output1' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output)
# Append to the existing DataFrame if it exists
if dataframe is not None:
dataframe = pd.concat([dataframe, current_data], ignore_index=True) #
else:
dataframe = current_data
tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk200, res.getBody().ctx_area_nk200 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재
print(tr_cont, FK100, NK100)
if tr_cont == "D" or tr_cont == "E": # 마지막 페이지
print("The End")
return dataframe
elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리
print('Call Next')
return get_order_resv_ccnl(inqr_strt_dt, inqr_end_dt, ord_seq, "N", FK100, NK100, dataframe)
##############################################################################################
# [국내주식] 주문/계좌 > 주식잔고조회_실현손익
##############################################################################################
# 주식잔고조회_실현손익 object DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output2 - 종목번호(상품번호), 종목명(상품명), 매매구분명, 전일매수수량, 전일매도수량, 금일매수수량... 등
def get_inquire_balance_rlz_pl_obj(tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 주식잔고조회_실현손익 (잔고조회 Output2)
url = '/uapi/domestic-stock/v1/trading/inquire-balance-rlz-pl'
tr_id = "TTTC8494R"
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"AFHR_FLPR_YN": "N", # 시간외단일가여부 Y:시간외단일가
"OFL_YN": "", # 오프라인여부 사용안함
"INQR_DVSN": "00", # 00 : 전체
"UNPR_DVSN": "01", # 단가구분 01:기본값
"FUND_STTL_ICLD_YN": "N", # 펀드결제분포함여부 N:포함하지않음
"FNCG_AMT_AUTO_RDPT_YN": "N",
"PRCS_DVSN": "00", # 00 : 전일매매포함, 01 : 전일매매미포함
"COST_ICLD_YN": "N",
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
print(res.getBody()) # 오류 원인 확인 필요시 사용
# Assuming 'Output2' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output2) # getBody() kis_auth.py 존재
dataframe = current_data
return dataframe
# 주식잔고조회_실현손익 list DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output2 - 예수금총금액, 익일정산금액, 가수도정산금액, CMA평가금액, 전일매수금액, 금일매수금액 ... 등
def get_inquire_balance_rlz_pl_lst(tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 주식잔고조회_실현손익 (보유주식내역 Output2)
url = '/uapi/domestic-stock/v1/trading/inquire-balance-rlz-pl'
tr_id = "TTTC8494R"
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"AFHR_FLPR_YN": "N", # 시간외단일가여부 Y:시간외단일가
"OFL_YN": "", # 오프라인여부 사용안함
"INQR_DVSN": "00", # 00 : 전체
"UNPR_DVSN": "01", # 단가구분 01:기본값
"FUND_STTL_ICLD_YN": "N", # 펀드결제분포함여부 N:포함하지않음
"FNCG_AMT_AUTO_RDPT_YN": "N",
"PRCS_DVSN": "00", # 00 : 전일매매포함, 01 : 전일매매미포함
"COST_ICLD_YN": "N",
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출, kis_auth.py에 존재
# print(res.getBody()) # 오류 원인 확인 필요시 사용
# Assuming 'output1' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output1)
# Append to the existing DataFrame if it exists
if dataframe is not None:
dataframe = pd.concat([dataframe, current_data], ignore_index=True) #
else:
dataframe = current_data
tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk100, res.getBody().ctx_area_nk100 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재
print(tr_cont, FK100, NK100)
if tr_cont == "D" or tr_cont == "E": # 마지막 페이지
print("The End")
return dataframe
elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리
print('Call Next')
return get_inquire_balance_rlz_pl_lst("N", FK100, NK100, dataframe)
##############################################################################################
# [국내주식] 주문/계좌 > 신용매수가능조회
##############################################################################################
# 신용매수가능조회 object DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output1 - 주문가능현금, 주문가능대용, 재사용가능금액, 펀드환매대금, 가능수량계산단가, 미수없는매수금액... 등
def get_inquire_credit_psamount(pdno="", ord_unpr ="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 신용매수가능조회
url = '/uapi/domestic-stock/v1/trading/inquire-credit-psamount'
tr_id = "TTTC8909R"
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"PDNO": pdno, # 종목번호(상품번호)
"ORD_UNPR": "", # 주문단가 1주당 가격 * 장전 시간외, 장후 시간외, 시장가의 경우 1주당 가격을 공란으로 비우지 않음 "0"으로 입력 권고
"ORD_DVSN": "00", # 주문구분 00: 지정가
"CRDT_TYPE": "21", # 신용유형 "":기본값
"CMA_EVLU_AMT_ICLD_YN": "N", # CMA평가금액포함여부
"OVRS_ICLD_YN": "N" # 펀드결제분포함여부 N:포함하지않음
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
print(res.getBody()) # 오류 원인 확인 필요시 사용
# Assuming 'Output2' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output1) # getBody() kis_auth.py 존재
dataframe = current_data
return dataframe
##############################################################################################
# [국내주식] 주문/계좌 > 기간별매매손익현황조회
##############################################################################################
# 기간별매매손익현황조회 object DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output2 - 매도수량합계, 매도거래금액합계, 매도수수료합계, 매도제세금합계, 매도정산금액합계, 매수수량합계... 등
def get_inquire_period_trade_profit_obj(inqr_strt_dt=None, inqr_end_dt=None, tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 기간별매매손익현황내역 (output2)
url = '/uapi/domestic-stock/v1/trading/inquire-period-trade-profit'
tr_id = "TTTC8715R"
if inqr_strt_dt is None:
inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자
if inqr_end_dt is None:
inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"SORT_DVSN": "00", # 정렬구분
"PDNO": "", # 상품번호
"INQR_STRT_DT": inqr_strt_dt, # 조회시작일자
"INQR_END_DT": inqr_end_dt, # 조회종료일자
"CBLC_DVSN": "00", # 잔고구분
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
# print(res.getBody().output2) # 오류 원인 확인 필요시 사용
# Assuming 'Output2' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output2, index=[0]) # getBody() kis_auth.py 존재
dataframe = current_data
return dataframe
# 기간별매매손익현황조회 object DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output1 - 매매일자, 상품번호, 상품명, 매매구분명, 대출일자, 보유수량... 등
def get_inquire_period_trade_profit_lst(inqr_strt_dt=None, inqr_end_dt=None, tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 기간별매매손익현황조회 (output1)
url = '/uapi/domestic-stock/v1/trading/inquire-period-trade-profit'
tr_id = "TTTC8715R"
if inqr_strt_dt is None:
inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자
if inqr_end_dt is None:
inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"SORT_DVSN": "00", # 정렬구분
"PDNO": "", # 상품번호
"INQR_STRT_DT": inqr_strt_dt, # 조회시작일자
"INQR_END_DT": inqr_end_dt, # 조회종료일자
"CBLC_DVSN": "00", # 잔고구분
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출, kis_auth.py에 존재
# Assuming 'output1' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output1)
# Append to the existing DataFrame if it exists
if dataframe is not None:
dataframe = pd.concat([dataframe, current_data], ignore_index=True) #
else:
dataframe = current_data
tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk100, res.getBody().ctx_area_nk100 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재
print(tr_cont, FK100, NK100)
if tr_cont == "D" or tr_cont == "E": # 마지막 페이지
print("The End")
return dataframe
elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리
print('Call Next')
return get_inquire_period_trade_profit_lst(inqr_strt_dt, inqr_end_dt, "N", FK100, NK100, dataframe)
##############################################################################################
# [국내주식] 주문/계좌 > 기간별손익일별합산조회
##############################################################################################
# 기간별매매손익현황조회 object DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output2 - 매도수량합계, 매도거래금액합계, 매도수수료합계, 매도제세금합계, 매도정산금액합계, 매수수량합계... 등
def get_inquire_period_profit_obj(inqr_strt_dt=None, inqr_end_dt=None, tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 기간별손익일별합산조회 (output2)
url = '/uapi/domestic-stock/v1/trading/inquire-period-profit'
tr_id = "TTTC8708R"
if inqr_strt_dt is None:
inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자
if inqr_end_dt is None:
inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"INQR_DVSN": "00", # 조회구분
"SORT_DVSN": "00", # 정렬구분
"PDNO": "", # 상품번호
"INQR_STRT_DT": inqr_strt_dt, # 조회시작일자
"INQR_END_DT": inqr_end_dt, # 조회종료일자
"CBLC_DVSN": "00", # 잔고구분
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
# print(res.getBody().output2) # 오류 원인 확인 필요시 사용
# Assuming 'Output2' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output2, index=[0]) # getBody() kis_auth.py 존재
dataframe = current_data
return dataframe
# 기간별손익일별합산조회 object DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output1 - 매매일자, 상품번호, 상품명, 매매구분명, 대출일자, 보유수량... 등
def get_inquire_period_profit_lst(inqr_strt_dt=None, inqr_end_dt=None, tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 기간별손익일별합산조회 (output1)
url = '/uapi/domestic-stock/v1/trading/inquire-period-profit'
tr_id = "TTTC8708R"
if inqr_strt_dt is None:
inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자
if inqr_end_dt is None:
inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자
params = {
"CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리
"ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리
"INQR_DVSN": "00", # 조회구분
"SORT_DVSN": "00", # 정렬구분
"PDNO": "", # 상품번호
"INQR_STRT_DT": inqr_strt_dt, # 조회시작일자
"INQR_END_DT": inqr_end_dt, # 조회종료일자
"CBLC_DVSN": "00", # 잔고구분
"CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터)
"CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터)
}
res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출, kis_auth.py에 존재
# Assuming 'output1' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output1)
# Append to the existing DataFrame if it exists
if dataframe is not None:
dataframe = pd.concat([dataframe, current_data], ignore_index=True) #
else:
dataframe = current_data
tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk100, res.getBody().ctx_area_nk100 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재
print(tr_cont, FK100, NK100)
if tr_cont == "D" or tr_cont == "E": # 마지막 페이지
print("The End")
return dataframe
elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리
print('Call Next')
return get_inquire_period_profit_lst(inqr_strt_dt, inqr_end_dt, "N", FK100, NK100, dataframe)
#====| [국내주식] 기본시세 |============================================================================================================================
##############################################################################################
# [국내주식] 기본시세 > 주식현재가 시세
##############################################################################################
# 주식현재가 시세 Object를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output
def get_inquire_price(div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 시세
url = '/uapi/domestic-stock/v1/quotations/inquire-price'
tr_id = "FHKST01010100" # 주식현재가 시세
params = {
"FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW
"FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001)
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
# Assuming 'output' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output, index=[0]) # getBody() kis_auth.py 존재
dataframe = current_data
return dataframe
##############################################################################################
# [국내주식] 기본시세 > 주식현재가 체결 (최근체결 건 30건만 조회)
##############################################################################################
# 주식현재가 체결 Object를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output
def get_inquire_ccnl(div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 체결
url = '/uapi/domestic-stock/v1/quotations/inquire-ccnl'
tr_id = "FHKST01010300" # 주식현재가 체결
params = {
"FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW
"FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001)
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
# print(res.getBody()) # 오류 원인 확인 필요시 사용
# Assuming 'output' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output) # getBody() kis_auth.py 존재
dataframe = current_data
return dataframe
##############################################################################################
# [국내주식] 기본시세 > 주식현재가 일자별 (최근 30일만 조회)
# 주식현재가 일자별 API입니다. 일/주/월별 주가를 확인할 수 있으며 최근 30일(주,별)로 제한되어 있습니다.
##############################################################################################
# 주식현재가 일자별 Object를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output
def get_inquire_daily_price(div_code="J", itm_no="", period_code="D", adj_prc_code="1", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 일자별
url = '/uapi/domestic-stock/v1/quotations/inquire-daily-price'
tr_id = "FHKST01010400" # 주식현재가 일자별
params = {
"FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW
"FID_INPUT_ISCD": itm_no, # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001)
"FID_PERIOD_DIV_CODE": period_code, # 기간분류코드 D : (일)최근 30거래일, W : (주)최근 30주, M : (월)최근 30개월
"FID_ORG_ADJ_PRC": adj_prc_code # 0 : 수정주가반영, 1 : 수정주가미반영 * 수정주가는 액면분할/액면병합 등 권리 발생 시 과거 시세를 현재 주가에 맞게 보정한 가격
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
# print(res.getBody()) # 오류 원인 확인 필요시 사용
# Assuming 'output' is a dictionary that you want to convert to a DataFrame
current_data = pd.DataFrame(res.getBody().output) # getBody() kis_auth.py 존재
dataframe = current_data
return dataframe
##############################################################################################
# [국내주식] 기본시세 > 주식현재가 호가/예상체결
# 주식현재가 호가 예상체결 API입니다. 매수 매도 호가를 확인하실 수 있습니다. 실시간 데이터를 원하신다면 웹소켓 API를 활용하세요.
##############################################################################################
# 주식현재가 일자별 Object를 DataFrame 으로 반환
# Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조
# Output: DataFrame (Option) output
def get_inquire_asking_price_exp_ccn(output_dv='1', div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 호가/예상체결
url = '/uapi/domestic-stock/v1/quotations/inquire-asking-price-exp-ccn'
tr_id = "FHKST01010200" # 주식현재가 호가 예상체결
params = {
"FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW
"FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001)
}
res = kis._url_fetch(url, tr_id, tr_cont, params)
# print(res.getBody()) # 오류 원인 확인 필요시 사용
# Assuming 'output1' is a dictionary that you want to convert to a DataFrame
if output_dv == "1":
current_data = pd.DataFrame(res.getBody().output1, index=[0]) # 호가조회 * getBody() kis_auth.py 존재
else:
current_data = pd.DataFrame(res.getBody().output2, index=[0]) # 예상체결가조회
dataframe = current_data