본문 바로가기
프로젝트/수정중

주식 *

by 가장따뜻한로봇 2023. 6. 1.
import pandas as pd
from pyhive import hive
import re
money = 0
cn = 1
cc={}
cursor = hive.connect('localhost').cursor()
def yy(x):
    y='2999-12-31'
    if x == '2019':
        y = '2020-01-01'
    elif x == '2020_1':
        y = '2020-04-01'
    elif x == '2020_2':
        y = '2020-07-01'
    elif x == '2020_3':
        y = '2020-10-01'
    elif x == '2020_4':
        y = '2021-01-01'
    return y
        
# 
def stock(a, b,*args):
    global money
    global cn
    global cc
    money = a
    cn = b
    cc = {}
    sto = args
    for i in sto:
        sql(i)

def sql(x):
    global money
    global cn
    global cc
    # hive 에서 조건에 맞는 회사 검색을 위한 sql 쿼리
    sql = f"""
    with TBL1 as (
    SELECT T1.STK_CD, T1.STK_NM, T1.EX_CD, T1.SEC_NM, H1.DT,H1.C_PRC,
    (T3.TOTAL_SHARES * H1.C_PRC / T4.FIN_ITM_VAL) AS PER,
    (H1.C_PRC / T3.BPS) AS PBR,
    (T3.TOTAL_SHARES * H1.C_PRC / T3.CF_{x}) AS PFCR,
    (T3.TOTAL_SHARES * H1.C_PRC /T5.FIN_ITM_VAL) AS PSR
    FROM STOCK T1
    INNER JOIN FINANCE_C T3
    ON (T1.STK_CD = T3.STK_CD)
    INNER JOIN (SELECT T2.STK_CD, T2.FIN_ITM_VAL
    FROM FINANCE_Y T2
    INNER JOIN FINANCE_C T3
    ON (T2.STK_CD = T3.STK_CD)
    WHERE T2.FIN_ITM_NM = '당기순이익'
    AND T2.YY = '{x}'
    ) T4
    ON (T1.STK_CD = T4.STK_CD)
    INNER JOIN (SELECT T2.STK_CD, T2.FIN_ITM_VAL
    FROM FINANCE_Y T2
    INNER JOIN FINANCE_C T3
    ON (T2.STK_CD = T3.STK_CD)
    WHERE T2.FIN_ITM_NM = '매출액'
    AND T2.YY = '{x}'
    ) T5
    ON (T1.STK_CD = T5.STK_CD)
    INNER JOIN HISTORY_DT H1
    ON (T1.STK_CD = H1.STK_CD)
    WHERE H1.DT = (SELECT Max(T1.DT)
                    FROM HISTORY_DT T1
                    WHERE T1.DT <'{yy(x)}')
    ), TBL2 AS (
        SELECT *,
    rank() over ( partition by sec_nm order by per Asc) as PER_R,
    RANK() OVER(ORDER BY PBR ASC) as PBR_R,
    RANK() OVER(ORDER BY PFCR ASC) as PFCR_R,
    RANK() OVER(ORDER BY PSR ASC) as PSR_R
        FROM TBL1
        WHERE PER is not null
        AND PER > 0
        AND PBR is not null
        AND PBR > 0
        AND PFCR is not null
        AND PFCR > 0 
        AND PSR is not null
    ), TBL3 AS (
        SELECT *,RANK() OVER(ORDER BY (PER_R + PBR_R +PFCR_R +PSR_R)/4 ASC) AS TOTAL_R
    from TBL2
    )
     select * from tbl3 t3
     where T3.EX_CD = 'KD'
     order by TOTAL_R
    """
    cursor.execute(sql)
    result = cursor.fetchall()
    desc = cursor.description
    # 데이터프레임으로 만들기
    column_name = list( zip(*desc) )[0]
    column_name = [element.upper() for element in column_name]
    column_name = [re.sub('\S*\.',"",element)  for element in column_name]
    df = pd.DataFrame(result)
    df.columns = column_name
    df["DT"] = pd.to_datetime(df["DT"])
    df["C_PRC"] = df["C_PRC"].astype("int64")
    # 조건에 맞는 상위권 cn개의 회사들을 list로 저장
    c_list = list(df['STK_CD'][:cn])
    
#     print(c_list)
#     df.to_csv(f'./result_{x}.csv',encoding='utf-8',index=False)
    
    # 선정된 회사의 주식 정보를 불러 오기 위해 데이터 재검색
    sql = f"""
    SELECT H1.STK_CD, H1.DT, H1.C_PRC
    FROM HISTORY_DT H1
    WHERE H1.DT = (SELECT Max(T1.DT)
                    FROM HISTORY_DT T1
                    WHERE T1.DT <'{yy(x)}')
    """
    cursor.execute(sql)
    result = cursor.fetchall()
    desc = cursor.description
    column_name = list( zip(*desc) )[0]
    column_name = [element.upper() for element in column_name]
    column_name = [re.sub('\S*\.',"",element)  for element in column_name]
    df = pd.DataFrame(result)
    df.columns = column_name
    df["DT"] = pd.to_datetime(df["DT"])
    df["C_PRC"] = df["C_PRC"].astype("int64")
    
    
    # 현재 구매된 회사와 저평가 된 회사 리스트 비교
    # cc : 현재 보유한 주식 회사 리스트
    # 보유한 주식 회사가 저평가 된 회사 리스트에 있으면 tmp_cc 리스트에 임시저장
    tmp_cd = []
    tmp_cc = {}
    for i in c_list:
        if i in cc:
            tmp_cc[i]=cc[i]
            del cc[i]
        else:
            tmp_cd.append(i)
    
    # 현재 구매된 회사주식이 저평가된 회사 리스트에 없으면 판매 후 저평가된 회사 주식 구매.
    # 저평가된 회수 주식은 판매 후 남은 가격으로 균등 구매
    
    if len(cc.keys()) !=0:
        lcn = len(cc.keys())
    else:
        lcn = cn
    for j in cc.keys():
        money = money + int(cc[j]*df['C_PRC'][df['STK_CD'] == j])
    mn = int(money/lcn)
    for k in tmp_cd:
        tmp_cc[k]=int(mn/df['C_PRC'][df['STK_CD'] == k])
        money = money - int(tmp_cc[k]*df['C_PRC'][df['STK_CD'] == k])
    cc = tmp_cc
    
    # moneyt  = 현재 들고 있는 주식의 총가격
    moneyt = money
    for j in cc.keys():
        moneyt = moneyt + int(cc[j]*df['C_PRC'][df['STK_CD'] == j])
    print( x, moneyt)

 

'프로젝트 > 수정중' 카테고리의 다른 글

마스크 *  (0) 2023.04.14