2020. 4. 12. 19:54

 

저는 요즘 소액으로 주식 투자를 해보고 있는 중인데

소소하게 투자를 해서 소소하게 잃고있는 중입니다.

그런데 저번주에는 갑자기 어떤 회사 주식에 꽂혀서 그 주식을 몰빵해서 샀고

가격이 내려도 추가 구입해서 평단가를 맞추는 등의 노력을 했지만

금요일날 결국 그 회사 주식이 폭락하여 3000 초반대까지 떨어져 원금의 10퍼센트를 잃고 손절하고 말았습니다.

그러다가 오늘은 꿈에서 손절한 주식이 8000원까지 올라가는 악몽을 꾸고 말았습니다.

결국 내가 뭐가 부족해서 계속 잃는것인지 생각해보았는데

생각해보면 제가 샀던 주식이 올랐던 적도 꽤나 있었습니다. 그런데도 손해만 보고 있었고요

저에게 부족한건 적절한때 손절 익절을 하는 능력(?)이 부족했던것이 아닐까 싶습니다.

그래서 생각해봤는데 손절 익절을 mts에 모두 맡기면 오히려 잃는 돈이 줄어들지 않을까 싶었고

주식을 구입한 후 +-3%가 되면 자동으로 판매를 하도록 설정을 해놓으면 어떨까 하고 생각을 했습니다.

보기에는 그럴듯 하지만 진짜로 저렇게 한다고 이익을 볼 수 있을까요?

물론 실제로 저런식으로 거래를 해서 이익을 보는 사람도 많이 있겠지만

결국 저런 방식으로 거래를 하는것도 오를 주식을 사야 얻는거고 또 오를 타이밍에 사야 이익을 볼텐데요

오를 주식을 미리 알 수는 없지만 어떤 상황에서 사야 오를지에 대해서 알 수 있을까 싶어서

과거의 자료를 보고 간단하게 차트를 만드는 코드를 만들어보았습니다.

이 코드를 만들기 위해서 우선 주식 프로그램에서

저번주 금요일 거래량이 많았던 종목들의 하루치의 데이터를 다운받았습니다.

 

 

 

 

그리고 데이터를 엑셀 파일로 다운받았습니다.

그리고 파이썬에서 다운받은 엑셀 파일을 읽어들여 제가 원하는 결과를 출력하도록 코드를 작성하겠습니다.

규칙은 간단한데

어떤 시점에서 주식을 구입했을 경우 해당 주식이 +3% 가 되는것이 먼저인지 -3%가 되는것이 먼저인지를

출력하는것 입니다.

데이터는 분단위의 봉차트 데이터로 시가 고가 저가 종가에 다른 데이터도 더 있지만

시가 고가 저가 데이터만을 사용하도록 하겠습니다.

만약 09:00에 시가로 주식을 개당 1000원에 구입했을 경우

09:05분에 고가가 1030이 되고 09:06분에 저가가 970원이 된다면

09:05분에 1030원에 에 익절하는 형식입니다.

아래는 작성한 코드입니다.

 

 

import pandas as pd
import os
import matplotlib.pyplot as plt
from matplotlib import pyplot
import datetime
from matplotlib import dates

path = "./excel/"
file_list = os.listdir(path)

print ("file_list: {}".format(file_list))

plt.rcParams["figure.figsize"] = (14,7)
plt.rcParams['lines.linewidth'] = 2
plt.rcParams['lines.color'] = 'r'
plt.rcParams['axes.grid'] = False 

p = 0.03

for file in file_list:
    if file.find('xlsx') < 0 and file.find('xls') < 0:
        continue
    print(file)
        
    xlsx = pd.read_excel(path + file)
    color = []
    for i in range(len(xlsx['시가'])):
        color.append(0)
    
    for i in reversed(range(0, xlsx.shape[0])):
        for j in reversed(range(0, i-1)):
            if xlsx['시가'][i] + xlsx['시가'][i] * p < xlsx['고가'][j]:
                color[i] = 1
    #            print(xlsx['시간'][i], ",", xlsx['시가'][i], ",", p, ",", "익절" , xlsx['고가'][j] , xlsx['시간'][j], color[i])   
                break
            if xlsx['시가'][i] - xlsx['시가'][i] * p > xlsx['저가'][j]:
                color[i] = 2
    #            print(xlsx['시간'][i], ",", xlsx['시가'][i], ",", p, ",", "손절" , xlsx['저가'][j] , xlsx['시간'][j], color[i])     
                break
    
    fig, ax = plt.subplots()
    converted_dates = list(map(datetime.datetime.strptime, xlsx['시간'], len(xlsx['시간'])*['%m/%d,%H:%M']))
    x_axis = converted_dates
    formatter = dates.DateFormatter('%H:%M')
    
    ax.xaxis.set_major_formatter(formatter)    
    ax.plot([],[])
    ax.scatter(x_axis, xlsx['시가'], c = color)
    
    plt.show()

 

결과를 차트로 출력하는데

위의 규칙을 그대로 사용하여

청록색일때 구입하면 익절

노란색일때 구입하면 손절

보라색일때 구입하면 손절도 익절도 하지 않습니다.

결과를 보면 저번 금요일 시점의 이 주식은 정말 특별한 타이밍이 아니면 이익을 보기 힘들었을거라는 결과입니다.

다른 회사들의 결과를 보겠습니다.

 

 

 

 

돈벌기 참 힘드네요

결과만 보면 주식 가격이 급격하게 내려갔을 때 구입하면 가격이 다시 회복되면서 익절을 하게되는 경우가 많은데

가장 첫번째 그래프처럼 다시 안올라가고 쭉 내려가기만 하는 경우도 있어서 그경우는 무조건 손해만 입겠네요.

결국 타이밍도 중요하지만 좋은 종목을 골라서 거래하는게 더 중요한것 같습니다.

2020. 4. 3. 14:14

 

인터넷에 있는 케라스 이미지 분류 코드를 이용해 이미지 분류 연습을 해 보았습니다.

연습을 위해 이미지셋을 다운받아서 테스트 해보았더니 그럭저럭 90퍼센트 이상의 정확도가 나오는것을 확인할 수 있었습니다.

하지만 이미 있는 이미지로만 해보면 재미가 없으니 새로운 이미지 셋을 만들어 연습해 보았습니다.

 

깔끔하게 잘 정리된 이미지셋들

우선 이미지셋을 만들기 위해 제가만든 이미지 다운로더 프로그램을 사용하여 이미지를 다운로드 하였습니다.

 

이번에 테스트 해볼 이미지셋은 아이돌 마스터의

시마무라 우즈키,

혼다 미오,

시부야 린

이렇게 세명의 캐릭터 이미지로 분류되는 이미지셋입니다.

 

각각 캐릭터 이미지를 약 100개씩 준비하였습니다.

그런데 이미지들이 통일성이 없고 배경색이나 색들도 완전히 각양각색입니다.

이미지마다의 공통점이라고는 해당 캐릭터들의 얼굴이 들어가 있다는점 밖에는 없네요

이런 이미지로 이미지 분류가 가능할지 잘 모르겠습니다.

각각의 이미지를 uzuki, rin, mio 폴더에 집어넣고 이미지셋을 데이터로 만들었습니다.

 

 

from sklearn.model_selection import cross_validate
from sklearn.model_selection import train_test_split
import cv2
from PIL import Image
import os, glob
import numpy as np

caltech_dir = "./lib/img"
categories = ["mio","rin","uzuki"]
nb_classes = len(categories)

image_w = 64 
image_h = 64
pixels = image_w * image_h * 3

X = []
Y = []
for idx, cat in enumerate(categories):
    print(cat)
    label = [0 for i in range(nb_classes)]
    label[idx] = 1
    image_dir = caltech_dir + "/" + cat
    print(image_dir)
    files = glob.glob(image_dir+"/*.jpg")
    for i, f in enumerate(files):
        print(f)
        img = cv2.imread(f)
        img = cv2.resize(img, None, fx=64/img.shape[1], fy=64/img.shape[0])
        X.append(img/256)
        Y.append(label)
        
X = np.array(X)
Y = np.array(Y)
X = np.array(X)
Y = np.array(Y)
X_train, X_test, Y_train, Y_test = train_test_split(X,Y)
xy = (X_train, X_test, Y_train, Y_test)

np.save("./lib/obj.npy", xy)

그 후 이미지 데이터를 이용하여 학습을 진행하였습니다.

 

from keras.models import Sequential
from keras.layers import MaxPooling2D
from keras.layers import Conv2D
from keras.layers import Dropout, Activation, Dense, Flatten
import h5py
import numpy as np
import cv2
import os

categories = ["mio","rin","uzuki"]

nb_classes = len(categories)

X_train, X_test, Y_train, Y_test = np.load('./lib/obj3.npy', allow_pickle=True)
print('Xtrina_shape', X_train.shape)

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=X_train.shape[1:], padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))

model.add(Conv2D(64, (3, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(nb_classes))
model.add(Activation('softmax'))

model.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['accuracy'])
hdf5_file = "./lib/obj-model.hdf5"
if os.path.exists(hdf5_file):
    model.load_weights(hdf5_file)
else:
    model.fit(X_train, Y_train, batch_size=32, epochs=50)
    model.save_weights(hdf5_file)

score = model.evaluate(X_test, Y_test)
print('loss=', score[0])        # loss
print('accuracy=', score[1])    # acc

 

마지막으로 트레이닝 된 데이터를 이용하여 테스트셋의 정확도를 확인해 보겠습니다.

중복되지 않는 이미지를 따로 모아 테스트 하였습니다.

 

 

from keras.models import Sequential
from keras.layers import MaxPooling2D
from keras.layers import Conv2D
from keras.layers import Dropout, Activation, Dense, Flatten
import h5py
import numpy as np
import cv2
import os

categories = ["mio","rin","uzuki"]

nb_classes = len(categories)

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=X_train.shape[1:], padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))

model.add(Conv2D(64, (3, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(nb_classes))
model.add(Activation('softmax'))

model.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['accuracy'])

hdf5_file = "./lib/obj-model.hdf5"
model.load_weights(hdf5_file)

import glob

X = []
Y = []

files = glob.glob("./lib/img/test/*.jpg")
for i, f in enumerate(files):
    print(f)
    img = cv2.imread(f)
    img = cv2.resize(img, None, fx=64/img.shape[1], fy=64/img.shape[0])
    X.append(img/256)

X = np.array(X)
Y = np.array(Y)

Y = model.predict(X)

c1 = 0;
c2 = 0;

for i in range(len(Y)):
    for j in range(len(Y[i])):
        if Y[i][j] == np.max(Y[i]):
            c1 = c1 + 1
            tmp1 = files[i].split('\\')[1].split(' ')[0]
            if(tmp1 == categories[j]):
                c2 = c2 + 1
            break

print(c1)
print(c2)

 

 

 

출력된 결과는

97 62

97개 테스트 중에 62개가 정답입니다. 약 63퍼센트의 정확도네요

절반도 안될줄 알았는데 생각보다 높게 나왔습니다.

물론 실제로 사용하기에는 정확도가 너무 낮지만

랜덤으로 찍어서 맞출 확률보다 약 2배나 높은 확률입니다.

 

다만 테스트 자체의 신뢰성이 조금 의심됩니다...

이미지셋 자체가 너무 적은게 문제인것 같습니다.

정리되지 않은 이미지들로 이정도라면 정리된 데이터로 테스트 해보면 훨씬 높은 정확도가 나올것 같습니다.

예를들면 캐릭터 얼굴만 잘라내서 트레이닝 시키고 테스트하면 90퍼센트 이상의 정확도를 구할 수 있지 않을까요?

그건 나중에 따로 해보도록 하겠습니다.

 

 

 

 

참고

https://hoony-gunputer.tistory.com/entry/keras%EC%83%89-%EC%9E%88%EB%8A%94-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B6%84%EB%A5%98%ED%95%98%EA%B8%B02

 

 

2020. 3. 29. 23:52

 

얼마 전에 인터넷에서 한천가루를 구매하여 팥 양갱을 만들어 보았습니다.

이 이전에 만들었던 팥양갱은 물을 너무 많이 넣어서 그런건지 팥을 너무 적게 넣어서 그런건지 양갱이 아니라 젤리처럼 되어버려서 별로 마음에 안들었는데

이건 식감도 슈퍼에서 파는 양갱이랑 똑같고 맛있네요

 

한천가루가 많이 남아서 종종 만들어 먹어야겠습니다.

'생활 > 요리' 카테고리의 다른 글

아몬드가루로 바나나 파운드케이크 만들기  (0) 2022.05.06
뒷다리살 수비드로 해먹기  (0) 2022.04.11
햄버거빵 굽기  (0) 2020.12.24
앙금쿠키 만들기  (0) 2020.12.24

저번에 산 백설앙금으로 앙금 쿠키를 만들어봤습니다.

레시피는 따로 정해놓고 한건 없고

앙금이 1000g, 아몬드가루 적당량, 앙금이 뻑뻑해지지 않을 정도의 우유

이렇게만 넣고 오븐에 구워보았습니다.

다른분들 레시피를 보면 계란 노른자도 넣으시던데 집에 계란이 없어서 노른자는 안넣었습니다.

 

구매한지 10년 가까이 된 전기오븐입니다. 이제 문도 잘 안닫기네요
반죽을 짤주머니에 넣고 짜서 오븐에 구웠습니다.

 

 

 

백설앙금이 아주 달아서 설탕을 따로 넣을 필요도 없고

맛있게 잘 구워졌습니다.

시중에서 파는거랑 차이가 없네요

'생활 > 요리' 카테고리의 다른 글

아몬드가루로 바나나 파운드케이크 만들기  (0) 2022.05.06
뒷다리살 수비드로 해먹기  (0) 2022.04.11
햄버거빵 굽기  (0) 2020.12.24
전에 만든 팥양갱  (0) 2020.12.24

+ Recent posts