Gorio Tech Blog search

Python time, datetime 사용법(Python 시간 다루기)

|

이 글에서는 Python 라이브러리인 time과 datetime에 대해 알아본다. 가끔 쓰는데 막상 쓰려면 언제 봐도 헷갈리는 라이브러리 중 하나인 듯 하다.

추가로 numpy와 pandas에서 사용하는 datetime64에 대해서도 정리한다.


Import

import time
import datetime

공통적으로, strptime()은 str을 datetime 객체로, strftime()은 datetime을 str로 바꿔준다.

time

현재 시각: time.time()

1970년 1월 1일 0시 0분 0초 이후 경과한 시간을 초 단위로 반환한다. 2021년 기준 대략 16억의 값을 가진다.

print(time.time())
# 1620055042.444191

time 객체: time.localtime(secs)

float 형식의 seconds를 입력으로 주면 지역 시간대에 맞는 time 객체로 변환할 수 있다. 입력을 안 주면 현재 시간으로 계산한다.

반환된 값에서 .tm_year 등의 값을 그대로 가져올 수 있다. 연, 월, …, 초, 요일(tm_wday, 일요일=0, 토요일=6), 몇 번째 날짜(tm_yday, 1월 1일=0, 1월 2일=1), 일광 절약 시간(tm_isdst, 미적용=0, 적용=양수, 정보없음=음수)

print(time.localtime())
print(time.localtime(secs=time.time()))
print(time.localtime(time.time()).tm_year)

# result
time.struct_time(tm_year=2021, tm_mon=5, tm_mday=4, tm_hour=0, tm_min=19, 
                 tm_sec=51, tm_wday=1, tm_yday=124, tm_isdst=0)
time.struct_time(tm_year=2021, tm_mon=5, tm_mday=4, tm_hour=0, tm_min=19, 
                 tm_sec=51, tm_wday=1, tm_yday=124, tm_isdst=0)
2021

출력 포맷: time.strftime(format, time object)

datetime에도 비슷한 메서드가 있는데, string format time 정도라고 생각하면 된다.

time 객체가 주어지면 지정한 format으로 출력해준다.

now = time.localtime()
print(time.strftime('%Y%m%d', now))
print(time.strftime('%c', now))
print(time.strftime('%x', now))
print(time.strftime('%X', now))
print(time.strftime('%H%M%S', now))

# result
20210504
Tue May  4 00:41:07 2021
05/04/21
00:41:07
004107

출력 포맷 종류

출력 포맷은 다음과 같은 것이 있다.

Format Description Example
%c 날짜, 요일, 시간을 출력, 현재 시간대 기준 Tue May 4 00:33:26 2021
%x 날짜를 출력, 현재 시간대 기준 05/04/21
%X 시간을 출력, 현재 시간대 기준 00:33:26
%a 요일 줄임말 Sun, Mon, … Sat
%A 요일 Sunday, Monday, …, Saturday
%w 요일을 숫자로 표시, 월~일 0, 1, …, 6
%d 01, 02, …, 31
%b 월 줄임말 Jan, Feb, …, Dec
%B January, February, …, December
%m 숫자 월 01, 02, …, 12
%y 두 자릿수 연도 01, 02, …, 99
%Y 네 자릿수 연도 0001, 0002, …, 2017, 2018, 9999
%H 시(24hour) 00, 01, …, 23
%I 시(12hour) 01, 02, …, 12
%p AM, PM AM, PM
%M 00, 01, …, 59
%S 00, 01, …, 59
%Z 시간대 대한민국 표준시
%j 1월 1일부터 경과한 일수 001, 002, …, 366
%U 1년중 주차(월요일이 한 주의 시작) 00, 01, …, 53
%W 1년중 주차(월요일이 한 주의 시작) 00, 01, …, 53

datetime

datetime.time은 시간 기능(시, 분, 초, 마이크로초)을, datetime.date는 날짜 기능을(연, 월, 일), datetime.datetime은 날짜+시간을, datetime.timedelta는 시간의 차이를 구한다.

아래에서 소개하는 함수들은 datetime.date, datetime.time, datetime.datetime 모두에서 사용 가능하다.

현재 시각: datetime.datetime.today()

현재 시각 정보를 포함하는 datetime 객체를 반환한다. 연도부터 마이크로초까지 나온다.
물론 각 원소는 .year와 같이 접근할 수 있다.

print(datetime.datetime.today())
print(datetime.datetime.today().year)

# result
datetime.datetime(2021, 5, 4, 0, 44, 5, 707495)
2021

datetime.date.today()로는 현재 날짜를 구할 수 있다.

datetime.date.today() 

# result
datetime.date(2023, 4, 29)

원하는 시각으로 datetime 객체 생성하기

메서드는 다음과 같이 생겼다. 연, 월, 일 등을 지정하여 datetime 객체를 생성할 수 있다.

datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)

print(datetime.datetime(2021, 12, 25))
print(datetime.date(2021,12,25))

# result
2021-12-25 00:00:00
2021-12-25

문자열로 datetime 객체 생성하기 - strptime

문자열과 그 문자열이 어떻게 생겼는지를 지정하는 format을 같이 주면 datetime 객체가 생성된다.

d = datetime.datetime.strptime('20211225', '%Y%m%d')
print(type(d))
print(d)
# result
<class 'datetime.datetime'>
2021-12-25 00:00:00

datetime을 문자열로 바꾸기 - strftime

today = datetime.datetime.today()
print(today.strftime('%Y-%m-%d %H'))

# result
2023-04-29 21

numpy datetime64

  • 날짜 및 시간과 관련된 ISO 8601 국제표준 방식으로 str type의 값을 전달해 생성하거나
  • 유닉스 시각(UTC 1970.1.1 자정)부터 경과 시간을 초 단위로 환산해 나타낼 수 있다.
  • np의 datetime64는 마이크로초($10^{-6}$)가 아닌 아토초($10^{-18}$)까지 저장한다.
  • 단위 코드는 Y, M, W, M, h, m, s, ms, us, ns, ps, fs이다.

str로 생성하기

import numpy as np
np.datetime64('2023-04-29')

# result
numpy.datetime64('2023-04-29')

경과한 시간으로 생성하기

아래는 각각 나노초(ns), 일(Day), 초(second)으로 생성한 결과이다.

np.datetime64(1000, 'ns')
np.datetime64(100000, 'D')
np.datetime64(123456789, 's')

# result
numpy.datetime64('1970-01-01T00:00:00.000001000')
numpy.datetime64('2243-10-17')
numpy.datetime64('1973-11-29T21:33:09')

일련의 날짜 객체 생성하기

np.arange로 범위를 줄 때는 [시작, 끝) 범위로 주고, Day, Month, Year 간격으로 생성할 수 있다.

np.array(['2021-01-01', '2022-01-01', '2023-01-01'], dtype='datetime64')
# np.arange('2010-01-01', '2010-01-03', dtype='datetime64[H]') # TypeError
np.arange('2010-01', '2010-02', dtype='datetime64[D]')
np.arange('2010-01', '2011-09', dtype='datetime64[M]')
np.arange('2010-01', '2012-09', dtype='datetime64[Y]')

# result
array(['2021-01-01', '2022-01-01', '2023-01-01'], dtype='datetime64[D]')

array(['2010-01-01', '2010-01-02', '2010-01-03', '2010-01-04',
       '2010-01-05', '2010-01-06', '2010-01-07', '2010-01-08',
       '2010-01-09', '2010-01-10', '2010-01-11', '2010-01-12',
       '2010-01-13', '2010-01-14', '2010-01-15', '2010-01-16',
       '2010-01-17', '2010-01-18', '2010-01-19', '2010-01-20',
       '2010-01-21', '2010-01-22', '2010-01-23', '2010-01-24',
       '2010-01-25', '2010-01-26', '2010-01-27', '2010-01-28',
       '2010-01-29', '2010-01-30', '2010-01-31'], dtype='datetime64[D]')

array(['2010-01', '2010-02', '2010-03', '2010-04', '2010-05', '2010-06',
       '2010-07', '2010-08', '2010-09', '2010-10', '2010-11', '2010-12',
       '2011-01', '2011-02', '2011-03', '2011-04', '2011-05', '2011-06',
       '2011-07', '2011-08'], dtype='datetime64[M]')

array(['2010', '2011'], dtype='datetime64[Y]')

datetime64 날짜 간격 계산

둘 중 최소 날짜 단위로 계산해준다.

np.datetime64('2023-04-29') - np.datetime64('2021-05-18')
np.datetime64('2023-04') - np.datetime64('2021')

# result
numpy.timedelta64(711,'D')
numpy.timedelta64(27,'M')

Pandas

개념 Scalar class Array class data type 생성 방법
Date times Timestamp DatetimeIndex datetime64[ns] 또는 datetime64[ns, tz] to_datetime 또는 date_range
Time deltas Timedelta TimedeltaIndex timedelta64[ns] to_timedelta 또는 timedelta_range
Time spans Period PeriodIndex period[freq] Period 또는 period_range
Date offsets DateOffset None None DateOffset

Timestamp

  • Datetimes는 python 표준 라이브러리인 datetime이다. 특정 시점 하나를 지칭한다. (Timestamp)
  • 두 개 이상의 배열을 다룰 때는 DatetimeIndex를 사용한다.
  • date_range() 함수(또는 ~Index)는 연 또는 월 단위로 인자를 주면 [시작 연/월의 시작일, 끝 연/월의 시작일]범위로 생성해 준다.
import pandas as pd
pd.Timestamp(2323.345689, unit='D')
pd.Timestamp('2023-04-29')

pd.to_datetime('2023-04-29 21')
pd.to_datetime(['2023-04-29', '2023-04-30'])

pd.date_range('2020-02-01', '2020-02-07')
pd.date_range('2020-01', '2020-09')
# pd.date_range('2020', '2023')

# result
Timestamp('1976-05-12 08:17:47.529600017')
Timestamp('2023-04-29 00:00:00')

Timestamp('2023-04-29 21:00:00')
DatetimeIndex(['2023-04-29', '2023-04-30'], dtype='datetime64[ns]', freq=None)

DatetimeIndex(['2020-02-01', '2020-02-02', '2020-02-03', '2020-02-04',
               '2020-02-05', '2020-02-06', '2020-02-07'],
              dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
               '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
               '2020-01-09', '2020-01-10',
               ...
               '2020-08-23', '2020-08-24', '2020-08-25', '2020-08-26',
               '2020-08-27', '2020-08-28', '2020-08-29', '2020-08-30',
               '2020-08-31', '2020-09-01'],
              dtype='datetime64[ns]', length=245, freq='D')

Time spans

  • Time spans는 특정 시점이 아닌 기간을 의미한다. 하루 데이터면 0시 0분 0초부터 23시 59분 59초까지이다. 하나면 Period, 두 개 이상이면 PeriodIndex를 사용한다.
pd.Period('2019-01')
pd.Period('2019-04', freq='D')
pd.period_range('2020-01', '2020-02', freq='D')

# result
Period('2019-01', 'M')
Period('2019-04-01', 'D')
PeriodIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
             '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
             '2020-01-09', '2020-01-10', '2020-01-11', '2020-01-12',
             '2020-01-13', '2020-01-14', '2020-01-15', '2020-01-16',
             '2020-01-17', '2020-01-18', '2020-01-19', '2020-01-20',
             '2020-01-21', '2020-01-22', '2020-01-23', '2020-01-24',
             '2020-01-25', '2020-01-26', '2020-01-27', '2020-01-28',
             '2020-01-29', '2020-01-30', '2020-01-31', '2020-02-01'],
            dtype='period[D]')

Date times와 Time spans의 차이는 아래로 확인할 수 있다.

spans = pd.Period('2023-04-29')
stamp = pd.Timestamp('2023-04-29 12:34')
print(spans.start_time < stamp < spans.end_time)

# result
True

date_range(), period_range() 함수에 freq 인자를 다양하게 넣어줄 수 있다.

pd.date_range('2019-04', '2019-05', freq='B')
pd.date_range('2019-04', '2019-05', freq='W')
pd.date_range('2019-04', '2019-05', freq='W-MON')

# result
DatetimeIndex(['2019-04-01', '2019-04-02', '2019-04-03', '2019-04-04',
               '2019-04-05', '2019-04-08', '2019-04-09', '2019-04-10',
               '2019-04-11', '2019-04-12', '2019-04-15', '2019-04-16',
               '2019-04-17', '2019-04-18', '2019-04-19', '2019-04-22',
               '2019-04-23', '2019-04-24', '2019-04-25', '2019-04-26',
               '2019-04-29', '2019-04-30', '2019-05-01'],
              dtype='datetime64[ns]', freq='B')

DatetimeIndex(['2019-04-07', '2019-04-14', '2019-04-21', '2019-04-28'], dtype='datetime64[ns]', freq='W-SUN')

DatetimeIndex(['2019-04-01', '2019-04-08', '2019-04-15', '2019-04-22',
               '2019-04-29'],
              dtype='datetime64[ns]', freq='W-MON')

주기는 아래와 같은 것들이 있다.

Frequency Description
None 일반적인 간격, 달력상 1일 간격
B 영업일(평일), Business Days
W 주말
M 각 월의 마지막 날
MS 각 월의 첫날
BM 주말이 아닌 평일 중 각 월의 마지막 날
BMS 주말이 아닌 평일 중 각 월의 첫날
W-MON 주(월요일)



# result


References

Comment  Read more

Linux(Ubuntu) terminal 명령어 정리

|

이 글에서는 ubuntu terminal에서 사용하는 명령어를 정리한다.

Ctrl + F로 원하는 명령어를 검색하면 좋다.


파일 탐색 관련

ls 기본 옵션

심심하면 입력하는 기본 명령

ls

상세히 출력하기

# -l 옵션은 파일 권한, 생성/수정한 user, 파일 크기, 수정 시각 등의 자세한 옵션을 표시한다.
# -h 옵션은 -l과 같이 쓰면 파일 크기를 알아보기 쉽게 표시해준다.
# -a 옵션은 숨겨진 파일 혹은 링크까지 같이 표시해준다.
ls -ahl

출력 개수 제한

# 상위 4줄만 표시
ls | head -4

개수 세기

현재 위치에 있는 디렉토리 개수

하위 디렉토리는 체크하지 않으며, 현재 위치의 파일은 개수에 포함되지 않는다.

ls -l | grep ^d | wc -l

현재 위치에 있는 파일 개수

하위 디렉토리는 체크하지 않으며, 현재 위치의 디렉토리는 개수에 포함되지 않는다.

ls -l | grep ^- | wc -l

현재 디렉토리에 포함되는 전체 파일 개수

하위 디렉토리 내의 파일을 포함하며, 디렉토리는 개수에 포함되지 않는다.

find . -type f | wc -l

Find 사용

find는 파일을 검색하는 명령어이다. lsgrep을 조합하는 방법보다 효율적인 명령어라고 한다.

fine --help 명령어를 터미널에 입력하면 도움말을 볼 수 있다.

Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

기본 옵션은 -print이므로 그냥 find만 입력하면 현재+하위 디렉토리의 모든 파일을 보여준다. find .와 같다.

.
./cuda_11.1.1_455.32.00_linux.run
./cuda
./cuda/include
./cuda/include/cudnn_cnn_train.h
...

파일 타입별로 검색

find . -type -d
# -type -d는 디렉토리 타입만
# -type -f는 파일 타입만

# 결과 예시
.
./cuda
./cuda/include
./cuda/lib64

필터링 및 대소문자 (미)구분

-name <표현식>은 표현식 형식에 맞는 파일만 검색하는 옵션이다.(대소문자 구분)
-iname <표현식>은 대소문자를 구분하지 않는다.

find . -type f -iname "*.txt"
find . -type d -name "*lib*"

파일 수정 시간 필터링

  • -mmin : 수정시간 기준(분), modify + minute
  • -mtime: 수정시간 기준(일)
  • -cmin : 생성시간 기준(분), create + minute
  • -ctime: 생성시간 기준(일)
# 수정한 지 60분 이상 된 파일을 검색한다.
find . -mmin +60 -type f

파일 크기 필터링

# 100byte 이하 파일만 검색
find . -size -100c -type f
# 128kb 이상 파일만 검색
find . -size +128k -type f

현재+하위 디렉토리에서 특정 확장자 파일 모두 제거

# 아래는 확장자가 tsv인 파일을 찾아 제거한다.
find . -type f -name "*.tsv" -exec rm {} \;

파일 용량

전체 디렉토리 총 용량 표시

du 명령어는 현재 디렉토리(혹은 지정한 디렉토리) 및 그 하위 디렉토리의 총 용량을 전부 표시한다.

du # du .와 같다.
du /etc

특정 디렉토리 총 용량 표시

-s 옵션을 붙인다. kbyte 단위로 표시되며, MB, GB 등의 단위로 편하게 보려면 -h 옵션을 추가한다.

du -s /etc
du -sh /etc
du -sh /etc/*

특정 디렉토리 및 하위 n단계 디렉토리 총 용량 표시

-d <number> 옵션을 붙인다. 아래 예시는 /etc 및 바로 아래 포함된 디렉토리만의 총 용량을 표시한다.

du -d 1 /etc

디렉토리 및 파일의 용량 표시

du 명령어에서 -a 옵션을 붙이면 하위 파일의 용량까지 같이 표시할 수 있다.

du -a /etc

디스크 사용량

df 명령어를 사용한다. 위와 마찬가지로 편한 단위로 보려면 -h 옵션을 쓴다.

df
df -h

Symbolic link 관련

hard link과 symbolic link 두 종류가 존재하는데, 둘 다 바로가기 같은 개념이지만 차이가 조금 있다.

  • ln 뒤에 -s 옵션을 주면 symbolic link로 생성된다.
  • 원본 파일과 hard link 파일은 디스크에서 완전히 동일한 파일이다.
  • symbolic link 파일은 원본과는 다른 파일이고 링크만 가지고 있다.
# 원본 경로는 파일일 수도, directory일 수도 있다.
ln -s <원본 경로> <link 경로>
ln -s ~/data/Charades/Charades_v1_480/  dataset/ag/videos
# hard link는 -s 옵션을 붙이지 않는다.
ln <원본 경로> <link 경로>

링크 삭제

rm -f <link 경로>
rm -f dataset/ag/videos
# 경로 마지막에 /를 붙이면 삭제가 되지 않는다.

폴더에 대한 삭제나 파일에 대한 삭제 모두 rm -f로 삭제할 수 있다. 원본은 삭제되지 않는다.
rm -rf로 삭제하면 원본이 삭제된다.

참고로, symbolic link의 원본을 삭제하면 link는 존재하지만 실제로 파일에 접근할 수는 없다.
ls 등의 명령어로 확인하면 빨간색으로 표시된다.

hard link의 경우에는 원본을 삭제해도 (원본의 복사본) 파일에 접근 가능하다.


압축 관련

zip, unzip

압축하기

zip <압축파일명.zip> [-r] <압축할 파일or디렉토리 path 1> [ <압축할 파일or디렉토리 path 2> ...]
zip gorio.zip gorio1.txt gorio2.txt
zip gorio.zip -r gorio_dir/
zip gorio.zip -r ./Downloads/*
# ...

압축풀기

unzip <filename>
# 해제된 파일들이 저장될 디렉토리를 지정하고 싶으면 -d 옵션을 사용한다.(d=directory)
unzip <filename> -d <path>

여러 압축파일 한 번에 풀기

unzip '<zipfiles>' [-d <dir>]의 형식이다.

따옴표를 쓰지 않으면 filename not matched 에러가 뜬다.

# 여러 압축 파일을 지정해도 된다.
unzip a.zip b.zip c.zip
# 전부를 지정할 수도 있다. 이때는 따옴표를 꼭 써 줘야 한다.
unzip '*.zip' -d data/

tar, tar.gz

용량을 줄이는 압축 방법은 tar.gz 형식으로 압축하는 것이고, tar 형식은 단지 하나의 파일로 합치는 archiving 방식이다.

tar.gz로 처리하려면 옵션에 z를 더 붙이면 된다.

옵션 설명은 아래와 같다.

  • -c : 파일을 tar로 묶음
  • -x : tar 압축을 풀때 사용함
  • -v : 묶거나 파일을 풀때 과정을 화면에 출력
  • -f : 파일이름을 지정
  • -z : gzip으로 압축하거나 해제
  • -C : 경로를 지정
  • -p : 파일 권한을 저장

압축하기: tar -cvf, tar -zcvf

# 디렉토리를 tar로 압축하기
tar -cvf [압축파일명.tar] [압축하기위한 디렉토리]
# 파일들을 tar로 압축하기
tar -cvf [압축파일명.tar] [파일1] [파일2] [...]

# 디렉토리를 tar.gz로 압축하기
tar -zcvf [압축파일명.tar.gz] [압축하기위한 디렉토리]
# 파일 tar.gz 압축하기
tar -zcvf [압축파일명.tar.gz] [파일1] [파일2] [...]

압축풀기: tar -xvf, tar -zxvf

-c 옵션을 -x로 바꿔주기만 하면 된다.

# tar 파일 압축풀기
tar -xvf [압축파일명.tar]

# tar.gz 파일 압축풀기
tar -zxvf [압축파일명.tar.gz] 

여러 압축파일 한 번에 풀기

tar 또는 tar.gz 확장자를 갖는 파일들을 찾고 위의 압축풀기 명령을 각각에 대해 수행하는 코드이다.

# tar 형식
find . -name '*.tar' -exec tar -xvf {} \;
# tar.gz 형식
find . -name '*.tar.gz' -exec tar zxvf {} \;

Process 관련

Defunct Process

Defunct Process(좀비 프로세스) 찾기

ps -ef | grep defunct | grep -v grep

Defunct Process(좀비 프로세스) 개수 출력

ps -ef | grep defunct | grep -v grep | wc -l

defunct(zombie) process(좀비 프로세스) 죽이기

ps -ef | grep defunct | awk '{print $3}' | xargs kill -9

Kill process

sudo kill -9 $PID

Nvidia-smi

0.5초마다 업데이트

watch -d -n 0.5 nvidia-smi

PATH 확인

cuda 위치 확인

보통 /usr/local/cuda에 있다.

locate cuda | grep /cuda$
# or
find / -type d -name cuda 2>/dev/null

기타

오류 해결

\r command not found

파일에 ‘\r’이 포함되어 코드가 제대로 작동하지 않는 오류(보통 운영체제의 차이로 인해 발생). 다음 코드를 수행하면 해결된다.

sed -i 's/\r$//' <filename>

(지속 업데이트 예정)

Comment  Read more

LINK 코인(라인코인) 2021 계획 및 백서 요약

|

이 글에서는 라인 블록체인 사업의 일부인 링크코인에 대한 내용을 정리한다.

2021년 링크코인 계획(notice)와 백서(white paper)를 요약 정리하였다.
그림을 포함 내용의 출처는 글의 최하단에서 찾을 수 있다.


2021년 계획

목적

  • LINE Blockchain 생태계 확장
  • LINE Blockchain 프로젝트의 투명성과 이해도를 증가, 확장하여 LINE Blockchain 생태계의 health를 보장하고자 함

요약

  • LINE Blockchain은 2018년 시작되어 토큰경제와 블록체인을 구현하기 위한 기본 플랫폼과 조절체계(regulatory system)을 구축해 왔음
  • LINE Blockchain은 LINK의 유동성과 유용성을 확장하기 위한 의도를 갖고 있으며 LINE Blockchain의 대중화를 실현시키고자 함.
    • 이는 2021년 시작한 블록체인 기반 dApps(댑)과 새로운 서비스를 확장하여 이루고자 함

계획

  1. 사업 계획
    1. LINK가 있는 곳에 환전 기능 추가
    2. 결제 시스템과 제휴
    3. NFT-관련 서비스 확장
    4. dApps의 확장
  2. LINK 발행 계획
    1. 발행 및 배포 계획: LINK를 결제와 대출의 수단으로 쓰는 사람들에 대한 reward, DApps 가속화 등에 사용
    2. 추가 유통량
      • 기간: 2021.01.01 ~ 2021.12.31
      • 실제 배포 시점에 기반한 가격으로 1~2천만 엔 수준
      • LINK로 계산하면 41만~83만 LN(30일 평균 종가 기준)
      • 6.86~13.72%만큼 발행됨
    3. 발행량 정의
      • 초기 3년간 최대 1억 LN으로 제한되며, 이후로는 연간 5%씩 증가한다. 즉 1억 5백만, 1억 1025만, …
      • 발행 한계는 유통량을 의미하지는 않는다. 실제 발행량은 시장의 상황에 따라 변동된다.
      • 첫 발행이 2018년 9월 3일이기 때문에 “초기 3년”은 2021년 9월 4일에 종료된다.

Q&A(Jan 2021)

  • 추가 상장은 검토 중에 있다.
  • 발행 한도 증가 계획은 없고 신규 발행은 전부 공식 홈페이지에서 발 수 있다.
  • Node의 수를 증가시킬 계획은 현재는 없다.
  • LN의 매매제한 정책이나 이자상품 한도 등의 변경 계획은 답변하지 어려우나 최대한 많은 사람들이 쉽게 접근할 수 있도록 할 계획이다.
  • LN의 실 사용 계획은?
    • 쉽게 사용할 수 있고 보유 혹은 결제 시 혜택을 줄 수 있도록 하는 것이 주 목표
    • 그냥 자산으로서 존재하는 것이 아닌 실생활과 긴밀하게 연결될 수 있도록 할 계획
  • 개인이나 기관에 직접 판매하지 않으며 그럴 계획은 없다고 한다.
  • 현재 정책 등은 금융규제 방향에 맞추어 계속해서 변화할 수 있다.


Factbook

  • 라인과 블록체인 역사
  • LINE Blockchain 역사
    • 거래소는 Bitmax에서 Bitfront로 2020년 변경되었다.

LINE BlockChain

라인 블록체인은 다음 4가지로 구성되어 있다.

  1. LINK(Chrypto Asset)
  2. Crypto Asset이 운용되는 MainNet
  3. MainNet의 쉽고 편리한 분산어플리케이션을 구축할 수 있게 돕는 Platform
    • 가치의 저장, 전송, 소유의 증명 등 금융 기능에 집중한 부분
    • Virtual Machine, Consensus Algorithm, Blockchain Privacy 제공
    • 안정성, 성능의 확장성, 추적 가능한 익명성을 확보
    • 거래의 확정성(BFT Altorithm), PoS, VFT, 지분 증명 기능, 탈중앙화 등을 얻을 수 있음.
  4. Line CBDC Platform

여러 곳과 협업 중:

LINE Blockchain Mainnet

  • 2초마다 블록 생성
  • 수십만 개의 contribution mining, user 수 등
  • 일본에서 28번째로 등록된 디지털 자산
  • (2021년 1월) $90M의 시가총액
  • 절반 정도의 LN이 deposited되어 있다.

BlockChain Platform

LINE Blockchain Developers

  • 자신의 시스템에 블록체인 기술을 적용가능하도록 지원한다.
  • Developer Console, Open API, Wallet Integration 등을 제공한다.

BITMAX Wallet

  • 라인 계정과 통합되며, Token Management가 이루어진다.
  • dApp Browser가 있어서 라인 블록체인에 기반한 서비스를 이용할 수 있다.

Token Econoomy Flow

서비스 성장에 적극적으로 기여(Contribution Mining)한 유저에게 보상을 할 수 있고, 그것은 LINK 화폐로 이루어질 수 있다.

  • 일본에서 주로 서비스된다.
  • 라인 메신저 안에서 거래가 가능하다(dApp Browser).
  • 상황에 따라 달라질 수 있지만 12% 이자 상품이 있다.


References

Comment  Read more

중국 보험업의 선두 주자, 평안보험(Ping An of China)

|

본 글은 2021년 4월에 작성되었으며, 시간이 지남에 따라 본 글에 포함된 정보에는 변동이 발생한다 점을 기억해두시기 바라며, 개인적인 공부와 기록을 위해 작성되었기 때문에 오류 및 주관적 해석이 포함되어 있을 수 있기 때문에 오직 참고용으로만 활용하시기 바랍니다.

아직도 전 세계적으로는 코로나19의 그늘에서 벗어나지 못하고 있지만, G2라 불리는 미국과 중국의 상황은 조금 다르다. 물론 백신 보급이 끝난 것도 아니고 국지적으로 여러 문제가 지속적으로 발생하고 있지만, 많은 기관들이 미국과 중국의 빠른 경기 회복과 경제 성장을 전망하고 있다.

본 글에서는 중국의 경기 회복 및 경제 성장과 맞물려 실적 회복이 예상되면서도 장기적으로 성장할 수 있는 기업으로 판단되는 평안보험, 601318 SHA에 대해 알아볼 것이다.

1. Background

로고에서도 드러나듯, 이 기업은 테크와 금융을 결합한 기업이다. 보험업을 중심으로 보험, 증권, 은행업을 영위하고 있는 종합 금융회사이며, 핀테크/헬스케어 자회사를 두고 있다. 2020년 기준 중국에서 생명보험 1위, 손해보험 2위의 자리를 차지하고 있기도 하다. 2019년만해도 생명보험 2위였으나 지속적인 성장을 통해 1위의 자리를 차지한 것으로 보인다.

아래는 2020년 말 중국의 증권매체 증권시보와 증시정보 플랫폼 수쥐바오가 제시한 유망한 중국 경기 순환주 리스트의 일부이다.

평안보험이 가장 높은 순위를 차지하고 있는데, 이들 매체에 따르면 앞으로 주목할 만한 순이익 증가율을 보여줄 것으로 기대된다고 한다.

2. Financials

2020년 1분기 기준 이익구조는 아래와 같다.

구성은 위와 같지만 절대적인 순이익의 경우 2019년 1분기에 비해 42.7% 감소한 수치를 보여주었는데, 이는 금융 위기 이후 처음으로 역성장한 것이라고 한다.

미래에셋대우의 강효주 연구원님의 리포트를 참고하면, 오프라인 영업의 중단으로 설계사 위주로 판매되던 고마진의 보장성 보험 업무가 큰 타격을 받았다고 한다.

코로나19가 완전히 종식된 것은 아니지만, 중국은 (적어도 미디어를 통해 본 바로는) 특히 유럽이나 신흥국에 비해 빠르게 회복하고 있는 것으로 보이며 이에 따라 평안 보험의 실적도 2021년에는 상당 부분 회복될 것으로 기대된다.

평안 보험의 2020년까지의 실적과 앞으로의 실적 전망치는 아래와 같다.

삼성증권 리포트에 따르면 매출과 영업이익의 드라마틱한 성장보다는 순이익이 증가함에 따라 EPS의 성장을 전망하는 것으로 보인다. (리포트마다 수치가 조금씩 다르다.) 실제로 보험회사의 경우 2020년까지 이어져온 저금리 추세로 인해 수익성이 지속적으로 악화되어 왔다. 우리나라 보험사의 경우도 생보사 손보사 할 것 없이 2014년 이후 운용자산이익률은 4% 대에서 3%대로 하락하였다.

과거에 판매하였던 확정형 고금리 상품이 현재 상황에서는 보험사의 발목을 잡고 있는 셈이다. 중국 보험사들의 상황도 크게 다르지 않았고, 평안보험 역시 저금리 기조에 따라 손해를 피할 수는 없었다.

다만 코로나19에서 점차적으로 회복하면서 경기 정상화와 기업들의 실적 향상이 기대됨에 따라 금리 상승에 대한 기대감이 점차적으로 커지고 있다. 이러한 상승 추세가 일시적으로 끝날지 혹은 지속될지에 대해서는 의견이 분분하지만 적어도 당분간은 상승국면에 접어들 것이라는 의견이 지배적이다.

이에 따라 평안보험의 2021년 수익은 일정 부분 정상화될 가능성이 높아보이고, 오프라인 대면 영업 실적 또한 회복된다면 긍정적인 실적을 기록할 수 있을 것으로 예상된다.

3. 투자 포인트

우리나라에서는 이미 보험업은 성장을 멈춘 산업으로 평가받고 있지만, 중국의 경우는 그렇지 않다. 중국에서의 보험업은 성장하는 산업이다. 중국의 보험시장 침투율은 글로벌 최하위 수준이며, 향후 지속적인 성장이 기대되고 있다. (미국의 GDP 대비 보험침투율은 11%, 중국은 4% 수준이다.) 중국의 GDP 성장폭 또한 과거에 비해 둔화되었고, 인구 구조 또한 서서히 선진국과 유사하게 바뀌고 있다면 중국의 보험 시장은 다른 선진국들이 수십년 전에 걸어왔던 길을 비슷하게 걸어갈 가능성이 매우 높다고 할 수 있다.

평안보험은 위 주가 그래프를 보면 알 수 있듯이, 꾸준히 성장해온 기업이다. 최근 중국의 유동성 조절 작업 등과 맞물려 주가가 조정을 받고는 있지만 장기적으로 우상향 추세를 그리고 있다. 시장의 성장성은 분명하고, 평안보험이 성장하는 시장 속에서 지금과 같은, 혹은 더 큰 점유율을 보여준다면 평안보험에 투자할 가치는 충분하다고 생각할 수 있다.

캐시 카우 역할을 하는 전통 보험업과 더불어 평안보험에는 주목할 만한 부분이 더 존재한다. 먼저 글의 서두에서도 밝혔듯이 본 기업은 기술에도 많은 투자를 하는 기업이다. 매출의 1%에 해당하는 1.6조원 정도를 매년 기술 발전에 투자하고 있는 기업이며 2020년 말 기준 31,000건의 핀테크, AI관련 특허 보유하고 있는 기업이다.

사실 우리나라의 은행, 보험회사들을 생각해보면 최근 들어서야 IT관련 인력들을 채용하고 늦게나마 디지털 타이틀을 달고 혁신을 외치고 있는 형국인데, 평안보험은 2008년에 평안테크놀로지라는 자회사를 설립하면서 핀테크 연구를 시작했을 정도로 오래된 내공을 자랑하고 있다. 지난 10년간 이 자회사는 인슈어테크 분야에 누적 17조원을 투자해왔고, 향후 5년 동안 같은 금액을 추가로 투자할 계획이라고 한다.

이러한 평안보험의 디지털에 대한 투자는 매력적인 자회사들을 통해서도 나타난다. 사실 평안보험 산하에는 여러 자회사들이 있는데, 가장 대표적인 회사로는 다음 기업들을 뽑을 수 있겠다.

루닷컴, 금융이장통, 평안굿닥터

앞의 2개의 기업은 핀테크, 평안굿닥터는 원격의료 헬스케어 기업이다. 모두 유니콘 급 기업들이며 앞으로의 성장성이 매우 기대되는 기업이라고 할 수 있다.

루닷컴의 경우 온라인 자산관리를 주 사업으로 영위하고 있으며 지방 정부에 금융서비스를 제공하기도 한다. KPMG가 선정한 글로벌 100대 핀테크 기업 중 10위를 차지하기도 하였다. 금융이장통은 핀테크 기술을 만들어서 이를 판매하는 기업으로 대표적인 상품으로는 스마트 보험 시스템 등이 있다. 평안굿닥터 역시 치킨게임을 통해 5개 정도의 기업만이 살아남은 중국 원격의료 기업 중 1위를 차지하고 있다.

4. Wrap-up

중국 기업에 투자하는 것은 한국, 미국 기업에 투자하는 것에 비해 진입장벽이 좀 있는 편이다. 중국어를 유창하게 하는 것이 아니라면 정보 접근성도 제한되고, 아무래도 정치적인 리스크가 크다보니 이에 대한 대응을 하기는 쉽지는 않다.

따라서 중국 기업에 투자할 때는 탄탄한 사업 모델과 강한 시장 지배력을 갖고 있는 기업에 투자하는 것이 안정적이라고 판단하는 바, 평안보험은 이러한 조건에 들어 맞을 가능성이 높은 기업으로 생각한다.

2020년 대표적인 리스크로 언급되었던 오프라인 대면 영업 감소와 저금리로 인한 수익성 악화가 2021년에 상당 부분 턴어라운드할 것으로 보여 기대감이 일고 있는 상황에서, 실제로 이 기대감을 충족시킬 수 있는 실적을 내놓을 수 있을지 살펴보면서 투자를 고려하는 것이 필요할 것이다.


References
1) 미래에셋대우 리서치센터
2) KB증권 리서치센터

Comment  Read more

금리 상승기에 주목해야 하는 ETF, Vanguard Financials ETF (VFH)

|

본 글은 2021년 4월에 작성되었으며, 시간이 지남에 따라 본 글에 포함된 정보에는 변동이 발생한다는 점을 꼭 염두에 두시기 바랍니다.

인덱스 펀드의 창시자 존 보글이 창립한 Vanguard의 ETF 중 하나인 VFH ETF는 대표적인 미국의 금융주 ETF이다.

최근 몇 달 간 미 국채 금리의 상승과 장단기 금리차 확대, 그리고 경기 회복에 대한 기대감등이 맞물리면서 본 ETF는 큰 조정 없이 꾸준한 상승을 기록하였다.

사실 지금 시기에 VFH 혹은 VFH에 포함된 종목들을 매수하는 것이 아주 현명한 판단인지에 대해서는 확답을 내리기 어렵다. 코로나19 이전의 주가를 넘어 사상 최고치를 경신하고 있는 경우도 발생하고 있는데, 과연 이것이 적절한 기대감의 반영인지, 과도한 선 반영인지는 시간이 지난 다음에야 정확히 알 수 있을 것이다.

사실 현재의 주가 상승은 적어도 작년 말 백신 개발 소식 이후 더욱 본격적으로 리플레이션 트레이딩이 대두되기 시작 했을 때에는 본 종목을 매수한 투자자들이 누려야 할 이익이지, 이제 와서 매수를 고려할 단계는 아니라고 주장하는 전문가들도 많고, 필자도 이에 대해 상당 부분 동의하는 바이다.

그럼에도 불구하고 이 ETF와 그에 속한 종목들에 대해 다시 한 번 짚고 넘어가야하는 이유는 다음과 같다.

1) 디플레이션 압박의 강도에 따라 상황이 바뀔 수는 있지만, 현재로서는 당분간 금리의 상승과 장단기 금리차의 확대가 지속될 가능성이 높고, 이에 따라 금융주들의 수익성은 더욱 향상될 가능성이 높다.
2) 지금 당장은 크게 영향을 받지 않겠지만, 코로나19 기간 동안 Square, Social Finance, Lemonade와 같은 새로운 형태의 금융 기업들이 큰 주목을 받았는데 이러한 기업들과의 관계에 대해 앞으로도 지속적으로 주목해보아야 한다.

VFH는 미국 기업만을 포함하고 있으며 주요 기업들의 목록은 아래와 같다.

은행, 보험, 투자은행 회사들이 주류를 이루고 있으며, TOP 10의 회사들의 점유율은 41.5%에 달한다. JP모건, 버크셔 해서웨이, 뱅크오브아메리카 등 미국의 굵직한 전통 금융사들을 담은 ETF라고 할 수 있다.

2021년 4월 4일 기준 배당률은 약 1.9% 정도이며, ETF에 대한 보다 상세한 정보를 알고 싶다면 아래 페이지들을 참조하길 바란다.

ETF닷컴, Seeking Alpha

유동성 장세에서 실적 장세로 넘어가고 있는 지금, 실적 장세의 길이에 대한 의견은 상당히 분분한 편이다. 강세장의 초입이라고 주장하는 전문가들은 실적이 우수한 기업들의 경우 앞으로 좋은 주가 흐름을 보일 것이라고 예상하고 있고, 강세장의 후기라고 주장하는 전문가들이나 버블을 경고하는 전문가들은 실적 장세가 그리 오래 가지 않을 수도 있다고 이야기하고 있다.

어떤 의견이 정확히 들어 맞을지 확신하기는 어려우나, 본 ETF에 포함된 주요 종목들은 2021년 미국의 경기 회복과 더불어 좋은 실적을 발표할 가능성이 높은 기업들에 해당한다. 따라서 드라마틱한 수익률을 기대할 수는 없겠지만, 최근 흐름을 살펴볼 때 단기, 중기적으로 포트폴리오에 포함하는 것을 고려해볼 수 있지 않을까 생각해본다.

그리고 더 나아가서, 이러한 전통 금융주들이 앞으로 어떻게 경쟁력을 강화해 나갈 수 있을 지에 대한 공부도 지속하면 좋을 것이다. 이들의 오랜 역사와 경력, 시장에서의 영향력이 굉장히 큰 것은 사실이다. 그러나 특히 전통 은행들의 경우 그 규모가 큰 만큼 혁신의 속도는 시대를 따라가지 못할 가능성이 있다. 따라서 단순히 금리 상승이라는 이유만으로 이들에 대한 매수를 고려하기 보다는, 전반적인 경제 상황과 각 기업의 경쟁력을 분석해보고 투자의 기간을 결정하는 것이 현명할 것이다.

Comment  Read more