레이블이 입문인 게시물을 표시합니다. 모든 게시물 표시
레이블이 입문인 게시물을 표시합니다. 모든 게시물 표시
2021년 8월 29일 일요일

파이썬의 기본 문법

컴퓨터 공부는 '백물이 불여일타'. 어려운 말들 늘어놓고 이말 저말 암기하려고 하면 공부하기가 힘듭니다. 컴퓨터 공부는 일단 두드려 보고, 만들어 보는 것이 가장 빠르게 학습을 하는 길이라고 생각합니다. 파이썬 공부를 처음 시작하시는 분들을 위해서 만든 포스팅입니다. 파이썬 언어의 특징, 자료 구조 등등 이론적 토대는 별도로 공부를 하시길 바랍니다.

온라인 컴파일러


파이썬 문법 공부는 아래의 사이트를 통해서 진행하시면 됩니다. 실제로는 파이썬을 설치해서 사용해야 하지만 그것은 나중에 꼭 필요할 때 하시는 것으로 하고, 일단 문법 공부를 간단하게 하는 정도는 온라인 컴파일러를 사용하시는 것을 추천합니다. 

맥북이나 맥에는 파이썬이 기본적으로 깔려 있습니다. 터미널 사용법을 아시는 분은 터미널에서 파이썬을 구동해서 공부해도 됩니다.

일단 파이썬 설치를 못 하는 분들을 위해서 3개의 사이트를 추천해 드리겠습니다. 취향에 맞는 곳에서 공부하시면 됩니다.


기초문법


이제부터는 글을 평어체로 쓰겠습니다.

변수와 자료형


파이썬은 변수 선언을 할 때 데이터 타입을 명시하지 않는다. 또한, 자바스크립트의 변수 선언부처럼 'var'와 같은 것도 사용할 필요가 없다.
a = 10
위와 같이 사용하면 그만이다. 변수 a는 int값 10을 갖게 되었다.
a = 10
print(a)
print(type(a))
변수 a에 담긴 값과 데이터 타입을 확인해 보면 그 결과는 다음과 같다.




변수 a에는 숫자 10이라는 값이 담겨 있으며 데이터 타입은 int형임을 알 수 있다. 어디서나 이렇게 유연하게 변수 선언을 하면 된다.
count = 20
math, english = (90, 100)
name = "Jongsik"
option = True
memo = "Good morning"
score = 90.5
companies = ["LG", "Samsung", "Hyundai"]

print(count, math, name, option, memo, score, companies)
print(type(count), type(math), type(name), type(option), type(memo), type(score), type(companies))
자료형을 몇가지 더 사용해보았다. 위에서 아래로 count, math, name 등의 변수를 선언하였다. 순서대로 정수형, 정수형(튜플 이용), 문자열, 불리언, 문자열, 실수형, 리스트 형태의 자료가 사용되었다.

변수가 가진 값들을 그대로 print한 것과 각 변수의 자료형태를 print한 결과는 다음과 같다.


이처럼 파이썬은 자료형을 별도로 설정하지 않아도 들어가는 값에 따라 자동으로 자료형태가 설정된다.

주석

"""
파이썬입니다!
기본적인 변수 사용법에 대한 연습장
여러줄 주석은 이렇게 사용합니다
"""

# 리스트 타입 (한줄 주석)
companies = ["LG", "Samsung", "Hyundai", "Google", "Amazon"]

print(companies)
print(companies[0])
print(companies[2])
print(companies[3][0])
print(companies[3] + companies[4])
이번에는 주석문을 사용하였다. 한줄 주석은 #을 사용하면 된다. 주석문을 여러줄로 사용하고 싶은 경우에는 홑따옴표나 쌍따옴표를 3개 연속으로 사용하고 이것으로 감싸주면 된다. 보통 IDE를 사용할 경우에는 윈도우는 Ctrl + / 맥은 Option + / 키를 사용하면 편리하다.

리스트와 딕셔너리


리스트 타입을 다룰일이 많을테니 리스트 타입을 다루는 아주 기본적인 방법 몇가지만 짚고 넘어가보자. 위의 코드를 실행하면 5개의 print문이 아래와 같이 출력된다.





companies라는 변수는 5개의 회사 이름이 각각의 원소로 존재하는 리스트를 갖고 있다. 이것을 그냥 print문으로 출력하면 목록과 목록이 가진 원소값들 그러니까 회사 이름이 그대로 출력된다.

다른 언어들이 배열을 다룰 때 처럼 대괄호를 사용하면 특정한 원소값만 출력할 수 있다. 가장 앞에 있는 원소값 즉, companies[0]을 출력하면 목록에서 가장 앞에 있는 'LG'가 출력된다. 당연히 companies[2]를 출력하면 3번째에 있는 'Hyundai'가 출력된다.

companies[3][0] 이 부분이 재미있다. 다른 언어에서는 2차원 배열에 속한 원소값을 꺼내올 때 이렇게 사용한다. 위의 예제에서는 'G'가 출력된다. 4번째에 있는 원소 'Google'에서 다시 첫번째에 있는 글자인 'G'를 추출한 것이다.

마지막으로 4번째 원소와 5번째 원소를 단순히 더하기 하면 결과값은 'GoogleAmazon'이다. 위의 예제에서 리스트에 포함된 모든 원소는 문자열이기 때문에 문자열을 더하면 단순히 문자열이 합해진 값이 결과로 출력된다.
a = "We are Korean!"

print(a)
print(a[:])
print(a[0])
print(a[:5])
print(a[4:8])
변수 a에 담긴 값은 단순한 문자열이다. 파이썬은 유연해서 단순 문자열에 포함된 각 문자도 하나의 원소로 취급할 수 있다.

리스트를 다룰때와 마찬가지로 대괄호 []를 사용하여 문자열에 포함된 특정한 문자를 추출할 수 있다. 파이썬은 리스트에 포함된 원소를 추출하거나 슬라이싱 하기 위해서 콜론을 이용한다. 독특하고 편리하게 원하는 값을 추출할 수 있다.

[:]를 사용하면 리스트의 모든 값을 출력한다. [:5]는 [0:5]와 동일하다. 첫번째 글자부터 6번째 글자까지 슬라이스 하여 추출하라는 의미이다. [4:8]은 5번째 글자부터 9번째 글자까지 출력하라는 의미이다. [4:]라고 하면 5번째 글자부터 마지막까지 모두 출력하라는 의미이다. 위의 예제를 실행하면 결과값은 아래와 같다.






이상에서 소개한 자료형 외에도 파이썬은 다양한 자료형을 제공한다. 복소수 형태라던가 딕셔너리도 제공한다. 복소수는 사용할 일이 많을지 모르겠지만 딕셔너리는 이야기가 나온김에 간단하게 살펴보고 넘어가자.
user = { "name": "Jongsik", "age": 39, "sex": "male" }

print(user)
print(user["name"])
print(user["age"])
딕셔너리는 "키:밸류" 쌍으로 이루어진 값들의 집합이다. JSON을 많이 사용해 보았다면 익숙한 형태일 것이다. 파이썬의 딕셔너리는 JSON으로 다시 JSON은 딕셔너리로 입출력이 편리하다.




위의 예제를 출력한 결과값은 이와 같다. 다른 프로그래밍 언어에서 딕셔너리를 다루는 법과 거의 동일하다.

분기처리 제어문, if


이제 제어문의 기본적인 형태를 살펴보자.
a = True

if a == True:
    print("결과는 참")
else:
    print("결과는 거짓")
    
------------------------
>> 결과는 참
변수 a에 불리언 값 True를 주었다. if문을 사용해서 a의 값이 참이면 '결과는 참'이라는 문장을 출력하고 거짓이면 '결과는 거짓'이라는 문장을 출력하는 아주 간단한 코드이다.

다른 프로그래밍 언어와 별달리 다른 점은 없다. 다만, 파이썬만의 특성이 몇가지 있는데 그 부분만 짚고 넘어가면 되겠다.

우선 파이썬의 제어문에는 보통의 다른 언어와 달리 괄호가 없다. 그냥 조건문을 작성하고 콜론(:)을 사용하여 해당 문장을 마무리하면 된다. 콜론을 빠뜨리면 에러가 난다.

그리고 조건문 이후에 오는 문장은 인덴테이션을 받드시 해주어야 한다. 파이썬은 문장의 끝을 알리는 세미콜론(;)을 사용하지 않는 만큼 정확한 인덴테이션을 요구한다. 따라서, 인덴테이션을 제대로 해주지 않아도 구문 오류가 난다. 주석문 조차도 마음대로 달련 오류가 나니 인덴테이션을 제대로 맞춰주도록 한다.
age = 39

if age >= 10 and age <= 19:
    print("당신은 10대입니다")
elif age >= 20 and age <= 29:
    print("당신은 20대입니다")
elif age >= 30 and age <= 39:
    print("당신은 30대입니다")
else:
    print("당신은 청년은 아닙니다")
    
------------------------
>> 당신은 30대입니다
이번에는 변수 a에 39라는 정수를 어싸인하였다. 변수 a에 있는 값으로 현재 세대를 판정하는 간단한 if ~ elif ~ else 제어문이다.

이것도 다른 프로그래밍 언어와 별로 다른 부분은 없지만 파이썬의 특징이 몇가지 있다. 우선 파이썬은 &&, || 와 같은 연산자를 사용하지 않는다. 파이썬에서는 해당 연산자를 곧이 곧대로 and, or 라고 사용하면 된다.

그리고 조건이 여러가지인 경우에 다른 언어에서의 else if 문을 파이썬에서는 elif로 사용한다. 일단은 이 부분만 중점적으로 숙지하면 된다.
car = {"benz", "bmw", "audi"}

if "benz" in car:
    print("독일차 명단에 존재합니다")

--------------------------------
독일차 명단에 존재합니다
딕셔너리나 목록에 특정한 값이 포함되어 있는지 in 을 사용하여 간단하게 체크할 수 있다.
member = { "Jinsu", "Mihee", "Sohee" }

if "Jongsik" not in member:
    print("Jongsik은 멤버가 아닙니다")
위와 같이 not을 사용하여 목록에 포함되지 않은 값을 처리할 수도 있다. 다른 프로그래밍 언어 경험이 있다면 !in과 같은 방법을 시도하는 분도 있을텐데 이 구문은 잘못된 구문으로 오류를 뱉는다. not in이라고 정확하게 쓰자.

반복문, for


프로그래밍 언어에서 사용하는 제어문의 양대산맥 중 하나인 if문을 이용한 분기처리 문법에 대해서 수박 겉핥기로 알아보았다. 이제 나머지 한쪽 산맥인 반복문에 대해서 알아보자.

여러가지 형태의 반복문 중 단연 많이 쓰이는 것은 for문이다.
for i in range(0, 5):
    print(i)

결과:----------------------
0
1
2
3
4
가장 간단한 형태의 for문이다. 0에서 시작해서 4까지 총 5바퀴를 돌면서 i값을 출력하는 코드다. 다른 언어와는 조금 다른 점이 보이는데 하나씩 짚어보자.

우선 range라는 부분이 독특하게 여겨질 것이다. range는 다음과 같이 사용한다. range(시작숫자, 끝나는 숫자, 증가값). 여기서 시작숫자와 증가값은 생략할 수 있다. 시작숫자를 생략하면 0에서 끝 숫자까지 도는 것이고, 증가값을 제외하면 다른 언어의 ++과 비슷한 효과를 가지며 한바퀴 돌 때 마다 값을 1씩 증가시킨다.

for문도 if문과 마찬가지로 선언문이 끝나는 부분에 세미콜론(:)을 사용해주고, 그 다음줄부터는 들여쓰기(인덴테이션)를 제대로 맞추어 주저야 한다. 그렇지 않으면 구문 오류로 코드가 실행되지 않는다.

위의 예제는 for 문을 돌리면서 선언한 변수 i에 한바퀴 돌 때마다 0에서 4까지 숫자를 1씩 증가시키면서 i를 i++ 처리하는 예제다. range의 끝나는 숫자 바로 앞의 숫자까지 for문이 돈다.
numbers = [1, 3, 7, 9, 12]

for i in numbers:
    print(i)
    
결과:----------------------
1
3
7
9
12
리스트에 있는 원소의 숫자만큼 for문을 돌고 각 원소를 하나씩 꺼내서 뿌려주는 코드다.

반복문, while


while은 조건이 참인 경우에 루프를 도는 반복문이다. 기본적인 문법은 다음과 같다.

while 조건문:
    실행되는 코드
For 문과 달리 튜플을 돌거나 변수 생성을 하지 않느다. 조건문이 True인지 False인지를 체크하고 조건문의 결과가 True인 경우에만 루프를 돈다.
debt = 1000
due = 0
while debt > 0:
    debt = debt - 100
    due = due + 1
    print("상환 {0}개월차, 빚 100만원을 갚았습니다".format(due))
    print("남은 빚은 {0}만 원입니다".format(debt))
    
    if debt == 0:
        print("모든 빚을 갚았습니다")

결과: -----------------------------
상환 1개월차, 빚 100만원을 갚았습니다
남은 빚은 900만 원입니다
상환 2개월차, 빚 100만원을 갚았습니다
남은 빚은 800만 원입니다
상환 3개월차, 빚 100만원을 갚았습니다
남은 빚은 700만 원입니다
상환 4개월차, 빚 100만원을 갚았습니다
남은 빚은 600만 원입니다
상환 5개월차, 빚 100만원을 갚았습니다
남은 빚은 500만 원입니다
상환 6개월차, 빚 100만원을 갚았습니다
남은 빚은 400만 원입니다
상환 7개월차, 빚 100만원을 갚았습니다
남은 빚은 300만 원입니다
상환 8개월차, 빚 100만원을 갚았습니다
남은 빚은 200만 원입니다
상환 9개월차, 빚 100만원을 갚았습니다
남은 빚은 100만 원입니다
상환 10개월차, 빚 100만원을 갚았습니다
남은 빚은 0만 원입니다
모든 빚을 갚았습니다
빚 1000만 원을 변수 debt가 갖고 있다. while 문은 빚을 모두 값아서 0원이 될 때까지 루프문을 돈다. 루프를 한바퀴 돌 때 마다 빚을 100만원 씩 갚아 나가고, 기간을 1개월씩 증가시킨다. 최종적으로 빚을 모두 갚으면 빚을 모두 갚았다는 문구를 출력하고 루프문을 종료하는 간단한 코드이다.

continue, break, pass


continue : 반복문의 초반으로 돌아가서 다음 반복문을 계속 실행한다.
break : 반복문의 실행을 중단하고 빠져나간다.
pass : 처리될 구문은 있지만 처리할 일은 없을 때 익셉션을 방지하기 위해 사용한다.

먼저 break는 제어문을 탈출할 때 사용한다. 간단한 사용 방법은 다음과 같다.
for a in range(0 ,10):
    if a == 3:
        break
    print(a)

결과:--------------------
0
1
2
위의 구문은 변수 a에 0부터 9까지 총 10바퀴를 돌면서 숫자를 할당하고 출력하게 하는 코드이다. if 문 안에 break가 걸려있다. for문이 3바퀴를 돌고나면 break가 걸리면서 이 루프문은 종료된다. break는 이렇게 루프를 종료하고 빠져나가는 역할을 갖고 있다.
for a in range(0 ,10):
    if a == 3:
        continue
    print(a)
결과:--------------------
0
1
2
4
5
6
7
8
9
이 구문은  앞의 구문과 동일하다. break가 있던 부분에 continue가 들어간 것만 다르다. break와 달리 continue는 루프를 계속 돈다. 파이썬 인터프리터가 continue를 만나는 순간 아래에 있는 코드는 무시하고 곧장 다시 루프문의 다음 바퀴를 돌기 위해 올라간다. 그리고 다시 루프를 계속 돈다.

결과를 보면 0에서 9까지 10바퀴의 루프를 도는 동안 3번은 print가 되지 않은 것을 확인할 수 있다. 3바퀴째에 print 구문에 도달하기 전에 continue를 만났기 때문이다.
def test(a):
    
print (test("안녕!"))

결과:----------------------
File "<string>", line 3
    print (test("안녕!"))
    ^
IndentationError: expected an indented block
위의 코드는 test라는 함수를 만들어서 print 구문을 통해서 test 함수를 호출한다. test 함수 안에는 아무런 내용도 없다. 그래서 코드를 실행하면 블럭에 코드가 비어 있다고 에러를 뱉는다. 이런 에러를 방지하기 위해서 pass를 사용한다.
def test(a):
    pass
    
print (test("안녕!"))

결과:----------------------
None
함수 블럭은 생성되었지만 할 일이 없는 경우에 pass를 사용하여 indented block 익셉션을 방지하였다.

외부 모듈 불러오기(import)


자바나 타입스크립트와 같이 파이썬도 import라는 구문을 사용할 수 있다. import를 사용하면 외부의 모듈을 가져와서 사용할 수 있다.
import 모듈명
이렇게 사용하면 해당 모듈을 모두 가져온다.
from 모듈명 import 기능명
이렇게 사용하면 모듈안에 있는 특정한 기능만 꺼내서 가져온다. 모듈은 파이썬이 제공하는 기본 모듈들이 있고, 세계의 여러 개발자들이 만들어 둔 오픈소스 모듈들도 있을거고 또 우리가 만드는 확장자 .py 파일도 외부 모듈로써 필요할 때는 언제든 외부의 .py 파일을 import 해서 사용할 수 있다.

기본모듈


파이썬에는 수 많은 기본 모듈이 제공된다. 파이썬에 내장된 기본모듈이므로 별도로 설치를 할 필요가 없다. 파이썬에서 제공하는 기본 모듈을 잘 활용하면 프로그램을 만들 때 매우 유용하게 사용할 수 있다. 그 중에서 몇 가지 표준 모듈만 살펴보자.

우선 math 모듈을 사용한 예제다. math 모듈은 복잡한 수학 계산을 편리하게 처리할 수 있도록 도와주는 함수들을 제공한다. 복소수는 cmath 모듈에서 지원한다.
import math

print(math.fabs(-99))    # 절대값 반환
print(math.factorial(4)) # 팩토리얼값 반환
print(math.isnan(10))    # 숫자이면 False 반환
print(math.isqrt(16))    # 제곱근 반환
print(math.log(24))      # 자연로그 반환(밑 e)
print(math.pow(3, 3))    # 거듭제곱 반환

결과:-------------------------
99.0
24
False
4
3.1780538303479458
27.0
math 모듈에서 지원하는 함수 몇가지만 사용해 본 예제다. 위와 같이 사용하면 된다.

json을 인코딩/디코딩 할 때 매우 편리하게 사용할 수 있는 json 모듈 등 유용한 기본 모듈이 상당히 많이 지원되고 있다. 표준 라이브러리 목록과 사용 방법은 내용이 방대하므로 파이썬 공식 홈페이지에서 제공하는 매뉴얼을 참고하는 것을 추천한다. 

표준 라이브러리 매뉴얼 주소 : https://docs.python.org/ko/3/library/index.html

파이썬에는 멋진 외부 모듈도 많다. 대표적으로 선형대수 라이브러리인 넘파이와 같은 외부 모듈도 꼭 활용해보면 좋겠다. 파이썬의 기본 연산 속도가 느리다고 생각되면 이 모듈을 쓰면 대규모 숫자들의 빠른 연산이 가능하다. 그리고 표준편차, 분산, 푸리에 변환 등을 빠르고 편리하게 계산하고 사용할 수 있다.

넘파이에 대한 이야기가 나왔으니 넘파이에 대해서 정리를 잘 해둔 블로그가 있어서 링크를 해두니 참고하자.

f-string 포맷팅


파이썬2까지는 문자열을 다룰 때 C에서 썼던 %-포맷팅 방법을 쓰거나 위의 while문 예제에서 사용했던 {}.format() 포맷팅 방식을 썼다. 그러나 파이썬3에서는 가독성이 떨어지는 이런 방법을 쓰지 않고도 f-string 포맷팅 방법을 사용할 수 있게 되어서 가독성이 좋아졌다.

간단한 사용법은 다음과 같다.
name = "송종식"
age = 38
memo = f"안녕하세요. 제 이름은 {name}입니다. {age}살이에요."
print(memo)

결과:--------------------------
안녕하세요. 제 이름은 송종식입니다. 38살이에요.
리액트, Vue와 같은 프론트엔드 프레임워크에서 사용하는 보간자와 비슷한 방법으로 사용하면 된다.
price = 1000
amount = 5
memo = f"사과{amount}개에 {amount*price}입니다"
print(memo)

결과:--------------------------
사과5개에 5000입니다
이런식으로 f-string을 이용해서 바로 연산을 처리할 수도 있다.
profile = {"name": "Jongsik Song", "age": 38}
data = f'이름은 {profile["name"]}이고 나이는 {profile["age"]}살 입니다'
print(data)

결과:--------------------------
이름은 Jongsik Song이고 나이는 38입니다
리스트와 딕셔너리를 활용할 때는 이와 같이 처리하면 된다. 홑따옴표와 쌍따옴표 사용에 주의하자. f-string은 날짜처리를 비롯해서 더욱 다양한 기능을 지원한다. 잘 활용하면 정말 편리한 기능이니 숙지하자. 

f-string 포맷팅에 대한 더 많은 정보는 다음 링크를 통해서 확인하자.

형변환


파이썬은 형변환이 유연하다.
a = 10
print(type(a))
a = "10"
print(type(a))

결과:-----------------
<class 'int'>
<class 'str'>
변수에 들어가는 값의 자료형이 바뀌면 변수에 자료형 변경을 가하는 작업을 하지 않아도 자동으로 변수형이 변한다. 변수 a가 int형에서 string형으로 자료형이 변한 것을 확인할 수 있다.

이상으로 파이썬을 다루기 위한 가장 기초적인 문법에 대해서 다루어 보았다.


2021년 3월 30일 화요일

주린이 분들의 나쁜 투자(매매)습관


개인적으로 '주린이'라는 단어를 호감하지는 않습니다. 누군가를 깔보는 느낌도 있고 그렇기 때문입니다. 그런데, 최근에는 보통명사처럼 쓰이고 있기에 그냥 편안하게 사용하게 되었습니다.

누구나 알고 계시겠지만 작년 3월 이후로 주린이분들이 정말 많이 늘어났습니다. 여러 경로를 통해서도 느끼고 피부로도 느끼고 있습니다.

여기저기 다니다 보면 가끔 주린이분들의 질문에 대응을 해야할 때가 있습니다. 얼마전에 잠시 즐겁게 시간을 보냈던 클럽하우스에서부터, 이메일, 텔레그램, 그리고 지인의 지인들까지..

아무래도 갓 입문을 하셨으니 모르는 것 투성이인 건 당연합니다. 그리고 투자관이 만들어지기 전이니 시행착오도 겪을 수 밖에 없습니다. 저 역시 입문하던 시절에는 그랬구요. 

어쨌든 여러 사람의 입에서 나오는 질문은 정말 다양합니다. 그럼에도 불구하고 몇가지 공통적인 질문들은 분명히 존재했습니다. 그런 것들은 따로 블로그나 유튜브에 컨텐츠로 만들어서 올려 보아도 괜찮겠다는 생각을 했습니다.

오늘 포스팅으로 작성할 내용은 매매습관? 투자습관에 관한 것입니다. 의외로 많은 분들이 이와 같은 실수를 하고 있었습니다.

흔히 폭락장에 용기를 내서 주식을 매수하기가 어렵다고 말하는 사람들이 많습니다. 그리고 이미 가지고 있는 주식이 폭락하면 버티다버티다 바닥에서 공포에 못 이기고 팔아버리는 사람들도 많다고 합니다.

그러나 제가 오다가다 만난 많은 주린이분들은 의외로 다른 행태를 가지고 있었습니다. 작년 3월에 보았듯이 폭락장에도 용감하게 주식을 척척 잘 산다고 했습니다. 폭락장 같은 것은 무섭지도 않다고 했습니다. 평가 손실은 평가 손실일 뿐 좋은 기업을 사서 갖고 있으면 언젠가는 수익이 난다고 믿는 사람들이 많았습니다.

의외였고 훌륭하다고 생각했습니다. 아마도 이들이 이런 투자관을 형성하게 된데에는 유튜브와 책, 블로그 같은 것들의 힘이 크지 않았나 생각합니다. 저는 개인적으로 삼프로TV를 잘 보지 않습니다. 그러나 가끔 가치투자 대가들이 나올 때는 즐겨봅니다. 그런 대형채널에서 투자관이 훌륭한 분들을 모시고 진행하는 방송은 분명히 사회 전체에 좋은 영향을 미칩니다. 대형 투자채널에서 투자관에 대한 교육을 자주 하다 보니 개인 투자자들의 투자관도 점진적으로 개선되고 있는 것으로 여겨집니다.

다만 그럼에도 불구하고 매우 나쁜 투자패턴 혹은 매매패턴이 공통적으로 나타났습니다.

이들은 대체로 평가 손실 구간에서는 기업을 믿고 엉덩이를 잘 붙이고 있었습니다. 마구잡이로 매수한 기업들이 아니라면 아주 잘 하는 것이죠. 성장성도 좋은 기업을 합리적인 가치보다 싸거나 좋은 가격에 샀다면 나무랄 것은 없습니다.

하지만, 수익이 날 때 많은 문제점이 노출되었습니다. 수익도 길게 잘 끌고 가는 특출난 주린이 분들도 계셨습니다. 그러나 많은 주린이 분들이 아주 작은 수익에도 그 수익이 없어질까 전전긍긍하였습니다. 그리고 대부분 3% 내지는 10~20% 정도의 수익을 내고 수익을 실현한다고 하였습니다.

이것은 추세추종을 하는 트레이더이든 가치투자를 하는 가치투자자이든, 데이나 스캘핑을 하는 단타매매자이든 누구에게도 좋은 방법이 아닙니다.

왜 언제 끝날지도 모르는 평가손실은 잘 보유하고 기다렸으면서 평가수익은 짧게 끊어치고 나오는지 모르겠습니다. 그렇게 하면 큰돈을 벌기 어렵습니다. 수익을 길게 끌고 갈 수 있어야 투자로 유의미한 결과를 얻을 수 있습니다.

산술적으로, 아니 상식적으로 생각해보세요. 1년여간 -50%까지도 버텼으면서 잠깐 +3%가 되었다고 홀라당 팔아버리면 좋은습관이 아닙니다.

레버리지를 쓰지 않았다고 가정하면 주식투자자들은 장기적으로 파지티브 게임에 참여하고 있는 것입니다. 투자한 1000원이 망해서 홀라당 사라지면 0원이 됩니다. 그걸로 끝입니다. 그러나 투자한 회사가 잘 성장하면 투자금 1000원은 2000원이 될수도 있고 3000원이 될수도 있고 10000원 또는 100000원이 될수도 있습니다. 

네거티브보다 파지티브 쪽의 기대값이 압도적으로 큽니다. 정상적인 기업은 인플레이션에 적극 대응하고, 신제품을 개발하며 열심히 일을 하고 성장하려는 욕구가 있습니다. 주식투자자들은 주식투자자가 되는 순간 유리한 게임에 발을 담그게 되는 것입니다.

그러므로 성장 잠재력이 큰 회사의 주식에 투자했고, 종목을 잘 구성하고 있다면 시간에 몸을 맡기고 기다리는 쪽의 승산이 더 높은 것입니다. 물론 중간중간에 어느 정도의 손질은 필요하겠죠.

반면에 평가손실 상태를 무한으로 기다리고 +3%나 +10%쯤 되면 팔아버리는 행위를 반복한다면 이는 장기적으로 음의 기대값을 가지고 게임에 참여하는 것이 되므로 큰 돈을 벌기 어렵습니다.

수익은 빨리 끊어버리고, 평가 손실중인 회사만 계좌에 득실대는 상태가 됩니다. 그 중 몇개는 잘못되어 영원히 손실 회복이 안되거나 정말 운이 나빠서 상장폐지의 길을 간다면 나머지 자금의 회전율을 높여서 손실분을 만회해야 하는데 이는 쉬운 것이 아닙니다. 손실회피 성향은 주린이 분들이 반드시 극복해야 하는 심리적 장벽이라고 느껴졌습니다. 이것을 극복하는 데에는 많은 훈련이 필요합니다.

그리고 이와 같은 나쁜 매매습관을 갖고 있으면 복리의 기적을 누리기도 힘듭니다. 누군가는 계속 샀다 팔았다 하면서 +3%씩 수익을 내면 그것도 장기적으로 복리 효과를 누리는게 아니냐고 반문할 수 있습니다. 그것도 틀린말은 아닙니다.

그러나 투자하고 있는 회사의 평가수익률이 100%, 200%, 300%를 넘어가면 알게 됩니다. 그 수준에서의 하루 등락이 내가 투자한 원금대비 얼마나 크게 움직이는 지를요. 이는 시간이 갈수록 더욱 강력해집니다.

기업에 대한 팔로업만 꾸준히 하고 가급적 매매를 지양했을 뿐인데도, 나중에는 종목이 하루에 1%만 움직여도 내 계좌는 원금대비 10%~20%, 나아가 몇 배씩 움직인다고 생각해보세요. 복리의 파워는 그렇게 누리는 것입니다.

매번 3% 수익낼 종목을 찾아 헤매다가 지뢰 하나를 밟으면 끝장입니다. 그것을 반복하는 것은 굉장한 노동력과 행운이 필요하며 생각보다 리턴도 크지 않습니다.

물론 회사에 따라서 적정 보유 기간이나 매매 기술을 달리해야 함은 물론입니다. 때에 따라서 어떤 회사는 담배 한모금만 빨고 재빨리 매도를 해야하는 경우도 많습니다. 어떤 회사는 산업의 사이클이 너무나 극명해서 찌들려 있을 때 사서 턴어라운드 할 때 힘껏 한싸이클을 누리고 바로 빠져 나와야 하는 경우도 있습니다.

그런 것이 어렵다면 지금까지 꾸준히 성장했고, 앞으로도 뻔하게 성장할 회사에 오래도록 동행하는 투자를 해보는 것이 가장 좋지 않나 생각합니다.

만일 어떤 기업에 투자해서 +300%까지 평가 수익이 났다가 다시 0으로 돌아오고, 심지어 마이너스로 돌아서면 어떻게 하느냐는 질문도 있을 수 있습니다.

이것에 대응하는 방법은 번뜩 생각 나는 게 두가지 정도가 있습니다. 우선은 포트폴리오 전체가 우상향 하도록 디자인하는 방법이 있습니다. 특정 종목이 오르락 내리락 하는 것은 무시하고 모든 종목이 조화되어 포트폴리오 규모가 우상향 하도록 잘 가꾸어 나가는 것입니다. 어떤 종목은 +300%까지 갔다가 다시 0%가 되기도 하고, 어떤 종목은 +200% 상태에서 +800%로 올라가기도 하고 어떤 종목은 계속 -10% 상태일 수도 있습니다. 이런 여러 종목을 잘 구성해서 포트폴리오 자체의 규모가 시간이 갈수록 커지도록 만드는 것입니다.

두번째는 약간의 트레이딩을 가미하는 것입니다. 보유종목이 꽤 고평가 상태까지 올라온데다 평가 수익이 너무 비대해졌다면 이 종목의 아주 일부분만 수익실현을 하는 것입니다. 보유중인 수량으로는 복리의 위력도 느끼면서 한편으로는 일부 현금화 한 것을 위안 삼아서, 나중에 주가가 조금 내려오더라도 어느 정도 아쉬움을 달래줄 수 있는 수준이면 됩니다.

이때 그 종목이 계속 올라가더라도 보유하고 있는 종목이 잘 되니까 좋고, 주가가 다시 크게 조정을 받으면 조금 확보한 현금으로 주식 수량을 늘리는 전략을 수행할 수도 있습니다.

여러분 각자에게 맞는 방법을 잘 만들어 나가면 되겠습니다. 근본적인 몇가지 원칙은 존재하지만 실전에서는 절대적인 방법은 없습니다. 자기에게 잘 맞는 방법을 찾으시길 바라겠습니다. 매수도 기다림, 매도도 기다림, 보유도 기다림..

2021년 3월 30일
송종식 드림