asyncio로 비동기 처리하여 병렬처리 속도 높이기

반응형

파이썬은 기본적으로 동기 방식으로 동작하는 언어이지만, 파이썬 3.4에서 asyncio가 표준 라이브러리로 추가되고,

파이썬 3.5에서부터는 async/await 키워드가 문법으로 채택이 되면서, 파이썬도 이제 언어 자체적으로 비동기 프로그래밍이 가능해 졌다.

 

예를 들어, 다음과 같이 선언된 함수는 동기 함수입니다.

def do_sync(): 
     pass

기존 def 키워드 앞에 async 키워드까지 붙이면 이 함수는 비동기 처리되며, 이러한 비동기 함수를 파이썬에서는 코루틴(coroutine)이라고도 부릅니다.

async def do_async(): 
      pass

이러한 비동기 함수는 일반 동기 함수가 호출하듯이 호출하면 coroutine 객체가 리턴됩니다.

do_async() # <coroutine object do_async at 0x1038de710>

따라서 비동기 함수는 일반적으로 async로 선언된 다른 비동기 함수 내에서 await 키워드를 붙여서 호출해야 합니다.

async def main_async(): 
     await do_async()

async로 선언되지 않은 일반 동기 함수 내에서 비동기 함수를 호출하려면 asyncio 라이브러리의 이벤트 루프를 이용해야합니다.

loop = asyncio.get_event_loop() 
loop.run_until_complete(main_async()) 
loop.close()

파이썬 3.7 이상에서는 다음과 같이 한 줄로 간단히 비동기 함수를 호출 할 수도 있습니다.

asyncio.run(main_async())

 

실제 저의 프로그램에 구현하기(goldstock 프로그램 일부 발췌)

import asyncio

class Kiwoom(QAxWidget):
     def __init__(self):
          super().__init__()
          self.ui = SetupUI()
          self.realType = RealType()

          self.logging = Logging()
          self.slack = Slack() # 슬랙 동작

          #중간생략...

    def auto_AI_recommend_clicked(self):
          now = datetime.now()
          if self.ui.btnCdtResult_buy.isChecked():
               self.ai_recommend_timer_start()
          else:
               self.timer_ai_recommend.stop()
          return


     def ai_recommend_timer_start(self):
          self.timer_ai_recommend = QTimer()
          self.timer_ai_recommend.start(5 * 1000) # 5초 간격으로 
          self.timer_ai_recommend.timeout.connect(self.ai_recommend_click)

     def ai_recommend_click(self):

          market_status, decision_list = self.decide_to_autoTrading(stockCode)

          if market_status == "매수" or market_status == "강력매수":
               if self.ui.btnAutotrade.isChecked():
                    asyncio.run(self.decide_to_sell(1, stockCode))
                    asyncio.run(self.decide_to_sell(2, balance_detail_stockCode))

          else:
               if (market_status == "매도" or market_status == "강력매도") and stockCode in self.account_stock_dict:

                    if self.ui.btnAutotrade.isChecked():
                         asyncio.run(self.decide_to_sell(1, stockCode))
                         asyncio.run(self.decide_to_sell(2, balance_detail_stockCode))


     async def decide_to_sell(self, num, stockCode): 
          day_chart_data = {}
          minute_chart_data = {}
          week_chart_data = {}
          month_chart_data = {}
          recommInterval = str(self.ui.cbRecommInterval.currentText().replace(' ', ''))
          minute_chart_interval = str(self.ui.spinBox_minutes.value())


          market_status, decision_list = self.decide_to_autoTrading_condtion2(stockCode=stockCode)
          if market_status in ("매도", "강력매도"):
              self.time_to_trading(order_currency=stockCode, type="매도", market_status="매도", \
                    current_price=current_price, target_time=recommInterval, date=order_date, real_flag="R", \
                    decision_list=decision_list)

          elif market_status in ("매수", "강력매수"):
              self.time_to_trading(order_currency=stockCode, type="매수", market_status="매수", \
                    current_price=current_price, target_time=recommInterval, date=order_date, real_flag="R", \
                    decision_list=decision_list)

          else: # 관망
               pass
     def time_to_trading(self, order_currency="", type="", market_status="", target_units=0, current_price=0, \
               target_time="", date="", real_flag="", decision_list=""):
          if type in ("매도", "강력매도"): # 매도
               try:
                    self.sendOrder("신규매도", order_currency, "시장가", int(possible_quantity), int(current_price))
               except (ParameterTypeError, KiwoomProcessingError) as e:
                    self.showDialog('Critical', e)
                    return
               self.slack.notification(\
                    pretext="%s(%s) 시장가 매도주문 완료(로직No:%s)" % (stockName, order_currency, str_decision_list),
                    title="%s 주문수량: %s 현재가: %s" % (self.now.strftime("%Y-%m-%d %H:%M:%S"), possible_quantity, \
                            current_price),
                    text="https://finance.daum.net/chart/A%s" % order_currency)
          else:
               #매수주문
               try:
                    self.ui.pteLog.appendPlainText("%s(%s) (신규매수,시장가)주문전송" % (stockName, order_currency))
                    self.logging.logger.debug("%s(%s) (신규매수,시장가)주문전송" % (stockName, order_currency))
                    self.sendOrder("신규매수", order_currency, "시장가", int(target_units), int(current_price))
              except (ParameterTypeError, KiwoomProcessingError) as e:
                    self.showDialog('Critical', e)
                    self.ui.pteLog.appendPlainText("%s(%s) 매수주문 오류발생" % (stockName, order_currency))
                    self.logging.logger.debug("%s(%s) 매수주문 오류발생" % (stockName, order_currency))
                    return
          # 거래내역 DB저장
          self.insert_db_transaction_infos(self.not_account_stock_dict[self.orderNo]) # result

이 프로그램에 실제 구현하여 동시성 병렬프로그램 함수 처리속도가 배가 빨라졌습니다.

 

이 기능에 대한 설명은 하기 사이트를 참조하였습니다. 감사합니다.

https://www.daleseo.com/python-asyncio/

 

[파이썬] asyncio로 비동기 처리하기

Engineering Blog by Dale Seo

www.daleseo.com

 

반응형

댓글()

자동매매 프로그램 사용현황 유튜브 공지

가상화폐|2021. 8. 29. 19:57
반응형

안녕하세요?

 

유투브에 약 3시간동안의 가상화폐 자동매매 프로그램 사용 영상을 올렸습니다.

 

하기 유튜브 영상 참조하시기 바랍니다.

 

https://youtu.be/r0y3z8b71ps

 

반응형

댓글()

분석설계모델링-ERD

카테고리 없음|2021. 7. 4. 22:49
반응형

 

DB ERD 관계선(실선, 점선)과 기호

관계선의 종류

  • 실선(Identifying): 식별관계

      부모테이블의 PK가 자식테이블의 FK/PK가 되는 경우

      부모가 있어야 자식이 생기는 경우

      ex) Issue 테이블과 IssueComment 테이블이 있을 경우, IssueComment는 Issue가 존재해야지만 있을 수 있음

  • 점선(Non-Identifying): 비식별관계

      부모테이블의 PK가 자식테이블의 일반속성이 되는 경우

      부모가 없어도 자식이 생기는 경우

      ex) User 테이블과 Process가 있을 경우, User가 담당 프로세스가 있다고 하더라도, Process는 User없이도 존재할 수 있음

 

DB ERD 관계선(실선, 점선)과 기호에 대한 설명

DBA는 아니지만, 프로그램을 잘 만들기 위해서 완성된 ERD를 이해하고, 나아가 간단한 모델링은 직접 만들줄 알야한다고 생각한다. ERD를 이해하기 위한 첫 걸음이자 가장 중요하다 할 수있는 부분

eyecandyzero.tistory.com

 

개체가 강한 개체 타입을 갖는 경우(비 식별자적 관계)에는 점선, 약한 개체 타입(식별자적 관계)을 갖는 경우에는 실선으로 표시합니다. N쪽의 관계를 표현하기 위해서는 새발을 그려줍니다. o을 그려주는 것은 최소 참여가 0인 경우 즉 최소참여이고, |을 그려주는 것은 최소 참여가 1인 경우 즉 필수 참여인 경우입니다. 

직원이 특정 부서에 소속되어 있는 경우 그리고 직원이 부양가족이 있는 경우에 대한 ER다이어그램을 IE 표기법을 나타내면 다음과 같습니다.

직원은 반드시 부서에 소속되어야 하므로 비식별자적 관계 즉, 점선으로 이어져있어야 하며

부서에 직원이 없을 수도 있으므로 부서에 대응하는 직원에 o 표시를 넣어주고, 모든 직원은 부서에 포함되어야 하므로 | 을 그려줍니다.

그리고 직원은 부양가족이 있을 수도 있고 없을 수도 있으므로 대응하는 부양가족의 표시에 o를 넣어주지만 부양가족은 자신들을 부양해주는 사람(직원)이 반드시 있어야 하므로 대응하는 직원의 표시에 |를 넣어줍니다. 또한 부양가족은 직원이 없이 부양가족의 이름만으로는 식별이 불가능하므로 (직원번호, 이름)을 식별자로 사용하며 실선으로 표기합니다.

반응형

댓글()

여주 골프연습장 추천 모음

생활정보|2021. 5. 23. 19:49
반응형

https://goo.gl/maps/Fix6cPENhmNU7SdX8

 

Google에서 제공되는 SUJIN OH (OHSSU)님의 영재 Par3 골프랜드 관련 리뷰

★★★★★ "자동시설에 휴게실 샤워실 카페 다 갖춰져있고, 비거리를 200까지 확인가능할정도로 넓고, 주차장도 넓고, 가격도 저렴하고 저는 앞으로 이곳에 자주갈예정임"

www.google.com

 

https://maps.google.com/maps/contrib/116892531990059484324 추천

 

반응형

댓글()

종목정보 파악에 유용한 사이트 모음

AI주식자동매매|2021. 5. 8. 14:07
반응형

안녕하세요?

 

주식 자동매매할때, 내가 선택한 종목이 괜찬은 투자할만한 종목인지,

기관에서는 추천하고 있는 종목인지 비교해 보기 위해서는 종목정보를 분석할 필요가 있습니다.

 

이때, 유용한 사이트를 모아봤습니다.

 

1. 컴퍼니가이드(CompanyGuide)

    http://comp.fnguide.com 

 

삼성전자(A005930) | Snapshot | 기업정보 | Company Guide

삼성전자 005930 | 홈페이지 홈페이지http://www.samsung.com/sec 전화번호 전화번호031-200-1114 | IR 담당자 02)2255-9000 주소 주소경기도 수원시 영통구 삼성로 129 (매탄동) KSE  코스피 전기,

comp.fnguide.com

경쟁사와 비교정보, 향후 2~3년 실적전망정보까지 기업투자 판단에 꼭 필요한 정보들이 모두 제공됩니다.

 

2. finviz.com/

 

FINVIZ.com - Stock Screener

× Ever heard of Finviz*Elite? Our premium service offers you real-time quotes, advanced visualizations, technical studies, and much more. Become Elite and make informed financial decisions. Find out more --> Upgrade your FINVIZ experience Join thousands o

finviz.com

해외 미국주식 정보를 종합적으로 보여줍니다. 

3. thinkpool

www.thinkpool.com/itemanal/i/tpreport/tpreport_item.jsp?code=000970

 

한국주철관(000970) > 리포트 :: 씽크풀

 

www.thinkpool.com

 

반응형

댓글()

나만의 DC형 퇴직연금 운영방법(2)

카테고리 없음|2021. 5. 4. 08:50
반응형

간만에 퇴직연금 관련 글 올립니다.

작년 8월에 연금관리회사를 옮긴이후 실적입니다.

나름 선방한 것 같습니다만, 글쎄요..

어쨌든 정리를 해 보겠습니다.

 

가입: NH투자증권 퇴직연금

작년 12월 까지는 꾸준히 수익이 늘었지만,

올해 들어서는 수익이 크게 늘지 못하고 있습니다.

 

현재 가입상품 및 비율은 다음과 같습니다.

작년말에 한번 갈아탔기 때문에 현재의 투자비율 및 수익률은 최근 4개월 현황이라고 보시면 됩니다.

상품 투자비율(누적) 수익률 비고
SBI저축은행 정기예금_DC_3Y 45% 1.28%  
피델리티글로벌테크놀로지증권자투자신탁(주식-재간접형)CP-e 19% 7.4%  
하나UBS IT코리아증권투자신탁(제1호)[주식]C-P2E 19% -0.5%  
KB코리아뉴딜증권투자신탁(주식) C-퇴직e 21% 0.12%  

 

이외에 꾸준히 모니터링하며 관심목록으로 관리하고 있는 상품들입니다.

카테고리별로 일부상품은 중복될 수도 있습니다만, 참고하시기 바랍니다.

 

신성장 가치투자상품>

한국투자글로벌전기차&배터리증권투자신탁(주식)C-Re
미래에셋퇴직연금가치주포커스증권자투자신탁1(주식)C
마이다스신성장기업포커스증권투자신탁(주식)C-Pe2
멀티에셋퇴직연금클린에너지증권자투자신탁[주식]
미래에셋연금아시아퍼시픽소비성장증권자투자신탁1호(주식)C-Pe
미래에셋퇴직연금가치주포커스40증권자1호(채권혼합)C-P2e
신영퇴직연금가치주식증권자투자신탁(주식)C
미래에셋퇴직연금가치주포커스증권자투자신탁1(주식)C-P2e
현대인베스트먼트코스닥포커스증권자투자신탁1호(주식)P1-e
피델리티글로벌테크놀로지증권자투자신탁(주식-재간접형)CP-e
NH-Amundi성장중소형주증권투자신탁[주식]C-P2e
하나UBS IT코리아증권투자신탁(제1호)[주식]C-P2E
키움차세대모빌리티증권자투자신탁제1호[주식]C-Pe
메리츠코리아스몰캡증권투자신탁[주식]C-Pe2

 

채권형펀드>

미래에셋퇴직연금베스트펀드컬렉션증권자1-채권혼합재간접C-P2e
KB미국S&P500인덱스40증권자(채권혼합-파생형)C-퇴직e

 

해외주식형펀드>

미래에셋차이나그로스증권자투자신탁1호(주식)C-Pe
트러스톤아시아장기성장주40퇴직연금증권자투자신탁[채권혼합]Ce
트러스톤아시아장기성장주증권자투자신탁(UH)[주식]Cp2-E
멀티에셋퇴직연금클린에너지증권자투자신탁[주식]
멀티에셋글로벌4차산업전환사채증권자투자신탁H[채권]Crp-e

 

헬스케어투자펀드>

미래에셋연금한국헬스케어증권자투자신탁1호(주식)C-P2e

 

신재생에너지분야 펀드>

블랙록월드에너지증권자투자신탁(주식-재간접형)(H)C-Rpe
멀티에셋글로벌클린에너지증권자투자신탁[주식]Crp-e

 

삼성현대엘지 핵심대기업투자 펀드>

NH-Amundi 100년기업그린코리아증권투자신탁[주식]C-P2e
NH-Amundi 필승코리아증권투자신탁[주식]C-P2e(퇴직연금)
하나UBS IT코리아증권투자신탁(제1호)[주식]C-P2E
신영마라톤증권자투자신탁(주식)C-P2e
KB코리아뉴딜증권투자신탁(주식)C-퇴직e
키움차세대모빌리티증권자투자신탁제1호[주식]C-Pe
멀티에셋글로벌4차산업전환사채증권자투자신탁H[채권]Crp-e

 

투자에 참고가 되셨길 바랍니다.

반응형

댓글()

빗썸API 자동매매일지 2021.04.17 17:00

가상화폐|2021. 4. 17. 18:02
반응형

안녕하세요?

 

간만에 자동매매일지를 올립니다.

최근 가상화폐의 급상승 이후, 알트코인들의 동반등락과 급락장세가 이어지면서,

비트코인 8천만원 신고가 달성의 그늘에서 저를 비롯하여 고생하시는 분들이 

많을 듯 합니다.

 

그래도 저는 자동매매의 희망을 놓지 않고, 

추세의 흐름속에서 돈버는 매수타이밍과 전략을 꾸준히 Update 해 나가고 있습니다.

 

현시점의 자산현황입니다.

투자원금에서 -9%이네요. 한때는 26%까지 수익을 올렸었는데, 지금은 마이너스 입니다.

어제 오늘 매수타이밍 로직을 추가 개선했습니다.

 

로직No. M5-1

###########################################################
# 5-1) 급등신호: MACD OSC 0선 이상 반전
#                    MA5, 10, 20, 60, 120 우상향 정배열 초입
#                    not(MA5 > MA10 > MA20) > MA60 > MA120
###########################################################

로직No. M8

#######################################################################################
# 8) macd_osc 0선이하에서 최저점을 돌아설때(최저가도 최저점을 돌아선다)(거래량도 점차 주는 현상이 있음)
#    macd signal 0선 아래에 있어야 한다. , 60이평선은 하락상태이며,
#    전전봉은 음봉이고, 현재봉은 양봉이면서, 전봉이 최저점을 찍고 상승전환하는 현상을 로직에 반영함
또한, macd도 전봉을 기준으로 감소에서 증가로 돌아설때가 현재 매수타이밍이다#######################################################################################

로직No. M9

#######################################################################################
# 9) macd_osc 0선이하에서 최저점을 돌아설때(최저가도 최저점을 돌아선다)(거래량도 점차 주는 현상이 있음)
# macd signal 0선 아래에 있어야 한다. , 60이평선은 하락상태이며,
# 양봉, 음봉 상관없이, 전전전봉부터 현재봉까지 최저가가 꾸준히 상승하고
# 또한, macd도 전봉을 기준으로 감소에서 증가로 돌아설때가 현재 매수타이밍이 된다.
#######################################################################################

 

이 로직이 적용된 결과 두건 체크해 보겠습니다.

퀀텀과 트론이 자동 매수되어 자동 매도 되었습니다.

퀀텀은 12:40분에 22,810원에 매수했다가 14:39분에 23,250원에 매도 되었네요.

약 4%이상? 수익률이 되겠네요? 정확한 %계산이 중요한게 아닙니다. 1%이상 수익만 나면 됩니다.

1%도 자동으로 늘었다가 줄었다가 하긴 합니다만, 최소는 1%이상 남도록 로직이 되어 있습니다.

 

트론은 14:35분에 213.1원에 매수했다가 217.2원에 매도 되었습니다. 이건 2.5%이상? 수익률 같습니다.

 

그럼, 이제, 매수매도 타이밍이 적절했는지 확인해 보겠습니다.

먼저, 퀀텀을 봐 볼게요.

 

12:39분에 자동매매프로그램에서 Slack에 남겨놓은 메세지 로그입니다.

일봉기준이 매수추천이 된 후,

곧바로 5분봉에 의해서 다시 매수추추천되어 바로 매수주문이 들어간 Slack 메세지 내용입니다.

 

로직No(M8)이라는 부분이

5분봉기준 로직 M8번 로직에 의해 매수타이밍을 잡았음을 알려줍니다.

그 당시의 실제 bithumb 5분봉차트를 확인해 보겠습니다.

Slack Message에 url 링크를 누르면 바로 해당 차트로 갑니다.

 

12:39분 매수는 12:35분봉을 현재봉으로 해서 판단하여 매수했으므로, 35분봉을 보셔야 합니다.

자동매매 프로그램은 25분봉, 30분봉, 35분봉 3개봉을 기준으로 39분에 판단했습니다.

매 5분봉의 최저가의 추이과 거래량추이, MACD OSC값의 추이, 그리고, 

macd선과 macd_signal선의 기울기 각도를 보고 판단했습니다.

어쩌면 저만의 비법인데.. 이렇게 밝혀도 되는지 모르겠습니다. ㅎㅎ

 

매수와 매도 타이밍으로 자동 거래된 부분을 표시하면 다음과 같습니다.

 

자동매매 프로그램에서 표시된 매매이력을 확인해 보겠습니다.

매수타이밍에는 "B"라고 표시되어 있고,  매도된 시간에는 "S"로 표시되어 있습니다.

트론도 이와 비슷하게 거래된 것 같습니다.

 

항상 이렇게만 거래된다면, 더이상 바랄게 없겠습니다만, 

문제는, 매수하여 매도타이밍 대기중인 코인이 계속해서 급락할때가 문제 같습니다.

매도 타이밍을 못잡거나, 매수하자마자 바로 급락으로 떨어지게되면, 매도타이밍을 잡을 수가 없겠죠...

 

급락장을 피하는 가장 좋은 방법은 최적의 매수타이밍까지 기다렸다가

타이밍이 오면 바로 매수하여 최소의 매도 수익을 달성하고 파는거라고 봅니다.

이것도 신의 영역이긴합니다만, 최대한 신의 영역에 다가가기 위해 노력하는거죠.. 

 

욕심내지 않고, 적절한 수익을 내고, 바로 빠지기~ 이게 최고입니다.

 

이 글이 자동매매를 이해하시는데 도움되길 바랍니다.

반응형

댓글()

빗썸API 자동매매일지 2021.04.10 12:57

카테고리 없음|2021. 4. 10. 13:06
반응형

안녕하세요? 

 

마음을 비우고, 새롭게 시작한다는 마음으로 모니터링중입니다.

급상승 이후 급락장에서 

매수와 손절을 반복하면서 그동안 벌어둔 수익금을 모두 날리고,

소잃고 외양간 고치는 기분이기는 합니다만,...

 

원금이하까지 떨어진 상황에서 로직을 보완하여

보수적인 매수로 급락장에서 쉽게 매수할수 없도록 로직을 보완한 후 3일차 입니다.

엊그제 56만9천원에서 다시 증가하고 있습니다.

 

 

10일 현재 매도처리된 건들의 매수 매도가 잘 되고 있는지 몇건 확인해 보겠습니다.

빗썸에서 제공하는 거래내역 화면에서

자동매매에 의해 오늘 매도된 엘리시아 코인의 매수대비 매도금액을  보면 다음과 같습니다.

2648EL코인을 109,362원에 사서 111,984에 팔았는데,

매수/매도 수수료로 553.37원을 제하고 나면, 30분만에 약 2,100원을 벌었습니다.

 

12시 02분 매수해서, 12시 38분에 매도한 싯점을 5분봉 차트에서 확인해 보겠습니다.

macd가 signal선을 교차 상승하는 싯점에서 자동으로 매수해서,

하락으로 접어드는 싯점에 자동으로 매도하는것을 볼 수 있습니다.

 

자동 매수/매도 시스템이력을 Slack 봇 로그 채널에서 확인해 보겠습니다.

자동매매 프로그램에서 slack channel로 매수 추천종목이 발견되면

메세지를 자동으로 보내고 있는 이력과

추천에 의해 매수하면 매수 처리직전에 자동으로 보내는 메세지 로그를 

slack에서 확인할 수 있습니다.

추천종목선정 D1 로직에 의해 매수 추천되었고,

5분봉 기준 M9, M10번 로직에 의해 매수확정되어 주문에 들어간것을 확인할 수 있습니다.

 

자동매도는 어떻게 이뤄졌는지 매도 부분도 확인해 보겠습니다.

매도추천은 M@9번 로직에 의해 매도 추천 대상이 되었고, 매도시 수익률은

41.3원 단가에 매수해서 42.29원 단가에 매도하므로 수익률 2.1%에서 매도처리하였음이 로깅되었습니다.

 

결론적으로 제가 원하는 적정한 매수 매도로직이 반영되어 돌아가고 있음을 알 수 있습니다.

 

이상입니다.

반응형

댓글()