라벨이 Python인 게시물 표시

주식 자동매매 시스템

파이썬을 이용한 주식 자동매매 시스템

이미지
파이썬을 이용한 주식 자동매매 시스템 INDEX 환경구축 키움증권 API - 연결테스트 키움증권 API - 계좌정보 조회 키움증권 API - 주문 키움증권 API - 종목정보 가져오기 포트폴리오 - 종목, 업종별 자산 포트폴리오 한국투자증권 API API reference 키움 OpenAPI+ 개발가이드 한국투자증권 OpenAPI 다운로드 및 가이드 Design https://www.design-seeds.com/in-nature/succulents/cacti-color-2/ https://create.piktochart.com/dashboard

[python] python string 문자열 함수 split, append, lower, replace

python string 문자열 함수 중 자주 사용되는 함수로 split(), append(), lower, replace() 이 있다. split() 문자열을 list로 나누어주는 함수이다. 문자열을 나누는 기준이되는 separator를 매개변수로 받는다. string.split(separator, maxsplit) tweets = "thank you welcoming ceremony it will always be remembered" def break_into_words(text): words = text.split(' ') return words print(break_into_words(tweets)) split()과 split(' ')의 차이 spllit()은 문자열 안에 공백이 여러개있거나, Tab, enter같은 공백도 다 하나로 처리해서 나누고, split(' ') 은 ' '안에 공백이 하나면, 공백 하나를 기준으로 문자열을 나누기 때문에 용도에 따라서 정확하게 사용해야 한다. append() list에 새로운 원소를 추가하기 위해 사용하는 함수이다.  tweets = ['a', 'is', 'back', 'and', 'we', 'are', 'coming', 'back'] def make_new_list(text): new_list = [] for i in range(len(text)): if text[i].startswith('b'): new_list.append(text[i]) return new_list new_list = make_

[LeetCode] Python 문제해결과정 - Best Time to Buy and Sell Stock II

날마다 주식의 가격을 prices 배열로 주고, 주식을 사고팔아서 얻을 수 있는 최대 이익을 구하는 문제다. python을 사용해서 3번의 시도 끝에 풀었으며, 접근 방법과 솔루션에 대해 소개한다. 연관 문제로 Best Time to Buy and Sell Stock 1~3 등이 있다. 다양한 접근방법으로 풀어볼 수 있어서 흥미로웠던 문제이다. 122. Best Time to Buy and Sell Stock II 문제 링크 Solution 바로가기   First Approach (5분) 문제 이해 문제를 명확히 하기 위한 과정(Q&A) 생각나는 알고리즘/자료구조 주식을 사고파는데, 최대 1주만 보유할 수 있다. price가 최소일 때 사야 할 것 같다는 생각이 들었다. 최소에서 팔 수 있을 때까지 날마다 diff profit을 저장해놓으면? DP를 적용해도 될 것 같은데 DP를 정확히 모르겠다. 합이 더 크면 더 큰 노드로 옮겨가고, 작아질 때 멈추고 하면 될 것 같은데, 각 node 들의 차이를 합해 나가는 방법으로도 가능할 것 같다.    First Solution(brute force) class Solution: def calculate(self, prices: List[int], start: int) -> int: max_profit = 0 max = 0 if start < len(prices): for s in range(start, len(prices)): for e in range(start+1, len(prices)): if prices[e] - prices[s] > 0:

[python] 문자열 함수 startswith() - 자연어 처리 2

아래 예제는 모두 string method를 import 해야 한다. import * from string startswith() 문자열의 접두사를 판별할 수 있는 함수 fruits = ['apple', 'banana', 'kiwi'] for i in range(len(fruits)): if fruits[i].startswith('k'): print(fruits[i]) >> kiwi startswith() 함수를 몰랐다면, 아래와 같이 구현이 가능하다. if fruits[i][0] == 'k': 하지만, 'ap'로 시작하는 단어와 같이 2 글자 이상인 경우는 이 함수를 사용하지 않고는 구현하기 어렵다. startswith() 함수를 사용하면 검색하려는 접두사의 길이 제한이 없고 여러 개의 접두사를 tuple을 사용해 검색할 수도 있다. 아래 예제에서는 'ap', 'k', 'c' 로 시작하는 문자를 출력한다. fruits = ['apple', 'banana', 'kiwi'] prefix = ('ap', 'k', 'c') for i in range(len(fruits)): if fruits[i].startswith(prefix): print(fruits[i]) >> apple >> kiwi 또한 시작하는 위치를 지정할 수도 있다. (끝도 지정가능) 아래는 @로 시작하는 문자열들 중 t로 시작하는 문자열을 찾기 위해 시작 위치를 1로 설정한 예입니다. influencer = ['@trump', '@musk', '@ellish'] prefix = ('t') for i in range(len

[python] 문자열 인덱싱과 슬라이싱 - 자연어 처리 1

이미지
문자열의 인덱싱과 슬라이싱 인덱싱 - Indexing syntax python에 있는 sequential type의 structure들은 인덱싱과 슬라이싱이 가능하다. 문자열도 그 중 하나이다. python은 0을 base로 인덱싱한다. 따라서, 문자열의 첫 문자가 index '0'이 된다. 문자열에 인덱스로 접근하는 방법은 아래와 같다. str = "abc123!" str[0] >> a str[6] >> ! str[7] str[len(str)] >> IndexError: string index out of range 다른 언어들과 마찬가지로 범위에 벗어날 경우 out of range는 error가 발생하기 때문에 마지막 index에 접근하기 위해서는 len(str) - 1 을 사용해야한다. 슬라이싱 - slicing syntax 문자열 슬라이싱(slicing) 방법은 str[ start : end : step ] 를 지정해주면 된다. start idx를 명시하지 않으면 0부터 시작한다. [:end:step] == [0:end:step] end idx를 명지하지 않으면 마지막 index, 즉 끝까지 가져온다. [0::step] == [0:last_idx:step] step 은 따로 명시하지 않으면 1씩 증가한다고 보면 된다. step을 사용하면 start:end 범위 내에서 각 n번째 요소를 가져와 사용할 수 있다. 아래 예시를 보자. str = "abc123!" # 문자열 처음부터 끝까지 str[:] str[0:7] str[:7] str[:len(str)] >> abc123! # step 2 씩 가져오기 str[::2] str[0:7:2] >> ac2! # 문자열 거꾸로 가져오기 str[::-1] >> !321cba 문자열의 마지막 index에 접근하기 위해서는 아래와 같이 N

[python] 데이터 가공에 꼭 필요한 특수 문자 처리 - string.punctuation

문자열 안에 있는 모든 특수문자 제거하는 방법 1. 문자열 모듈에서 특수문자를 처리를 돕는 메소드 string punctuation string.punctuation은 모든 구두점을 문자열로 return 해주는 함수다. 데이터 전처리에서 많이 사용되며,  이 메소드를 알지 못했을 때는 특수문자 처리에 번거로운 작업이 필요했다. 함수를 print 했을 때 나오는 아래 결과를 보면 이해하기 쉽다.  from string import punctuation result = punctuation print(result) output !"#$%&'()*+, -./:;<=>?@[\]^_`{|}~ ex) @와 #을 제외한 모든 특수문자를 문자열에서 제거하고 싶은 경우, 아래와 같이 사용하면 된다. # @와 #을 제외한 특수문자로 이루어진 문자열 symbols text = "~!#@!@$%%%@12234234" symbols = punctuation.replace('@', '').replace('#', '') for symbol in symbols: text = text.replace(symbol, '') 2. 문자열 모듈에서 whitespace 처리를 돕는 메소드 string whitespace string.whitespace로 사용할 수 있으며 space, tab, linefeed, return, formfeed, and vertical tab 과 같은 공백, 줄 바꿈 관련 세트를 return해준다. punctuation/whitespace 함수를 사용해 문자열을 간단하게 처리하는 예제 넷플릭스 트위터에서, #, @ 를 제외한 문자열 처리하기 아래와 같은 트위터들을 가져와서, preprocessing 하는 방법을 실습해본다. 나 이준호 좋아하네 #이상한변호사우영우 #ExtraordinaryAttorneyWoo #강태오 #KangTa

[python] 숫자-문자 원하는 형태로 Formatting 하는 방법

숫자와 문자 자유자재로 Formatting 하는 방법 Python에서 숫자를 원하는 형태로 출력하는 다양한 방식이 있다. String format 함수 String format 함수는 유용하고, 자유로운 형태로 변형이 가능하다는 장점이 있다. 하지만 단순하게 앞뒤로 0을 붙이거나 자릿수를 맞추는 경우에는 더 편한 방법이 있다. String zfill 함수 0으로 앞을 채워 자릿수를 맞추는 데 가장 최적화된 방법인 것 같다. '0' + str 아래 예제를 보면 이해하기 쉽다. python에서 숫자를 같은 자릿수의 string으로 표현하는 방법 Format numbers in python with leading zeros and fixed decimal places number = 3 num_str = str(number).zfill(2) num_str = '{:02d}'.format(number) num_str = '0' + str(number) if number < 10 else str(number) result >> 03 16진수 string으로 나타내는 방법 Format number in python with leading zeros and fixed hexa places number = 0xc num_str = '{:02X}'.format(number) num_str = '0' + str(hex(number))[2:] if number < 0xF else str(hex(number))[2:]  result >> 0C 16진수 0x로 시작하는 string으로 나타내는 방법 Format hexa number in python with leading '0x' number = 0xc num_str = '0x{:02X}'.format(number

파이썬을 이용한 주식 자동매매 시스템4 - 주문

파이썬을 이용한 주식 자동매매 시스템 - 주문 SendOrder 함수를 통해 주문을 전송하고, OnReceiveChejanData라는 이벤트핸들러에서 GetChejanData라는 메서드를 호출해 체결된 데이터를 얻어오면 된다. 주식 주문 Tr LONG SendOrder( BSTR sRQName, BSTR sScreenNo, BSTR sAccNo, LONG nOrderType, BSTR sCode, LONG nQty, LONG nPrice, BSTR sHogaGb, BSTR sOrgOrderNo) def send_order(self, rqname, screen_no, acc_no, order_type, code, quantity, price, hoga, order_no): self.dynamicCall("SendOrder(QString, QString, QString, int, QString, int, int, QString, QString)", [rqname, screen_no, acc_no, order_type, code, quantity, price, hoga, order_no]) 체결 이벤트 핸들러 OnReceiveChejanData에서는, 아래와 같은 입력값이 주어진다. sGubun – 체결구분 – 0: 주문체결통보, 1: 국내주식 잔고통보, 4: 파생상품 잔고통보 nItemCnt - 아이템갯수 sFidList – 데이터리스트 - 데이터 구분은 ‘;’ 이다. def _set_signal_slots(self): self.OnReceiveChejanData.connect(self._receive_chejan_data) def _receive_chejan_data(self, gubun, item_cnt, fid_list): print(gubun) print(self.get_chejan_data(9203))

파이썬을 이용한 주식 자동매매 시스템 3 - 계좌정보 조회

이미지
키움 API의 기본적인 통신 'CommRqData'라는 Method를 통해 데이터를 송신하고,  'OnReceiveTrData'를 통해 데이터를 받아와 처리하는 방식이다.  LONG CommRqData(BSTR sRQName, BSTR sTrCode, long nPrevNext, BSTR sScreenNo) sRQName – 사용자구분 명  sTrCode - Tran명 입력  nPrevNext - 0:조회, 2:연속  sScreenNo - 4자리의 화면번호  void OnReceiveTrData(LPCTSTR sScrNo, LPCTSTR sRQName, LPCTSTR sTrCode,LPCTSTR sRecordName, LPCTSTR sPreNext, LONG nDataLength, LPCTSTR sErrorCode, LPCTSTR sMessage, LPCTSTR sSplmMsg) sScrNo – 화면번호  sRQName – 사용자구분 명  sTrCode – Tran 명  sRecordName – Record 명  대부분의 TR 통신은 위 두개의 함수로 조회하고 받아볼 수 있다. 파이썬으로 구현하기 위해 이 전에 작성했던 KiwoomTrade class에 아래 함수들을 추가 했다. CommRqData def set_input_value(self, id, value): self.dynamicCall("SetInputValue(QString, QString)", id, value) def comm_rq_data(self, rqname, trcode, next, screen_no): self.dynamicCall("CommRqData(QString, QString, int, QString)", rqname, trcode, next, screen_no) self.tr_event_loop = QEventLoop() self.

파이썬을 이용한 주식 자동매매 시스템

이미지
파이썬을 이용한 주식 자동매매 시스템 INDEX 환경구축 키움증권 API - 연결테스트 키움증권 API - 계좌정보 조회 키움증권 API - 주문 키움증권 API - 종목정보 가져오기 포트폴리오 - 종목, 업종별 자산 포트폴리오 한국투자증권 API API reference 키움 OpenAPI+ 개발가이드 한국투자증권 OpenAPI 다운로드 및 가이드 Design https://www.design-seeds.com/in-nature/succulents/cacti-color-2/ https://create.piktochart.com/dashboard

파이썬을 이용한 주식 자동매매 시스템 2 - 연결테스트

이미지
연결, 로그인 테스트 먼저 키움API를 사용하여 HTS 시스템에 연결, 로그인하는 과정이 필요하다. * 설치해두었던 KOAStudioSA.exe 파일을 실행시켜 먼저 버전처리 작업을 해주어야 정상적으로 연결이된다. 로그인 자동화를 위해 작업표시줄에서 계좌비밀번호 저장을 눌러 자동로그인 설정을 해주어야 한다.  버전처리를 위해 일주일에 한번정도 수동 로그인을 해주어야 하는 것 같다. OCX방식의 API를 파이썬에서 사용하기 위해서는 PyQt5가 필요하다. pip install로 설치 후, 'QAxWidget' Class를 상속받아 만드는 방식이 가장 편리하다. 키움증권HTS 연결 테스트를 위한 가장 기본이되는 코드이다.  class KiwoomTrade(QAxWidget): def __init__(self): super().__init__() self._create_kiwoom_instance() self._set_signal_slots() def _create_kiwoom_instance(self): self.setControl("KHOPENAPI.KHOpenAPICtrl.1") def _set_signal_slots(self): self.OnEventConnect.connect(self._event_connect) self.OnReceiveTrData.connect(self._receive_tr_data) def comm_connect(self): self.dynamicCall("CommConnect()") self.login_event_loop = QEventLoop() self.login_event_loop.exec_() def _event_connect(self, err_code): if err_code == 0:

파이썬을 이용한 주식 자동매매 시스템 1 - 환경구축

이미지
준비단계 파이썬을 이용한 주식 자동매매 시스템 환경 구축을 위해서는 크게 파이썬과 증권사 API가 필요하다.  1. 파이썬 작업을 스케쥴링해서 자동으로 주식을 매수/매도 하도록 한다. 매수/매도하는 전략 또한 파이썬을 통해 구현한다. 2. 증권사 API 증권사에서 제공하는 API를 설치하여 python에서 로그인, 매수/매도 등 작업을 할 수 있도록 환경을 구축한다. 환경구축을 시작하기에 앞서, 증권사를 선택해야 한다. 증권사에서 제공하는 API는 크게 OCX, COM, DLL 방식 이 있는데 잘 정리된 글을 발견해 증권사 선택에 참고하면 좋을 것 같다.  파이썬으로 개발하기엔 COM 방식이 가장 편리한 것 같다. OCX 의 경우 PyQt5를 이용해야해서 복잡하다. 우선 대신증권계좌를 개설하기 귀찮아서 키움증권(OCX) 방식으로 개발을 시작하게 됐다. 파이썬, 증권사 API 설치 및 환경 설정 증권사 API 키움증권 파이썬 1. 파이썬 설치 3.8 (32bit)  Creon(대신투자증권)은 32bit 밖에 지원하지 않기 때문에, 32bit로 설치했다.  2. 파이썬 모듈 설치 pip install pywinauto pip install pandas 3. 참고한 코드 파이썬 주식 투자 자동화 - 조코딩 파이썬 증권 데이터 분석 github W/A - com/ocx 방식 키움증권용, 대신투자증권용 api를 전부 개발하려고 하다보니,  pywinauto와 PyQt5를 둘다 import해서 사용하고 있었는데, 그로인한 오류가 발생했다. QWindowsContext: OleInitialize() failed:  "COM error 0x80010106 RPC_E_CHANGED_MODE (Unknown error 0x080010106)" 내용만 보면, 발생 원인을 짐작하기 어려운데 두 모듈을 동시에 import하면 발생하는 error이다. 아래 내용을 참고 해서 수정하면 된다. https://swlock.blogspot.com/2020/07/q