[주식투자자동화] #7 주식투자 자동프로그램 - 테스트 :: Horizontal Grays S2

일단 실제 거래가 되는 루틴은 막고 돌려보았다.

 

3월 31일

오전 8시 Creon Plus 자동연결은 알아서 실행되었으나

Creon Plus 연결할때 키보드 연결 어쩌구 오류가 나왔는데 확인 누르니 넘어가고 

 

자동거래프로그램도 자동으로 실행되었는데... 퇴근하고 보니

아... 아무런 기록도 남아있지 않았다.

 

그리고 매수종목 리스트 프로그램도 실행결과가 남아있질 않았다.

 

자 하나씩 해결해보자.

1. 일단 Print 로그를 파일로 저장해버리기 위해 기존의 .py 를 실행하는 방식이 아닌 .bat 파일 실행 방식으로 바꾸었다.

 

AutoTrade.bat 파일을 만들고 파일의 내용은

python AutoTrade.py > AutoTradeResult.txt

이런식으로 저장해두고 작업 스케줄러를 다음과 같이 수정해서 bat파일을 실행하게 해주었다.

매수종목 list 만드는 프로그램도 마찬가지로 작업해서 txt파일로 기록을 남겨두도록 하였다.

 

2. Slack으로 메시지를 보내도록 수정했다.

프로그램의 시작/종료, 매수를 알리는 일 등을 Slack으로 메시지를 보내도록 수정하였다.

 

3. 매수종목 list 만드는 프로그램의 오류 수정

매수종목 list 만드는 프로그램이 결과를 내지 못하는 이유를 디버깅 하다보니 중간에 어제날짜의 데이터가 없으면 Error가 나는 것이었다. 그래서 DataFrame의 행의 수를 살펴 어제와 오늘 날짜의 Data가 있는 경우만 진행하도록 수정했다.

df = stock.get_market_ohlcv_by_date(fromdate=by_day, todate=bt_day, ticker=etf_ticker)
    if(len(df) == 2):

수정한 source

from pykrx import stock
import time,sys
import pandas as pd
from datetime import datetime,timedelta
import requests

def post_message(token, channel, text):
    response = requests.post("https://slack.com/api/chat.postMessage",
        headers={"Authorization": "Bearer "+token},
        data={"channel": channel,"text": text}
    )
    print(response)

myToken = "xoxb-2241580444021-2948023303025-K4NHATNUlfFIJzl6KIpkhd9u"
def dbgout(message):
    """인자로 받은 문자열을 파이썬 셸과 슬랙으로 동시에 출력한다."""
    print(datetime.now().strftime('[%m/%d %H:%M:%S]'), message)
    strbuf = datetime.now().strftime('[%m/%d %H:%M:%S] ') + message
    #slack.chat.post_message('#etf-algo-trading', strbuf)
    post_message(myToken,"#stock",strbuf) 

dbgout('매수종목 List 작성을 시작합니다.')
#DataFrame define
kospi_stock_list = pd.DataFrame(columns=['stock_code','price','yesterday_volume','today_volume','volume_ratio'])
kosdaq_stock_list = pd.DataFrame(columns=['stock_code','price','yesterday_volume','today_volume','volume_ratio'])
etf_stock_list = pd.DataFrame(columns=['stock_code','price','yesterday_volume','today_volume','volume_ratio'])

today = datetime.today()- timedelta(0)      #오늘날짜 구하기 timedelta(1)을 빼면 어제날짜
yesterday = datetime.today()- timedelta(1)
str_today = today.strftime("%Y%m%d")        #구한 날짜를 String type으로
str_yesterday = yesterday.strftime("%Y%m%d")        #구한 날짜를 String type으로

print(str_today)
print(str_yesterday)
bt_day = stock.get_nearest_business_day_in_a_week(date=str_today)   #오늘 날짜 집어넣고 장을 여는 가장 가까운 날을 구함 오늘 장을 열면 오늘 날짜 반환
by_day = stock.get_nearest_business_day_in_a_week(date=str_yesterday)
print("btday=",bt_day)
print("byday=",by_day)
if bt_day != str_today: #오늘 날짜와 구한 날짜가 같지 않다는건 오늘 장을 열지 않는다는 것
    print("오늘은 장을 열지 않으므로 프로그램 종료")
    sys.exit(0)

kospilist = stock.get_market_ticker_list(date=bt_day, market="KOSPI")   #KOSPI 종목코드를 list로 반환
kosdaqlist = stock.get_market_ticker_list(date=bt_day, market="KOSDAQ") #KOSDAQ 종목코드를 list로 반환
etflist = stock.get_etf_ticker_list(date=bt_day)                        #ETF 종목코드를 list로 반환

kospi_stock_list_count = 0      #나중에 Dataframe에 count로 사용할 변수 초기화
kosdaq_stock_list_count = 0
etf_stock_list_count = 0

print("KOSPI 확인 - 종목수 : ",len(kospilist))
for kospi_ticker in kospilist:  #KOSPI 종목
#for i in range(100):   #for test
    #kospi_ticker = kospilist[i]    #for test
    df = stock.get_market_ohlcv_by_date(fromdate=by_day, todate=bt_day, ticker=kospi_ticker)    #KOSPI 종목코드 어제,오늘 관련정보 DataFrame

    if(len(df) == 2):
        yesterday_volume = df.iloc[0]['거래량']     #DataFrame에서 어제 거래량 변수로 입력
        today_volume = df.iloc[1]['거래량']         #DataFrame에서 오늘 거래량 변수로 입력
        today_price = df.iloc[1]['종가']            #DataFrame에서 오늘 종가 변수로 입력
        
        print("종목코드",kospi_ticker)
        print("종가",today_price) 
        print("어제 거래량",yesterday_volume)
        print("오늘 거래량", today_volume)
        if yesterday_volume == 0:                   #어제거래량이 없으면 거래량변화 -100
            volume_ratio = -100
        else:
            volume_ratio = (today_volume-yesterday_volume)/yesterday_volume     #거래량변화율 

        
        new_data = [kospi_ticker,today_price,yesterday_volume,today_volume,volume_ratio]
        kospi_stock_list.loc[kospi_stock_list_count] = new_data     #관련 정보 DataFrame의 행에 추가
        kospi_stock_list_count = kospi_stock_list_count + 1
        time.sleep(1) 

print("KOSDAQ 확인 - 종목수 : ",len(kosdaqlist))
for kosdaq_ticker in kosdaqlist:
#for i in range(100):       #for test
    #kosdaq_ticker = kosdaqlist[i]  #for test
    df = stock.get_market_ohlcv_by_date(fromdate=by_day, todate=bt_day, ticker=kosdaq_ticker)
    if(len(df) == 2):
        yesterday_volume = df.iloc[0]['거래량']
        today_volume = df.iloc[1]['거래량']
        today_price = df.iloc[1]['종가']
    
        print("종목코드",kosdaq_ticker)
        print("종가",today_price) 
        print("어제 거래량",yesterday_volume)
        print("오늘 거래량", today_volume)
        if yesterday_volume == 0:
            volume_ratio = -100
        else:
            volume_ratio = (today_volume-yesterday_volume)/yesterday_volume

        
        new_data = [kosdaq_ticker,today_price,yesterday_volume,today_volume,volume_ratio]
        kosdaq_stock_list.loc[kosdaq_stock_list_count] = new_data
        kosdaq_stock_list_count = kosdaq_stock_list_count + 1
    time.sleep(1) 



print("ETF 확인 - 종목수 : ",len(etflist))
for etf_ticker in etflist:
#for i in range(100):   #for test
    #etf_ticker = etflist[i]    #for test
    df = stock.get_market_ohlcv_by_date(fromdate=by_day, todate=bt_day, ticker=etf_ticker)
    if(len(df) == 2):
        yesterday_volume = df.iloc[0]['거래량']
        today_volume = df.iloc[1]['거래량']
        today_price = df.iloc[1]['종가']
        
        print("종목코드",etf_ticker)
        print("종가",today_price) 
        print("어제 거래량",yesterday_volume)
        print("오늘 거래량", today_volume)
        if yesterday_volume == 0:
            volume_ratio = -100
        else:
            volume_ratio = (today_volume-yesterday_volume)/yesterday_volume

        
        new_data = [etf_ticker,today_price,yesterday_volume,today_volume,volume_ratio]
        etf_stock_list.loc[etf_stock_list_count] = new_data
        etf_stock_list_count = etf_stock_list_count + 1
        time.sleep(1) 

all_stock_list = pd.concat([kospi_stock_list,kosdaq_stock_list])    #KOSPI와 KOSDAQ은 합쳐서 하나의 DataFrame으로

print("KOSPI")
print(kospi_stock_list)
print("KOSDAQ")
print(kosdaq_stock_list)
print("KOSPI+KOSDAQ")
print(all_stock_list)
print("ETF")
print(etf_stock_list)


all_stock_list.sort_values(['today_volume'],axis=0,ascending=False,inplace=True)    #거래량 우선으로 정렬
sort_volume_list = all_stock_list.head(12)                                          #그중 12개만 추출해서 저장
print("all stock sort by volume")
print(sort_volume_list)
sort_volume_list.sort_values(['volume_ratio'],axis=0,ascending=False,inplace=True)  #12개를 거래량 변화율로 정렬
sort_ratio_list = sort_volume_list.head(6)                                          #그 중 6개만 추출해서 저장
print("all stock sort by volume")
print(sort_ratio_list)

etf_stock_list.sort_values(['today_volume'],axis=0,ascending=False,inplace=True)    #ETF도 같은 과정 
etf_sort_volume_list = etf_stock_list.head(28)
print("ETF stock sort by volume")
print(etf_sort_volume_list)
etf_sort_volume_list.sort_values(['volume_ratio'],axis=0,ascending=False,inplace=True)
etf_sort_ratio_list = etf_sort_volume_list.head(14)             
print("ETF stock sort by volume")
print(etf_sort_ratio_list)

total_stock_list = pd.concat([sort_ratio_list,etf_sort_ratio_list])     #최종 KOSPI,KOSDAQ에서 6개, ETF에서 14개 총 20개 를 하나의 DataFrame으로 합치고
print("Total stock sort by volume")
print(total_stock_list)

final_stock_list = list(total_stock_list['stock_code'])     #DataFrame에서 종목코드만 List로 뽑고
print("final Stock List")
print(final_stock_list)

for i in range(len(final_stock_list)):
    final_stock_list[i] = 'A'+ str(final_stock_list[i])     #List에 'A' 추가해서
print(final_stock_list)

f = open('codelist.txt','w')
f.write(','.join(final_stock_list))     #파일로 저장
f.close()

dbgout('매수종목 List 작성을 종료합니다.')
#symbol_list = open('codelist.txt','r').read().split(',')       #for verify
#print(symbol_list)                                             #for verify

 

4월 1일

오전 8시 Creon Plus 자동연결은 알아서 실행되었으나

Creon Plus 연결할때 키보드 연결 어쩌구 오류가 또 나왔는데 역시 확인 누르니 넘어갔다.

나중에 다시 실행해보아도 이부분은 문제가 없이 잘 실행되는데 물리적키보드가 연결이 안되어있는게 문제인건가?

 

그리고 나머지는 잘 실행되긴 했다.

하지만 결과는...

 

일단 실제 프로그래그램에서 매수할 종목의 수는 5종목이지만 실제 매수는 하지 않았으므로 조건에 해당하면 메시지를 보냈다.

그 결과 오늘은 총 7종목이 조건에 해당한다고 메시지를 보냈다.

 

KODEX 인버스(A114800) 0.0EA : 4310 meets the buy condition!`
[04/01 09:10:07] but_etf 매수 종목 : KODEX 인버스종목코드 : A114800현재가 : 4310 => 4300

[04/01 09:10:41] KODEX 200선물인버스2X(A252670) 0.0EA : 2480 meets the buy condition!`
[04/01 09:10:41] but_etf 매수 종목 : KODEX 200선물인버스2X종목코드 : A252670현재가 : 2480 =>2465

[04/01 09:11:38] TIGER 200선물인버스2X(A252710) 0.0EA : 2590 meets the buy condition!`
[04/01 09:11:38] but_etf 매수 종목 : TIGER 200선물인버스2X종목코드 : A252710현재가 : 2590 => 2575

[04/01 09:12:32] TIGER 단기통안채(A157450) 0.0EA : 100740 meets the buy condition!`
[04/01 09:12:32] but_etf 매수 종목 : TIGER 단기통안채종목코드 : A157450현재가 : 100740 => 100730

[04/01 09:23:58] 켐온(A217600) 0.0EA : 3180 meets the buy condition!`
[04/01 09:23:58] but_etf 매수 종목 : 켐온종목코드 : A217600현재가 : 3180 => 2985

[04/01 09:30:06] TJ미디어(A032540) 0.0EA : 9700 meets the buy condition!`
[04/01 09:30:06] but_etf 매수 종목 : TJ미디어종목코드 : A032540현재가 : 9700 => 9400

[04/01 11:20:10] TIGER 차이나전기차SOLACTIVE(A371460) 0.0EA : 14750 meets the buy condition!`
[04/01 11:20:10] but_etf 매수 종목 : TIGER 차이나전기차SOLACTIVE종목코드 : A371460현재가 : 14750 => 14670

 

파란색 글자는 실제 오늘 종가이다.  모두 마이너스 ...

계산해보면 실제 공식보다 비싼 현재가에서 구매를 하는걸로 되는데 이부분 감안해서 K값을 조금 줄여야 할것 같다.

현재 K값은 0.5

여튼 실제 투자는 다음주부터 일단 해보는 걸로!

 

+ Recent posts