반응형
반응형

[Project] 주식을 몇 시에 매수하는 것이 가장 좋을까??

Quant|2022. 9. 23. 22:11
반응형
반응형

댓글()

[Skewness Volatility] 왜 떨어짐은 크고, 상승은 작은가?

Quant|2022. 9. 20. 23:29
반응형

시장이 Bear market으로 형성되면 주가가 급하게 떨어지는 모습을 자주 볼 수 있다.
이는 시장의 심리적인 요인이 아주 크게 작용한다.
이러한 현상으로 인해 풋옵션의 프리미엄이 콜옵션의 프리미엄보다 커지게 되고,
"Skewness Volatility" (변동성의 비대칭성)이 나타난다.

간단한 프로젝트로 QQQ의 변동 데이터를 통해 실제로 주가의 상승 폭보다, 하락 폭이 큰지 직접 확인해 보려한다.

1. 데이터 구하기

QQQ의 가격 데이터는 Investing 사이트에서 제공하는 csv 파일을 사용하였다.
근 5년간의 데이터를 사용하였다.

인베스코QQQ ETF 과거 데이터 - Investing.com

인베스코QQQ(QQQ)ETF历史数据一览,包括인베스코QQQ(QQQ)ETF历史行情,年化收益率,每日净值和涨跌走势图表。

kr.investing.com

data.csv
0.01MB

2. 데이터 전처리

근 5년간의 데이터를 사용하려고 보니, 이 기간은 대세 상승장이었고,
하락 값과 상승 값의 비율이 전혀 맞지 않았다.
따라서 V자 반등 구간의 데이터만 사용하였다.

또한, Skewness의 모습을 최대한 나타내기 위해 약보합 +-0.3% 이내의 구간인 날들은 데이터 프레임에서 제거하였다.

# 기존 index를 제거
df.set_index('date', inplace=True)

# 현재 -> 과거 순에서 과거 -> 현재 순으로 바꿔줌
df = df.iloc[::-1]

# '%'가 있어 변동 값을 str값으로 인식하므로 %를 제거 후 숫자형으로 변환
df['volatility'] = df['volatility'].str.replace('%', '')
df['volatility'] = pd.to_numeric(df['volatility'])

# -0.3 ~ 0.3% 수준의 보합은 제거
condition = df[ (-0.3 < df['volatility']) & (df['volatility'] < 0.3)].index
df = df.drop(condition)
Data Frame
a = df.loc[condition, 'volatility'].count()
b = df.loc[~condition, 'volatility'].count()
print("하락한 날의 수는",a ,"개", "상승한 날의 수는",b ,"개 입니다.")
22개 차이나지면 분포에 큰 영향은 없다

3. 분포 확인

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker


plt.figure(figsize=(20,8))
ax = plt.subplot()

ax.xaxis.set_major_locator(ticker.MultipleLocator(16))
ax.yaxis.set_major_locator(ticker.MultipleLocator(2))
ax.yaxis.set_minor_locator(ticker.MultipleLocator(0.5))


plt.scatter(df.index, df['volatility'], color=df['color']) 
plt.xticks(rotation=45)
plt.grid(True)

# y축 범위 설정
plt.ylim(-12,12)

plt.show()
+-2% 기준으로 파란색이 더 많음을 확인할 수 있다

4. 히스토그램

df.hist(bins=120, figsize=(6,6))
+- 1% 구간을 제외하고는 확실히 그래프가 right skewed 임을 확인 할 수 있다.
히스토그램이 밋밋한 부분은 시각화를 더 공부하면서 극복해보도록 하겠다.

메인 질문 "왜 떨어짐은 크고, 상승은 작은가?" 에 대한 답은 추후에 글을 쓰도록 하겠다.

반응형

댓글()

[금융 상품] 달러의 역사 - 미국이 기축통화 지위를 버릴 수 밖에 없는 이유 (월가아재)

Quant|2022. 9. 7. 16:34
반응형

아래 영상을 참고해 작성했습니다.

 

주요 통화의 역사

 

19세기 ~ 1차세계 대전에는: 영국의 금본위제 기반의 파운드화가 기축통화 역할을 했습니다.

1차세계 대전이 끝나며 영국의 수출경쟁력 악화로 금 유출이 가속화 되면서, 금 유출 발생 및 금 본위 중단되었죠

이후 영국의 금 본위 부활하긴 했지만 환율을 1차세계 대전 이전과 같이 유지하면서 금 유출 가속화되었습니다.

 

따라서 영국은 채무국으로 몰락, 채권자의 미국의 금소유가 증가하게 되었죠.

 

반면 미국은 브레튼 우즈 체제를 구축해 영국에서 유출된 금 독점하고 금태환을 실시했습니다.

그 대가로 미국의 해군력과 자국시장을 타국에 제공하며 달러가 기축통화로 부상했죠.

 

하지만 트리핀의 딜레마가 발생하며 미국은 전세계의 달러 사용을 위해 달러 발행을 늘려 가치를 낮추거나, 

달러 가치를 지키기 위해 달러 발행을 줄여 국제무역에서 달러 부족을 야기할지 선택을 해야했습니다.

 

결국 일본과 영국의 급 부상으로 미국의 적자가 발생하고,

베트남전으로 미국의 재정 지출이 늘어나는 상황이 발생

 

달러의 신뢰도는 떨어지고, 금태환 요구증가로 금 유출이 발생하며

브레튼 우즈 체제는 무너지게 되었다.

 

사태를 해결하고자, 1971년 닉슨 대통령이 금 태환 제도를 폐지, 신용 화폐 시스템을 도입했다.

 

금본위제가 달러가 금에 기반 했다면, 신용화폐 시스템은 신뢰를 기반으로 지폐를 사용한다.

 

 

그렇다면 미국은 어떻게 신용 화폐 시스템을 구축했을까?

1940년대 2차세계대전 사우디는 자국을 보호해줄 강대국이 절실했고, 미국은 원유의 중요성을 느껴며 둘의 이해관계가 맞았다.

 

사우디-미국의 비밀협약으로 미국은 사우디에서 원유를 수입하며 군사 원조를 해주고,

사우디는 원유 판매 대금으로 미국 국채를 구매해 달러의 기축통화 지위를 유지시켰다.    

 

이를 페트로달러 시스템 일명 석유 본위제로 부른다.

사우디가 돈을 막 썼을 때 달러 = 원유이므로 돈을 쓴 만큼 원유를 생산해야 하는데, 

이는 달러가치의 하락으로 이어진다. 

그래서 미국채 매입을 요구한 것이고, 사우디 왕가 입장에서는 미국채는 자산을 은닉하기에 최고 수단이다.

 

왜 미국이 중동에 그렇게 관심이 많은지 이러한 맥락을 보면 이해할 수 있다.

 

하지만 페트로달러 시스템도 트리핀 딜레마가 존재한다.

 

전세계에 자국의 화폐를 공급하면, 

무역적자 발생 -> 화폐가치 하락 -> 값싼 물가 -> 수출 경쟁력 상승으로 자정작용이 발생해야 하는데, 미국의 달러는 금이나 원유에 달러가 묶여있기에 이러한 자정작용이 불가능했다.

 

금본위제 같은 경우 무역적자가 발생하면 화폐가치가 하락하는 것이 아니라, 가치가 있는 금유출이 발생한다.

페트로달러 시스템의 경우는 원유 유출이 아니라, 수출기반 산업과 제조 경쟁력이 유출 된다.

이로 Rust Belt라는 제조업 기반의 지역들이 무너지는 상황이 발생했다.

 

물론 기축통화가 이점도 있다.

돈을 찍어내도 화폐가치가 하락하지 않고, 다국적 기업이 진출하는데 이점이 있다.

미국채 수요로 인해 미국으로의 투자가 몰려 국채 금리를 낮게 유지하는 것이 가능하다.

 

그렇다면 왜 미국은 기축통화 지위를 버릴 수 있다고 말 하는 걸까?

크게 5가지 이유로 알 수 있다.

 

1. 냉전 후 불필요한 군비 지출

냉전, 원유, 기축통화 유지라는 세가지 명목으로 군비를 지출했지만, 냉전은 종료 되었고, 원유는 자국생산이 가능해졌다.

 

2. 중국의 부상

글로벌 경제의 미국 비중이 중국의 부상으로 40%에서 20%로 줄었다. 작아진 입지에 따른 기축통화 유지비용이 증가했다.

 

3. 경제안보

타국의 미국채 매입 중단으로 경제 체계가 흔들릴 수 있다. 원래는 미국이 무역을 제공하고, 무역흑자국이 미국으로 얻은 이익으로 국채를 매입하는 구조였지만, 중국이 미국채 매입을 중단하고 실물 자산과 인프라를 매입하며 Fed의 국채 매입의 부담이 증가했다.

 

4. 중산층의 몰락과 양극화, 정치 불안정성

위에서 말한 제조업 기반의 산업이 무너지면서 산업간의 양극화가 심화되고, 중산층과 상위 계층간의 갈등이 심화되었다.

 

5. 노동 집약 산업의 몰락

4차 산업혁명이 진행되고, 자동화 혁신이 이뤄지면서 미국이 수출 시장의 진출이 가능해짐 달러의 기축통화 지위를 버리고

달러의 가치를 내려서 수출 싸움이 가능해진다.

트럼프가 미국 기업들에게 미국으로 돌아와서 미국 일자리 만들어라고 강요하는 것도 이러한 맥락

반응형

댓글()

성장주 투자 이거만 아시면 됩니다 - EPS NTM

US Stock|2022. 8. 30. 17:02
반응형

글의 초점은 미국 성장주를 초점에 맞추어 작성했기에, 가치, 배당주에 적용하기에는 어려움이 있습니다

 

최근 금리인상과 일부 어닝쇼크, 애매한 가이던스, 러시아-우크라이나 이슈로 인해
Nasddaq 100 기준 20% 가까이 하락한 상태이죠.
그렇다고 현시점에서 전량 매도 후, 배당, 가치, 대체자산으로 돌리기에는 너무 늦은 시점인뿐더러
기술, 성장주는 여전히 매력 있다고 생각합니다.


성장주는 왜 성장주인가요??


성장주의 주가 상승 요인미래 가치를 현재로 가져오기에, 실적에 매우 민감합니다.
하지만 금융공학도 모르고, IB은행의 Report를 구독하지 않은 개인 투자자 입장에서는
정확한 정보로 구한 것인지, 스스로 믿을만한 미래 가치를 구했는지 전혀 알 수 없습니다.

그럼에도 불구하고, 성장주 선택 시 어떤 회사를 고르고, 주가 상승여력적정가치를 알 수 있는 방법이 있습니다.
간단하면서도 강력한 방법인 EPS NTM입니다.

EPS는 Earning Per Share로 기업의 성장성을 나타내는 하나의 지표입니다.
아래 블로그에 잘 설명되어 있습니다.

 

[초보 주식용어] PER, EPS 란?

아래 글은 voeasy.com 에서 작성된 글인데 voeasy.com 서비스 종료 이후에도 많은 분들이 찾으셔서 이 곳에 다시 걸어둡니다. (원문  “여행의 시작 – arrangy.com” 에도 많은 관심 부탁 드립니다. 주

hubrite.com


NTM은 Next Twelve Month의 약자로 향후 12개월의 기업 재무의 Consensus(합의점)의 합을 말합니다.
따라서 EPS NTM은 향후 12개월 기업의 합의된 eps의 합을 의미합니다.
예를 들어 애플의 22년 2Q eps : 1, 22년 3Q eps : 2, 22년 4Q eps : 3, 23년 1Q eps 4 라면
NTM EPS = 1+2+3+4인 10이 됩니다.

향후 12개월 실적들을 IB, 헷지펀드에서 미리 nasdaq.com에 제공하기에 직접 구할 수도 있지만,
EPS NTM은 확인이 어렵습니다.

 

Apple (AAPL) Earnings Report Date | Nasdaq

Your symbols have been updated You'll now be able to see real-time price and activity for your symbols on the My Quotes of Nasdaq.com. Continue

www.nasdaq.com

 


Koyfin이라는 Bloomberg 터미널과 유사한 기능을 제공하는 사이트에서도 확인할 수 있습니다.
해당 사이트는 S&P의 데이터를 직접 구매해 부분 유료라 아쉽긴 합니다.
EPS NTM은 매 실적 분기마다 업데이트됩니다.

 

Koyfin | Free comprehensive financial market data for investors

Koyfin provides free tools to help investors research stocks and other asset classes through dashboards and charting. Our coverage consists of equities, ETFs, futures, forex, bonds, mutual funds and economic data. For equities, we provide price history, fu

www.koyfin.com

 


 

그렇다면 EPS NTM을 어떻게 활용하면 되나요??

본론으로 돌아와

1) 어떤 회사를 골라야 하며 2) 상승여력은 어떻게 가늠하고 3) 적정가치는 어느 정도인지 정하려면
간단한 조건을 만족해야 합니다.

 

1) EPS NTM이 계단식으로 우상향 해야 한다.

 

그렇지 않은 회사는 과감하게 후보에서 제외시킵니다.
후보는 나스닥 100에서 가치주를 제외시키면 됩니다.

AAPL EPS NTM 차트

 

2) EPS NTM의 이전 대비 상승 폭이 커지고 있다면, 상승여력이 높다.

 

폭이 줄어들고 있다면 성장성이 줄어들고 있음을 알 수 있습니다.
현재 FB와 AMZN에서 이러한 모습을 확인할 수 있습니다.

FB의 성장폭 감소와 EPS NTM 감소에 따른 주가 하락

 

3) EPS NTM이 적정가치를 결정한다.

EPS NTM 선으로 주가가 맞추어지는 모습들을 성장주 대다수에서 확인할 수 있습니다.
예로, TSLA가 900선에서 튕기고 현재 1280선에서 EPS NTM선이 형성되어있죠.

 

NVDA가 EPS NTM 선 위에 머물다 횡보 하락한 모습




모두 만족하는 현재 가장 매력적인 종목으로 GOOGL, TSLA, AAPL, MSFT, AMD, NVDA

대표적이고 FB, NFLX, DOCU, TER, PYPL은 매력도가 많이 떨어졌고, 이는 현재 주가에 반영되어 있음을 알 수 있습니다.

또한 위 세 가지는 모두 Koyfin이라는 사이트에서 확인 가능하나 일부 종목을 유료이다.
하지만, 파이썬으로 직접 크롤링하여 만들 수 있다.

반응형

댓글()

"객관적이다"라는 것이 가능한 말일까??

Deep Breath|2022. 8. 24. 15:50
반응형
우리가 토론을 할 때, 혹은 언론이나 미디어를 접할 때 '객관적'이라는 말을 많이 듣는다.
어떠한 진영에 휩쓸리지 않고, 주관과 편견을 배제한 절대 중립적 입장을 말하는
'객관성'이 과연 실재하는가에 대한 의문이 생겼다.

 


 

객관성과 사실

 

짚고 넘어가야 할 부분은 '객관성'과 '사실'은 명확히 다르다는 사실이다.

"사자가 토끼를 잡아먹었다"가 사실이고, "사자가 토끼를 괴롭혔다"는 객관이다.

네이버 국어사전

객관성의 사전적 의미는 제삼자의 시각, 보편, 타당성으로 요약할 수 있다.

똑같은 사실을 전달한다고 해도 바라보는 시각, 프레임에 따라 다르게 보일 수 있는

언론은 객관적 보도 자세를 유지할 수 없다고 생각한다.

 

더 나아가 '객관성'이라는 것 자체가 존재할 수 없는 관념이 아닐까란 의문이 든다.

누군가는 "어떠한 논의에 상반되는 두 진영이 있을 때, 두 진영에 상관없는 제삼자의 시각이 객관적 시각을 제공한다"

라고 하겠지만, 결국 제삼자도 자신의 의견을 가지고 있기에 그의 의견도 상반된 두 스펙트럼 중

그의 의견이 있을 수밖에 없다고 생각한다.

 

도대체 뭐가 맞는 걸까?

 

처음 접하는 논의가 있을지라도 그 논의를 받아들이는 사유의 과정 속에 과거의 접한 편향된 시각들이

개입될 여지가 충분히 있으며, 그런 개입이 있은 후에 바라보는 시각은 절대 객관적이라 볼 수 없다.

'객관적'이란 말은 편향이 최대한 배제된 상태이고, ~적이라는 표현은 다양한 해석이 가능하지만,

다양한 해석을 하나에 기준에 맞추는 것은 불가능하기에  '객관성'은 '말장난'에 불과하다고 생각한다.

잠깐 생각만 해도 머리 아픈 이 포스트 모더니즘의 주된 문제의식은 나에게 있어서 도저히 받아들이기 힘든 난제이다.

이것도 맞고 저것도 맞을 수 있으니 뭐가 옳은지 판단하기 힘들어지기만 한다.

결국 오랜 고민 끝에 이를 정리해보기로 했다.


세 가지 가정을 해보자.

 

P1 : 객관적인 세계가 실재할 수는 있다.

P2 : 그러나 객관적인  세계에 대한 우리의 인식은 결코 완벽할 수 없다.

P3 : 하지만 그럼에도 불구하고, 객관성에 대한 추구는 제한적인 범위 안에서라면 가능하다.

 

P1은 어느 정도 절대적으로 모두의 생각이 동일한 합의점이 존재한다는 주장

P2은 하지만 우리는 그 합의점이 있는지 없는지 잘 모른다는 주장

P3은 모두의 생각이 동일하다는 것이 불가능하기에, 다수의 사람들이 인정하는 합의점은 객관성을 가진다는 주장

 

P2는 P1의 변론이라면, P3는 P2의 대안 정도로 생각해 볼 수 있겠다.

 

세 가지 가정을 뒷받침하는 요소로 관찰의 과소 결정성언어의 한계가 있다.

 

1) 관찰의 과소 결정성 (underdetermination)

 

어떤 현상 A가 서로 다른 이론들에 의해서 동시에 설명될 수 있을 때, 현상 A는 이론을 과소 결정한다고 한다.

즉 A에 대한 데이터가 있더라도, 그것이 여러 이론을 지지하는 증거로 활용될 수 있어서

귀에 걸면 귀걸이, 코에 걸면 코걸이 식이 된다는 것이다.

 

연소에 관한 플로지스톤설

 

일례로, 연소현상을 어떻게 이해할 것인지에 대해 일었던 역사적 논쟁이 과소 결정성 문제를 대표적으로 보여준다.

과학혁명 당시에는 연소를 플로지스톤의 작용으로 이해하는 입장과 산소의 작용으로 이해하는 입장이 대립하고 있었는데, 당시까지 관찰된 결과들이 모두 두 이론에서 똑같이 잘 설명되었다. 결국 산소파의 승리로 끝나기는 했지만,

그 승리에는 산소 이론을 적극적으로 지지했던 라부아지에의 정치력이 적지 않게 작용했다고 한다.

 

데이터의 해석을 놓고 논쟁하는 과학에서도 상황이 이러한데,

각종 이해관계가 얽힌 정치 문제에 대한 서술이야 오죽할까.

이러한 이유로 관찰의 과소 결정성은 P2의 가정을 뒷받침한다.

 

2) 언어의 한계

 

우리가 아는 모든 것에 대한 서술은 언어로 이루어진다.

수학적 표현이나 프로그래밍 언어와 같이 엄밀한 논리적 체계를 갖춘 형식 언어를 이용하기도 하고,

우리가 일상적으로 사용하는 언어인 자연언어를 이용하기도 한다.

그런데 이 언어를 자세히 들여다보면 상당한 한계가 있다.

아주 먼 옛날에도 언어로 의미를 전달했다

우선 자연언어를 살펴보면, 우리가 명료하다고 생각하는 언어들조차도 거의 비유에 기반하고 있음을 알 수 있다.

우리는 숫자가 크다/작다, 밀도가 높다/낮다와 같은 표현들을 사용하는데,

어떻게 추상적 개념인 숫자에 '크기'라는 속성이 있으며, 밀도에 '높이'라는 속성이 있겠는가?

 

이와 같이 자연언어는 은유로 가득 차 있으며, 필연적으로 애매모호함을 동반한다.

따라서 실재를 기술하는 데에도 이러한 애매모호함이 동반될 수밖에 없다.

 

수식이나 프로그래밍 언어와 같은 형식 언어는 비교적 논리적 구조가 정교하게 짜여 있다고 할 수 있지만,

그런 종류의 언어로는 나타내고 다룰 수 있는 개념이 매우 한정되어 버린다.

수식으로 어떻게 '사랑'이라는 개념을 표현하고, 프로그램이 언어로 어떻게 '죽음'이라는 개념을 나타낼 수 있을까?

형식 언어로 복잡한 정리를 증명하는 일은 할 수 있지만, 로맨스 소설을 쓸 수는 없다.

이러한 언어의 한계도 역시 P2의 가정을 뒷받침한다.

 

예를 들어 오늘 코스피가 3% 하락했다고 한다면 이는 사실이고, 이에 대한 이유로 러시아의 우크라이나 침공 혹은 연준의 테이퍼링 가속화는 객관이다. 그러나 코스피가 하락했거나 1%만 상승했다고 하는 것은 명백한 모순이다.

 

이런 식으로 우리는 제한된 영역 안에서 객관성을 추구할 수 있으며 (P3), 실재에 대한 그림을 그려 볼 수 있다.

비록 그것은 장님이 코끼리를 만지고 그리는 것과 같은 불완전한 그림이겠지만,

완전한 허구와는 분명히 구분되는 것이다.


결론

위의 3가지 가정 중 문제의식에 대한 해결방안으로

P2 ("그러나 객관적인 세계에 대한 우리의 인식은 결코 완벽할 수 없다")에 무게를 두기로 했다.

그리고 "모든 인간은 완벽하지 않은 존재"이지만, 인간은 P3에서 말하는 '제한적인 범위' 내에서

최대한 합의점에 도달하고자 노력한다고 생각하려 한다. 

 

 

 

 

 

 

반응형

댓글()

[미국 주식] 구글(GOOGL) 주식 분석 및 전망 feat. 유튜브

US Stock|2022. 8. 24. 15:07
반응형

구글 하면 떠오르는 게 대표적으로 '구글 검색'이었죠.

근데 지난 몇 년간 유튜브가 구글 검색보다 상대적으로 앞서았습니다.

 

위드 코로나가 전 세계적으로 시작됨에 따라 언택트 시대가 끝나감에도

유튜브의 영업이익은 여전히 엄청난 속도로 성장해 나갔습니다.

 

유튜브는 더 이상 단순한 동영상 플랫폼이 아닌 YouTube Short,  채널 스토어 등 여러 플랫폼을 키워나갈 예정이라 합니다.

 

특히 Snapchat / Instagram / Apple TV+ / Amazon Prime Video 같은 경쟁사의 파이를 뺏어오며

입지를 다져나가고 있습니다.


유튜브 채널 스토어

 

올해 가을 안에 유튜브 채널 스토어가 론칭될 거라 루머가 퍼져있었는데,

최근 유튜브가 채널 스토어를 개설하겠다고 발표했습니다.

 

유튜브 채널 스토어를 통해 채널 구독자나 시청자들이 유튜버의 채널 구독권을 사게 되고,

유튜버의 개인 채널 쇼핑몰에서 상품을 구매할 수 있게 됩니다.

 

 

유튜브, 동영상 스트리밍 서비스 모아보는 '채널스토어' 만든다

유튜브가 자사 앱에서 여러 동영상 스트리밍 서비스를 모아 볼 수 있는 온라인 스토어인 '채널 스토어' 개설을 추진 중이다.월스트리트저널, 엔가젯 등 외신은...

zdnet.co.kr

 


Youtube Short vs 틱톡

 

의외로 얼마 안 지난 작년 6월 유튜브는 Youtube Short를

ByteDance의 틱톡이 대 유행을 치면서 유튜브도 비슷한 플랫폼 Youtube Short를 런칭했습니다.

 

틱톡의 벨류에이션은 작년 말 기준 $400B 정도로 추정됩니다. 

근데 이건 작년에 미래에셋자산운용으로 알려진 Tiger Global가 ByteDance의 주식을 사려했을 때

벨류에이션이고, 이번 연도는 많이 떨어진 $300B라고 합니다.

 

[특파원 리포트] 틱톡의 모기업 바이트댄스 기업가치 25% 하락 - 인포스탁데일리

[인포스탁데일리=(시카고)이지선 기자] 숏폼(short-form) 비디오 클립 제작 및 공유할 수 있는 글로벌 플랫폼인 틱톡의 모회사인 바이트댄스의 기업 가치가 3,000억 달러 아래로 하락했다. 이는 전년

www.infostockdaily.co.kr

인스타그램의 릴스, 유행의 발상지인 Tiktok이 Short-Form Video 시장에서 잘 알려져 있지만

우리나라 사람들의 24시간 중의 1시간을 차지하는 유튜브가 점차 독점해 나갈 것이라 봅니다.

 

 

못말리는 한국인의 유튜브 사랑…4300만명이 한달 30시간 본다

못말리는 한국인의 유튜브 사랑4300만명이 한달 30시간 본다 국민 83%, 월평균 17일 유튜브 사용

www.chosun.com

 

 

최근 어닝 콜에서 발표한 자료에 따르면 15억 명의 유튜브 가입자가 매달 Youtube Short를 보고

매일 300억의 Youtube Short 트래픽이 발생하고 있다고 합니다.

 

반면 틱톡은 10억 명의 가입자가 매일 10억 뷰를 만들고 있다고 하니

유튜브와의 차이가 이미 어마 무시하게 벌어졌음을 알 수 있습니다.

 


 

구글의 주기성

 

2018년 4분기부터 지금까지 구글의 기타 수익(Google Play, Fitbit, Google Nest, Pixel phones)은 74.48% 증가했습니다.

반면 유튜브 광고 수익은 연평균 34.07% 상승하며 3년간 103.61% 증가했습니다.

유튜브 프리미엄과 유튜브 TV 구독료는 광고가 아니기 때문에 유튜브 광고 수익에 산정되지 않습니다.

유튜브 광고의 영업이익을 자세히 보면 4분기에 급등하고, 1분기에 좀 낮아지는 주기성을 볼 수 있는데요.

추수감사절, 크리스마스, 블랙프라이데이, 새해 등 연말에 각종 행사가 몰려있어 광고주들이 돈을 많이 쓰는 시기기 때문입니다.

지금 주가가 고점 대비 약 19% 떨어진 상태이기도 하고, 앞으로 다가올 3~4분기 역시 구글의 광고수익이 점차 증가할 시기기에 지금이 구글을 매수하기 적기라 생각합니다.

 

끊임없이 성장하는 유튜브 광고 수익의 증가는 결국 유튜브 광고가 하나의 브랜드로 자리 잡고 있다는 반증으로 보입니다.

전 세계 사람들의 거의 매일 유튜브의 영향령은 모두가 잘 알기에 유튜브의 광고 전달력과 플랫폼의 우위를 꺾을 기업은 없을 것 같습니다.

 


세 줄 요약

- 유튜브 채널 스토어가 조만간 생김

- 광고 = 유튜브

- 유튜브 광고 수익의 주기성이 있다

반응형

댓글()

7월 CPI 과연 어떻게 될까?? - 경기 침체 오나요??

US Stock|2022. 8. 9. 16:25
반응형

6월 중순부터 주식시장 랠리가 이어졌죠.

Fed가 인플레이션 압력을 막아내고자 급격하게 긴축을 조장했던 Fed가 인플레가 안정화되면서

긴축 속도를 줄일 거라는 예상에 주식, 채권시장에 다시 숨을 불어넣었습니다.. 

올해 M2 성장률의 둔화세, 원자재 시장의 하락세, 그리고 부동산 시장의 얼어붙으면서 인플레이션의 압력을 감소시켰습니다. 또한 주택 수요의 급격한 둔화로 주택 담보 대출 금리가 지난달에만 6%에서 5%로 떨어졌습니다.  

CPI가 쓰러지지 않아!


또한, 스왑 스프레드는 상대적으로 낮은 수준을 유지하고, 신용 스프레드는 단지 적당히 상승 중입니다.

즉, 유동성이 풍부하며, 긴축적 통화정책이 경기침체가 반드시 일으킨다고 하기엔 경기가 튼튼한 상태입니다.

S&P 기업 마진은 꾸준히 증가하고 있고, 7월 일자리 창출은 놀라울 정도로 일자리 증가세는 상승세입니다.

 

올해 4월을 기점으로 PeakOut한 7년물 스왑 스프레드



 

[격하게 쉬운 설명] - 신용스프레드란?

■ 신용스프레드란? 1. 스프레드 스프레드(spread)가 경제 용어로 사용되면 '차이' 또는 '차액'을 의미합니다. 예를 들어 장단기금리 스프레드는 장기금리에서 단기금리를 뺀것입니다. 장단기금리

ecodemy.cafe24.com

 

스왑 스프레드(Swap Spread), 그리고 그 역전 현상에 대하여

스왑 스프레드(Swap Spread)에 대하여  스왑 스프레드라니...머리가 아프다. 영어가 두개이다. 뭔지 그 의미도 불분명한 영어 단어가 두개나 붙어있다. Swap은 뭔가를 바꾸는 것이고, Spread는 뭔가와

froginthewell.tistory.com

더 이상 경제가 불황인지 아닌지에 대한 논쟁은 거의 큰 문제가 되지 않는다고 봅니다. 

인플레이션이 식고 있다면 연준은 경제가 붕괴될 때까지 금리를 올릴 이유가 없기 때문이죠.

시장도 이에 반응하고 있고요.

채권 시장 플레이어는 Fed가 현재의 2.5%에서 향후 6개월 정도 내에 3.25%로 금리를 인상할 가능성이 높다에 배팅을 하고, 3.25%도 여전히 낮은 금리 수준이기에 이 정도의 금리인상으로 단순히 경기 침체가 온다고 보진 않습니다.

목표 금리 예측치도 점점 낮아지는 모습

GDP의 75%를 차지할 정도로 가장 중요한 서비스 섹터의 건전성을 나타내는 지표

US ISM Services Business Activity Index가 경기침체 수준을 웃도는 수준에 있음을 알 수 있습니다.  

US ISM Services Business Activity Index

또한 원자재 가격이 하락하는 추세에 다시 접어들면서 제조업의 원자재 가격 부담이 줄어들고 있죠.

United States ISM Manufacturing Prices Paid

정크본드 하이일드 스프레드도(회사채 금리 - 국채금리로 회사채 금리가 높아진다는 것은 기업이 불안정하다는 신호)

4월을 기점으로 Peak out을 하는 모습은 하이일드 회사채에 대한 수요가 다시 살아남을 나타냅니다.

출처 - Fred 하이일드 스프레드

 

 

3줄 요약

  • 인플레이션은 진정되는 중이고, Fed는 금리를 계속 올리지 않을 것
  • 원자재 가격하락은 인플레 하락에 일조하는 중임
  • 채권 시장은 금리인상의 위험을 한참전에 받아드리고 이제는 금리 인하에 초점을 두는 중

 

결론

CPI 높게 나오기 힘들다. 

반응형

댓글()

Finance 참고 블로그

Quant|2022. 3. 20. 16:01
반응형

크래프트테크놀로지 CEO 브런치

 

김형식의 브런치

크래프트테크놀로지스 CEO | 크래프트테크놀로지스 CEO 김형식의 브런치입니다.

brunch.co.kr

크래프트테크놀로지스 채용페이지, 인사이트

 

Open Positions(국문)

Qraft AI/Finance Research

qraft.oopy.io

 

Pair Trading — QRAFT

Eigenvalue based pair-trading strategy is a well-known market neutral strategy and has been used by many investors including D.E. Shaw&Co. As the strategy is widely accepted and implemented in the market, the effectiveness of strategy is continuously deter

www.qraftec.com

 

한국어 — QRAFT

English Subtitles Included Read More

www.qraftec.com

금융 머신러닝 책 소개

 

[Book] 금융 머신러닝 - 이론에서 실전까지

금번에 이기홍박사님이 번역하신 금융 머신러닝책을 소개합니다.원서로 출간했을 때 번역해볼려고 한 책으로 스프링거(Springer)출판사 책 답게 입문서적은 아니고 어렵지만 금융 머신러닝 전공

brunch.co.kr

머신러닝 위주의 트레이딩 전략 

 

트레이딩전략 | 그대안의 작은 호수

자본시장과 IT, 트레이딩전략 Normal로 진화한 Alternative Data 1. Alternative Data. 대체데이타라고 번영합니다. 일반적으로 투자 및 자산운용할 때 보편적으로 사용해왔던 시장 정보(시장, 원자재, 환율

smallake.kr

Pairs Trading & 시장미시구조론 기초/심화 

 

아마추어 퀀트 (Amateur Quant) : 네이버 블로그

투자의 정석은 존재하는가?

m.blog.naver.com

알고리즘 트레이딩 위키 자료

 

알고리즘 트레이딩 - 해시넷

알고리즘 트레이딩(Algorithmic trading)은 컴퓨터 프로그램을 이용하여 일정한 논리구조나 알고리즘, 특정 매매기법에 따라 증권, 외환, 파생상품 등의 자산을 자동으로 거래하는 매매 방식이다.[1]

wiki.hash.kr

기술적 분석, 파생상품, 데이터사이언스

 

'Strategy/Market Neutral' 카테고리의 글 목록

퀀트투자 블로그

yonelabs.tistory.com

퀀트 프로그래밍

 

투자 하는 개발자 : 네이버 블로그

투자에 진심인 개발자

blog.naver.com

퀀트 전략

 

Henry's Quantopia : 네이버 블로그

예전의 그 HenryQuant가 네이버 블로그로 이동했습니다. henryquant.blogspot.com 에 과거글은 남아 있습니다.

blog.naver.com

Pairs Trading 전략

 

Finance

[Quant] 주식리스크 프리미엄 구하기 03 November 2019 리스크 프리미엄(risk premium) 또는 위험 프리미엄은 개인이 무위험 채권이 아닌 위험 자산을 보유하도록 유도하기 위해 위험 자산의 기대수익이

mkjjo.github.io

Finance Project (1)

 

kk : 네이버 블로그

알면 알수록 제가 얼마나 많은 것을 모르고 있었는지 새삼 느끼게됩니다.

m.blog.naver.com

Finance Project (2)

 

BlackPaper

Quantitative Investment

quantkim.blogspot.com

머신러닝 위주의 트레이딩 전략

 

 

auquan – Medium

Capital Markets are drowning in data — there is too much data and too many tools. Auquan is transforming investment research using knowledge graphs to cut research time from weeks to hours and expand data coverage available to an investment team; ena

medium.com

퀀트 기초

 

 

 

Cherry Quant

**cherry 가 만들어가는 Quant 이야기** 다양한 정보와 글을 공유하고자 합니다. 모든글의 하단에는 출처가 공개되어 있습니다. 문제시 말씀주시면 삭제하도록 하 ...

wikidocs.net

퀀트 로드맵

 

[공유] 퀀트 투자 로드맵과 전략테스트 방법, 논문들 - 이성규, HENRY

최근 액티브 펀드들의 성과가 좋지 못하다 보니, 많은 분들이 스마트베타 ETF나 퀀트 투자에 관심이 많...

blog.naver.com

 

KAIST 교수님 추천 Pairs Traing 논문

 

Pair Trading & 통계적 차익거래 Reading List <KAIST>

2021년 KAIST 현정순 교수님의 통계적 차익거래 수업에서 쓰이는 자료들 이다. 페어트레이딩이나 통계...

blog.naver.com

AI 퀀트 영상

 

 

[AI퀀트] 금융머신러닝 공부를 위해 봐야할 동영상

금융 머신러닝 공부를 위해 봐야할 동영상 소개 | ‘퀀트 투자를 위한 머신러닝·딥러닝 알고리듬 트레이딩’ 공역자인 금융자산평가사 NICE P&I 홍창수입니다. 참고로 P&I는 Pricing and Information의

brunch.co.kr

AI 자산 관리 e-book

https://www.cfainstitute.org/-/media/documents/book/rf-lit-review/2020/rflr-artificial-intelligence-in-asset-management.pdf

 

Reference 사이트

 

 

퀀트들이 참고하면 좋은 웹사이트

일반적으로 퀀트는 정량적 분석의 도움을 받아 복잡한 알고리즘을 설계하는 금융 기술 산업의 전문가입니다...

blog.naver.com

 

 

반응형

댓글()

[Quant Strategy] NCAV 전략 - 2022.03.16 기준

Quant|2022. 3. 17. 13:59
반응형

NCAV 전략이란 무엇인가? 

 

[공유] 그래햄의 NCAV(순유동자산) 전략 – 거저 먹기 투자, 한국에서 아직도 가능하다 - 강환국

그래햄의 NCAV(순유동자산) 전략...

blog.naver.com

 

코스피/ 코스닥 상장된 모든 주식을 NCAV 전략으로 스크리닝 한 결과이다.

단, 홀딩스/ 우선주 제외하였다.

스크리닝 결과

SJM, 대원, 대원산업, 삼양동상, 삼영전자, 세원정공, 신도리코, 이니텍, 이라이콤이 있음을 확인할 수 있었다.

동일 가중으로 위 종목들을 포트폴리오에 구성했을 때, 6개월 후(2022.09.16) 수익률을 확인해보도록 하겠다.

 

 

추가 수정해야할 부분 상장폐지, 거래정지 고려 안함

https://blog.naver.com/leebisu/222441169620

 

거짓된 백테스트를 만드는 오류들

백테스트 수익률이 매우 좋아 투자를 시작하면 막상 실제 수익률은 그렇지 않은 경우가 많습니다. 이는 여...

blog.naver.com

https://blog.naver.com/leebisu/222430224622

 

퀀트들이 참고하면 좋은 웹사이트

일반적으로 퀀트는 정량적 분석의 도움을 받아 복잡한 알고리즘을 설계하는 금융 기술 산업의 전문가입니다...

blog.naver.com

 

반응형

댓글()

[Project] 증권사 리포트에 따라 사면 어떻게 될까??

Quant|2022. 3. 11. 13:50
반응형


Question

문뜩 증권사 애널리스트 말대로 사면 좋은 수익을 낼 수 있는지 의문이 들었다.

애널리스트는 직업으로 기업 분석에 모든 시간을 투자하기 때문에 개인 투자자보다 

분석에 우위를 가지고 있을 것이기 때문이다.


Design

Where & Who

어떤 증권사의 애널리스트들을 선정했는지는 해당 증권사, 애널리스트 이미지에

오해의 소지를 가져올 수 있으므로 blind 처리하였다.

 

How

증권사 홈페이지에 게시된 리포트 종목/날짜/평가등급을 크롤링 후

dataframe으로 변경 후, 리포트 게시 날의 종목 가격, 일정 기간 후의 가격, 변화율 특성을 추가한다.

 

When 

2019년 1월 1일 ~ 2022년 1월 1일까지 게시된 리포트를 구하고,

3개월 이후의 가격과 비교하도록 한다.

 

What

기간 내 10개 미만의 리포트를 쓴 애널리스트는 제외시킨다.


Develop

1) 애널리스트 이름과 각 애널리스트들의 리포트를 내역을 저장할 dataframe list 생성

name_list = ['이**' ,
'최**' ,
'박**' ,
'이**' ,
'이**' ,
'박**' ,
'안**' ,
'김**' ,
'정**' ,
'이**' ,
'김**' ,
'백**' ,
'허**' ]

analysis_list = []

2) 종목 가격을 찾는 API를 사용하려면 종목코드로 검색해야 하기 때문에 종목명 : 종목코드 dictionary 생성

stock_list = pd.DataFrame({'종목코드':stock.get_market_ticker_list(market="ALL")}) 
stock_list['종목명'] = stock_list['종목코드'].map(lambda x: stock.get_market_ticker_name(x))
stock_list = stock_list.set_index('종목명').T.to_dict('list')

3) 리포트 데이터들 크롤링

def analysis_crawling(name) :

  # site page 별로 데이터 크롤링 
  df_list = []
  
  # 애널리스트별로 page 수가 다르기 때문에 page 수를 16으로 설정
  page_num = 16

  # page 수만큼 다 크롤링해서 중간에 끊기는 경우 braek로 크롤링 중단
  exit1 = 0
  exit2 = 0

  for i in range(page_num):
    
    if exit2 == 1:
      break

    # 해당 url로 이동 , 19년 1월 1일 ~ 22년 1월 1일
    url = "url 주소는 blind"
    driver.implicitly_wait(10)
    driver.get(url)
    driver.implicitly_wait(10)
    
    # table 형태의 애널리스트 리포트 데이터 추출
    table = driver.find_element_by_class_name() # blind
    tbody = table.find_element_by_tag_name("tbody")
    rows = tbody.find_elements_by_tag_name("tr")

    df = pd.DataFrame()

    for k in range(3):
      if exit1 == 1:
        exit2 == 1
        break

      content = []
      
      for index, value in enumerate(rows):
          body=value.find_elements_by_tag_name("td")[k]
          content.append(body.text)

	  # page 끝난 경우
      if k == 0 :
        if body.text == '조회 자료가 없습니다.':
          exit1 = 1
          break
        # 날짜 데이터
        else :
          df['date'] = content
      elif k == 1 : # 종목 데이터
        df['stock'] = content
      elif k == 2 : # 평가 등급 데이터
        df['rate'] = content
    
    # page 별로 만들어진 dataframe list에 추가 
    df_list.append(df)
  
  # df_list 에 있는 page 별 report들 통합
  analysis = pd.concat(df_list)
  # 과거 -> 현재 순으로 정렬
  analysis = analysis[::-1]
  # 날짜 형식 변경
  analysis["date"] = analysis["date"].str.replace(pat=r'[^\w]', repl=r'', regex=True)


  return analysis

4) 날짜에 따른 가격 데이터 열 생성

def price_search(analysis, name) :
  re_price = []
  af_price = []

  for i in range(analysis.shape[0]) :  
    
    # 종목 코드
    c = stock_list.get(analysis['stock'].iloc[i]) 
    
    if c == None :
      re_price.append(0)
      af_price.append(0)
      
      continue 
    else :
      c = c[0]

    # 리포트 발표 날짜 
    re_date = analysis['date'].iloc[i]
    
    # 주말 , 공휴일, 연휴 고려 탐색기간 5일
    re_end = datetime.datetime.strptime(re_date, '%Y%m%d') + datetime.timedelta(hours=96)  
    re_end_str = re_end.strftime('%Y%m%d')
    
    # 발표 날 주가 데이터
    re_p = stock.get_market_ohlcv(re_date, re_end_str, c)
    
    # 주가가 없으면 0원 처리
    if re_p.shape[0] == 0 :
      re_e = 0
    else :
      re_e = re_p['종가'].iloc[0]

    # 3개월 후 주가 
    af_date = datetime.datetime.strptime(re_date, '%Y%m%d') + datetime.timedelta(weeks=12)
    af_end = af_date + datetime.timedelta(hours=120)  
    
    # datetime -> str
    af_date_str = af_date.strftime('%Y%m%d')
    af_end_str = af_end.strftime('%Y%m%d')
    
    # 발표 날 주가 데이터
    af_p = stock.get_market_ohlcv(af_date_str, af_end_str, c)
    
    # 주가가 없으면 0원 처리
    if af_p.shape[0] == 0 :
      af_e = 0
    else :
      af_e = af_p['종가'].iloc[0]


    re_price.append(re_e)
    af_price.append(af_e)
    
  # 리포트 등록 날 주가, 3개월 후 주가 특성 추가
  analysis['report_price'] = re_price
  analysis['month_price'] = af_price
  
  # 꼬인 index 재정렬
  analysis.reset_index(inplace=True, drop=True)

  # 주가 열이 0인 경우 해당 행 삭제
  indexNames = analysis[ (analysis['report_price'] == 0)
                  | (analysis['month_price'] == 0) ].index
  analysis.drop(indexNames , inplace=True)
  
  # 3개월 변화율 특성 추가
  analysis['change'] = 100 * (analysis['month_price'] - analysis['report_price']) / analysis['report_price']

  # 오른 종목 수 counting
  u = 0

  for i in range(analysis.shape[0]):
    if analysis['change'].iloc[i] > 0 :
      u += 1
  
  # report 수 대비 오른 종목 수로 점수화 
  print("Analysis score is  : " , round(u /analysis.shape[0],3))

  return analysis

Evaluation

analysis score가 가장 높은 사람의 점수는 0.635이고, 가장 낮은 사람의 점수는 0.136이다.

 

name : 애널리스트 이름

outperform : 리포트 중 가장 많이 오른 종목

max ratio : 가장 많이 오른 종목의 3개월 변화율

max ratio : 가장 많이 내린 종목의 3개월 변화율

mean propit ratio : 평균 수익률

analysis score : 등록한 report  대비 상승한 종목 비율

 

name : 이**
outperform : 카카오 
max ratio : 66.75%
min profit ratio : -49.041% 
mean propit ratio : 3.958%
analysis score is : 0.571
number of report : 126

name : 최**
outperform : 두산
max ratio : 57.48%
min profit ratio : -30.036% 
mean propit ratio : -0.133%
analysis score is : 0.437
number of report : 119

name : 박**
outperform : 상아프론테크
max ratio : 155.446%
min profit ratio : -50.76% 
mean propit ratio : 3.195% 
analysis score is : 0.455
number of report : 156

name : 이**
outperform : LG전자
max ratio : 108.187%
min profit ratio : -29.924% 
mean propit ratio : 9.511%
analysis score is : 0.635
number of report : 115

name : 이**
outperform : 세아베스틸
max ratio : 97.77%
min profit ratio : -40.809%
mean propit ratio : 2.034%
analysis score is : 0.481
number of report : 135

name : 박**
outperform : 신세계인터내셔날
max ratio : 40.751%
min profit ratio : -36.961%
mean propit ratio : -2.361% 
analysis score is : 0.409
number of report : 225

name : 안**
outperform : 서울옥션
max ratio : 101.863%
min profit ratio : -39.627%
mean propit ratio : 4.022% 
analysis score is : 0.494
number of report : 85

name : 김** 
outperform : 동화기업
max ratio : 113.58%
min profit ratio : -42.105% 
mean propit ratio : 2.762%
analysis score is : 0.465
number of report : 172

name : 정** 
outperform : 한국금융지주
max ratio : 51.515%
min profit ratio : -33.381% 
mean propit ratio : 3.65% 
analysis score is : 0.574
number of report : 289

name : 이**
outperform : 카페24
max ratio : 45.206%
min profit ratio : -52.922% 
mean propit ratio : -1.786%
analysis score is : 0.399
number of report : 143

name : 김**
outperform : 에코프로비엠
max ratio : 111.623%
min profit ratio : -21.259%
mean propit ratio : 11.043%
analysis score is : 0.595
number of report : 84

Name : 허**
outperform : 아이엘사이언스
max ratio : 37.072%
min profit ratio : -36.853% 
mean propit ratio : -12.564% 
analysis score is : 0.136
number of report : 22

 

Feedback

사실은 각 애널리스트 저마다 올리는 리포트의 섹터가 다르다 

score가 높은 사람은 해당 기간 동안 해당 섹터가 선방했기 때문에 점수가 높은 것이고,

score가 낮은 사람은 그 반대이다.

 

또한 대부분의 애널리스트의 점수가 0.5 근처인 것을 보았을 때,

내부자 정보를 알지 않는 이상 아무리 분석을 많이 한 사람이라도 주가의 향방 타이밍은 알 수가 없다.

애널리스트는 기업의 내제 가치를 평가하는 사람일 뿐 기업의 미래를 아는 사람은 아니다.

 

 

 

 

피터 린치의 명언으로 마무리

 

 

반응형

'Quant' 카테고리의 다른 글

Finance 참고 블로그  (26) 2022.03.20
[Quant Strategy] NCAV 전략 - 2022.03.16 기준  (11) 2022.03.17
[Quant Strategy] Pair Trading with Long/Short  (17) 2022.02.20
Project : Price and EPS NTM  (0) 2021.12.09
[금융상품] 채권  (18) 2021.10.26

댓글()

[Quant Strategy] Pair Trading with Long/Short

Quant|2022. 2. 20. 20:39
반응형
LongShort
반응형

'Quant' 카테고리의 다른 글

[Quant Strategy] NCAV 전략 - 2022.03.16 기준  (11) 2022.03.17
[Project] 증권사 리포트에 따라 사면 어떻게 될까??  (35) 2022.03.11
Project : Price and EPS NTM  (0) 2021.12.09
[금융상품] 채권  (18) 2021.10.26
[금융상품] 원유  (20) 2021.10.18

댓글()

[프로그래머를 위한 선형대수] Review (3~4)

Machine Learning|2022. 2. 8. 20:20
반응형

3. 컴퓨터에서의 계산 (1) - LU분해

이 장의 핵심은 행렬 A를 어떻게 해야 효율적으로 계산할 수 있을지에 대해 다루고

그에 대한 해결책으로 LU분해를 제시한다.

 

LU분해는 행렬 AL(하삼각행렬)U(상삼각행렬)의 곱으로 나타낸다

 

분해하면 무엇이 좋은가?

- 행렬식을 구하거나 일차방정식을 풀거나 하는 것이 간단해진다

 

행렬식

det A = det(LU) = det L* det U인데, L과 U의 행렬식은 대각 성분의 곱과 같으므로

det L은 1, det A = det U가 된다.

 

일차방정식

Ax = y 문제가 y에서 x를 찾는 문제였다면, LU분해에서는 LUx = y문제로 볼 수 있다.

y-> x의 과정에서 y -> z -> x 로 단계는 늘었지만 계산은 간단해졌다.

 

4. 고윳값, 대각화, 요르단 표준형 - 폭주의 위험이 있는지를 판단

이 장의 핵심은 시계열 데이터로 이뤄진 자기회귀모델이 발산하는지에 대한 여부를 판단한다.

이때 자기회귀 모델은 선형 사상 A와 초기값 x(0)의 행렬곱으로 표현 가능한데, 발산 여부를 판단하려면,

행렬 A이 대각화된 상태여야 한다. 

대각화에서 더 나아가 고윳값와 고유벡터 의미를 알면 된다.  

 

4.1 문제설정 : 안정성

자기회귀모델 ξ(t)가 어떤 상황에서도 폭주하지 않는가를 판정해야 한다.
이때 "폭주"는 발산함을 의미한다.
수학적인 개념으로는  고윳값, 고유벡터, 대각화, 요르단 표준형을 다룬다. 

ξ(t) = Aξ(t-1)를 x(t) = Λx(0) 로 나타냈을 때, (Λ는 대각 행렬)
Λ의 요소중 하나라도 절댓값 1보다 커지는 순간 폭주하게 된다.
등비급수의 합을 생각하면 이해가 쉽다.

 

 

4.4 대각화 할 수 있는 경우

<A가 대각행렬이 아닌 경우, 대각행렬로 바꿔야 함>

 

대각화를 변수변환 좌표변환 거듭제곱계산의 세가지 관점으로 바라보는데,

변수변환이 가장 직관적이고

좌표변환은 고유벡터를 기하학적으로 해석한 것과 같기에 변수변환으로 간단하게 설명해보겠다.

 

기존 x(t) = Ax(t-1)을 (A는 대각행렬이 아님)  

y(t) = Λ^t y(0) (Λ = P⁻¹AP) 로

적절한 P를 선택해 대각화(Λ) 한 후, 안정성 판단 후 다시 x로 바꿔주면 된다.

y에서 폭주하면 x에서도 폭주하는 것이기에 굳이 x로 바꾸어줄 필요는 없다.

 

4.5 고윳값, 고유벡터

어떠한 벡터 x에 선형변환 A를 취했을 때, 그 크기만 변하고 방향은 원래 벡터와 평행한 벡터 P는 무엇인가?

 

(Λ = P⁻¹AP)에서 (ΛP = AP) 로 생각해보면

AP의 의미는 벡터 P를 선형사상으로 옮긴 것이고,

ΛP의 의미는 P가 선형사상 A로 옮겨졌어도, 방향은 안 바뀌고 길이만 바뀐 것이기에

고윳값 Λ = diag(λ₁, λ₂ ...)ⁿ 로 그 길이를 등호에 맞게 맞춰준 것으로 이해할 수 있다.

 

 

4장을 다시 한번 정리하면
자기 선형 모델이 발산하는지를 판단하기 위해선 대각화된 A를 통해 알아야 하고,
이때 어떠한 x에서라도 발산이 되면 안 된다.
대각화의 과정에는 고윳값과 고유벡터의 개념이 연결되어있고 이를 알면 폭주의 위험을 판단할 수 있다.

 

이후 내용은 진도를 더 나가는 대로 작성하도록 하겠다.

반응형

댓글()

지금까지 캐글을 시작하지 못햇던 이유

Machine Learning|2022. 2. 7. 13:11
반응형

데이터 특성에 대한 이해가 선행되어야 하는데 무작정 데이터 정제 없이 머신러닝에 넣고 돌릴 생각만 하고 있었다.

EDA, 시각화 다 좋다 하지만 그전에 데이터 특성에 대한 아무런 이해가 없었는데 무슨 EDA를 하고 시각화를 하겠나,,

사이드 프로젝트건, 프로젝트건 앞으로 어떤 데이터를 다루든 간에, 해당 데이터의 각 특성이 무엇을 의미하는지

정확히 이해하는 게 선행되어야 한다.

 

지금 하려는 캐글 집값 예측 모델도, MSSubClass가 int 형이지만, 실상은 주거형태를 코드 형식으로 나타낸 것이고,

이러한 실상은 범주형인데 수치화된 특성을 어떻게 다룰지를 데이터 특성을 이해하면서 깨달아한다.

 

동일한 맥락으로 과도한 이상치는 어떻게 처리할 것인지 Q3로 조정할 것인지 아예 제거할 것인지도 생각해야한다.

 

시각화 또한 마찬가지이다. 

어떠한 데이터 특성인지 미리 알고 있다면, 어떠한 분포를 나타낼지 어느 정도는 예측이 가능할 것이다.

그게 안 될 때, 시각화를 하려는 것이지 무작정 모든 데이터를 시각화하려면 그게 끝이 보일 리가 없다.

시각화는 단지 데이터를 이해하고, EDA에 도움을 주는 tool 일 뿐이지 그것이 전부는 아니다.

 

데이터 특성을 이해하다 보면 특성의 개수를 줄일 수 있다는 확신을 얻게 된다.

간단한 예로 특성 중 방의 가로와 세로가 분리되어 2개의 특성으로 나타나 있다면, 

둘의 곱인 방의 넓이로 간단히 표현 가능하다. 

또한 한쪽에 치중되어 분포되어있는 특성은 크게 중요하지 않을 수도 있겠다란 생각이 들게 한다.

 

데이터 정제를 이런 식으로 진행하고 데이터를 머신러닝에 넣고 굴리든 말든 하지 

데이터 이론을 배우고 시각화를 배우고 머신러닝 딥러닝 케라스를 배우고

배우기만 하기에는 너무 할게 많다. 

캐글이 원하는 것은 이런 게 아니라는 것을 뒤늦게 깨닫고 다시 제대로 시작해보려 한다.

 

 

참고할 블로그

https://mazdah.tistory.com/878?category=598657 

 

[머신러닝 Reboot] 독해 - 핸즈온 머신러닝(2판) 2장

늘상 그래왔듯이…내 머릿속에는 온갖 잡다한 관심과 호기심들이 종횡무진 날아다닌다. 덕분에 뭔가 하나를 진득하니 진행할 수가 없다…ㅠ.ㅠ 핸즈온 머신러닝 2판을 일기 시작한 것이 언제인

mazdah.tistory.com

 

반응형

댓글()

[프로그래머를 위한 선형대수] Review (2)

Machine Learning|2022. 2. 5. 15:28
반응형

2. 랭크, 역행렬, 일차방정식

2장에서는 결과 y로 원인을 추적하는 내용에 대해 다룬다.

y와 x 공간을 자유자재로 오갈 수 있는지, 정보가 온전히 보전되는지 살펴본다.

 

 

2.1 역문제 - 결과 y를 통해 x를 추정하는 형태의 문제

 

2.2 성질이 좋은 경우

성질이 좋은 경우는 "정칙 행렬"이고, 정보가 온전히 보존된다.

 정칙행렬 : 역행렬이 존재하는 정방행렬 A
 특이행렬 : 정칙행렬이 아닌 행렬

y에 대한 역행렬 x를 구하는 방법에는 두 가지가 있다.
1. 변수 소거로 연립방정식 풀기
2. 블록행렬 표기로 풀기 (가우스 요르단 소거법)  
   (A|y) 에서 (I|X)로 만듦

위의 방법론으로 역행렬이 구하는 것이 중간에 막힐 때, 피보팅 혹은 기본 변형을 사용한다.

피보팅 - 두 행을 바꿈

기본 변형
행을 c배함 - 단위행렬(n, n)이고 성분이 c인 행렬 Q를 곱한다 - det Q = c
a행의 c배를 b행에 더함 - 단위행렬 (b, a) 좌표 성분이 c인 행렬 R를 곱한다. - det R = 1
a행과 b행을 바꿈 - 단위행렬 a행과 b행을 바꾼 S를 곱한다 - det S = -1

  

2.3 성질이 나쁜 경우

이전 차원에는 성질이 좋은 경우 = x, y 차원이 같으므로 사상 A가 정방행렬인 경우였다.

하지만 이제는 성질이 나쁜 경우, 결과 y를 알 때, 원인 x를 구해야 한다.

성질이 나쁘다 함은 y에서 x로의 변환이 불완전함을 의미한다.

 

1. 단서가 부족한 경우

y의 차원이 x보다 작아 x의 정보를 완전히 알 수 없는 경우
(x -> y일 때) 원래보다 차원이 작아지므로 사상 A는 납작하게 누르는 사상이 된다.
이 경우에는 정보가 누락된다

사상 A에 의행 y에 도달하는 Ax = 0을 만족하는 x의 집합을 Ker A
Ex) x1(1,1) x2(3,4) -> y1(0) , y2(0) 이면 Ker A는 x1, x2가 된다.

2. 단서가 많은 경우 

y차원이 x보다 커 y내에 노이즈가 있는 경우 단서끼리 서로 모순되는 문제가 생긴다.
"주어진 A에 대해 x를 여러모로 움직인 경우에 A로 옮기는 y = Ax의 집합을 A의 상이라고 한다"
책의 말 표현을 쉽게 바꿔보자면 사상 A에 의해 y 공간상으로 옮겨진 x집합들을 Im A라고 한다.
라고 하는 게 좀 더 잘 와닿지 않을까 싶다.


3. x, y 차원의 개수가 일치해도 A가 납작하게 만드는 사상이라면 성질이 나빠진다.

 

간단하게 요약하자면

1.은 차원이 x(원인)가 차원이 작은 y(결과)로 이동한 상태에서
y의 단서로 x를 다시 알아내야 하는 상황

2.은 차원이 작은 x(원인)가 차원이 y(결과)로 이동한 상태에서,
y+노이즈의 단서로 x를 다시 알아내야 하는 상황

 

 

 

차원정리

x은 n차원 y는 m차원
m x n 행렬 A에 대해  dim Ker A + dim Im A = n 만족

m<n (가로가 긴 A)이면 단사 불가능 
같은 결과 y가 나오는 원인 x가 단 하나가 될 수 없다.
차원이 줄어들면서 하나로 모여 버리기 때문이다.
위의 1.과 연결

m>n (세로가 긴 A)이면 전사 불가능
존재하는 모든 y에 대응하는 x가 존재할 수 없다.
차원이 증가하면서 x에 대응하는 y 말고, 삐져나온 y'가 추가로 있기 때문
위의 2.과 연결

'납작하게'를 식으로 표현한다면
x1 != x2 인데, Ax1 = Ax2 가 성립하는 x1, x2가 존재한다는 말이다
이러한 경우 A는 선형 종속이라 하고, 아닌 경우를 선형 독립이라고 한다.

사상 A 내 벡터 a3가 a1, a2에 의해 정의가 된다면 이를 선형 종속이라 본다.

 

랭크

Im A가 이동점(y)의 공간 전체를 커버할 수 있는가?

랭크란 Im A의 차원을 의미하고 rank A라고 쓴다.

Ker A가 o 뿐이라면 Ker A는 y로 이동하는 x는 o뿐
= Ker A는 0차원 => rank A = n -> A는 단사 "y에 매칭 되는 x는  둘"

Im A가 m차원 전체를 커버한다면 삐져나온 y'가 없어야 한다
-> Im A는 m차원 -> rank A는 m -> A는 전사 " y에 x가 매칭 됨"

랭크의 기본 성질 

1. rank A <= m, n
2. 정칙행렬을 곱해도 랭크는 변하지 않는다.
3. 전치해도 랭크는 동일하다.
4. 행렬 A가 선형 종속인 경우, 랭크가 m보다 줄어든다.

A가 A = BC로 분해되어 3차원 -> 2차원 -> 3차원 공간으로 이동했을 때,
차원이 한번 줄어들었으므로, 3차원 공간상에서 rank A = 2 가 된다.
이를 "잃어버린 정보는 다시 복원할 수 없다" 라고 표현한다.

Im A를 다시 생각해보면 , n차원 벡터 x를 여러모로 움직이는 경우 y = Ax의 움질 일 수 있는 범위이다.
span{a1 ... an}이라고도 쓰며, 벡터 a가 만드는 '선형 부분 공간'이라고 부른다.

랭크를 계산하는 방법은 연립방정식을 풀 때와 유사하다.
행렬 A의 대각 성분을 1이 되게 하고, 비대각 성분을 0으로 만드는 과정을 반복해나가면 된다.

 

반응형

댓글()

[프로그래머를 위한 선형대수] Review (1)

Machine Learning|2022. 1. 30. 16:14
반응형

도입 

데이터 사이언스에 있어서 선형대수는 필수라고 하기에 책 읽기를 시작했다

선형의 의미가 무엇인지, 어떤 부분에서 선형대수가 쓰이는지를 알아가는 것을 목표로 하겠다.

 

데이터를 공간 속의 이라고 생각하면 직관이 먹힌다.

선형대수는 선형적 (직선이나 평면처럼 곧은 것)을 다룬다.

곧기에 쉽고 예측하기 좋고 명쾌한 결과를 얻을 수 있다.

 

______________________________________________________________________________________________________________________________

1장 벡터, 행렬, 행렬식

 

[A] 벡터공간

 

등장하는 기본 개념

  • 벡터 - 화살표 또는 공간의 점
  • 행렬 - 공간에서 공간으로의 직교 사상
  • 행렬식 - 위의 사상에 따른 부피 확대율
  • 횡 벡터 - 가로 벡터
  • 종 벡터 - 세로 벡터
  • 벡터 연산 - 덧셈과 스칼라 배
  • 선형 공간 or 벡터 공간 - 덧셈과 정수배가 정이 된 세계로 길이나 각도가 정의되어있지 않다

 

  • 기저 - basis 벡터(선형 공간을 구성하는 최소한의 벡터)들의 집합

    <기저의 조건>
    1. 각 기저 벡터가 독립 = 나타내는 방법은 한 가지 = 토지 하나에 번지는 하나
    2. n차원 공간을 벡터로 (선형 결합) 표현 가능 = 기준 벡터에 번지를 매겨 위치를 정함
       = 어떤 벡터라도 기저 벡터로 나타낼 수 있음 = 모든 토지에 번지가 붙어있음

위 전체를 관통하는 간단한 예시
백두산의 높이를 3000m라고 표현했을 때, 3000은 좌표(번지), m는 기저(토지)이다.
만약 m(토지)가 feet로 바뀔 경우 9842.52(번지)도 바뀐다.

 

______________________________________________________________________________________________________________________________

[B] 행렬과 사상

등장하는 기본 개념

  • 정방 행렬 - n x n 꼴 행렬
  • 영행렬 = o
  • 단위행렬 = I
  • 대각 행렬 = diagonal
  • 역행렬 - AA^-1 = I를 만족하는 행렬 A^-1
    역행렬은 이동점 y를 가지고 원래점 x를 구하기 위함이다
    역행렬은 있을 수도 없을 수도 있다.
    ex ) y 공간이 납작하게 눌린 경우 원래점 x를 찾을 수가 없다

 

행렬이란 선형 사상을 좌표 성분으로 표시한 것이고, 행렬의 각 열은 기저 벡터의 목적지를 나타낸다

행렬(요소)과 벡터(요인)의 관계는 순수한 관계이다 y = Ax

 

순수한 관계란 상승효과나 규모에 의한 변화가 없다 

즉, 벡터의 덧셈과 정수배를 제대로 유지한다는 말이다.

 

사상이 같으면 행렬도 같다

같은 크기의 행렬 A, B가 임의의 벡터 x에 대해 항상 Ax = Bx를 만족한다면 A = B이다

 

________________________________________________________________________________________________________________

[C] 행렬식과 확대율

 

행렬식det A로 표기하고, y로 옮겨진 선형 공간의 부피 확대율을 의미한다.  

행렬식이 0이면 납작해짐을 의미하고 이때 역행렬은 없다

 

아래 두 가지의 경우 선형 공간이 납작해진다

 

두 열이 선형 관계인 경우, 기저 벡터 하나가 줄어들기에 차원이 줄어들고 납작해진다.

어딘가의 열이 모두 0인 경우, 기저 벡터 하나가 없는 상태이므로 납작해진다.

 

유용한 성질

  • 어느 열의 정수 배를 다른 열에 더해도 값은 안 바뀐다
  • 행렬식의 성질은 행과 열의 역할을 모두 바꿔도 (전치) 성립한다
  • 다중 선형성 : det(cA) = cⁿ det(A)
  • 두열을 바꾸면 부호가 역전된다 

 

행렬식 계산 방법은 다양한데 생략하겠다... 어차피 컴퓨터가 다해주니깐

 

________________________________________________________________________________________________________________

마무리

책을 문장을 하나하나 읽으면서 이해가 안 된다면, 될 때까지 읽어야 된다.

일본어를 한국어로 옮긴 번역본 책이라 그런지 문장 하나하나가 어수선하거나 한국말로 쓰여 있는데 말이 이상한 경우가 많았다.그러다 보니 하나의 챕터에서 전하고자 하는 내용은 정말 단순한 내용임에도, 읽으면서 매우 어렵게 느껴질 수 있다.이런 경우 다음 챕터로 넘어가기보다 해당 부분을 계속 읽어보고 안되면 다음날 읽어보고 이런 식으로 진행하면 어느 정도 답답함이 풀릴 것이다.

 

원래는 따로 노트에 필기하면서 책을 읽을 생각이었는데 추가로 블로그에 글을 쓰는 게 더 장기기억화 될 것 같고,체계를 잡으면서 공부를 하는 것이 좋을 듯해 블로그에도 글을 쓴다.

 

일반 강의에선 선형대수를 하나의 수학 과목처럼 느껴지고 개념이 데이터와 어떤 연관이 있는지 잘 이해는 안 갔으나,

이 책을 통해서 어느 정도 이해해 나가고 있다.

반응형

댓글()

leetcode 423. Reconstruct Original Digits from English

Algorithm|2022. 1. 27. 20:54
반응형

 

 

Reconstruct Original Digits from English - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문제점 : one이 가능한 모든 것들을 잡아버림

 

class Solution {
public:
    string originalDigits(string s) 
    {
        vector<int> map(26);
        string ans = "";
        
        for(int i=0; i<s.size(); i++)
            map[s[i]-97] += 1;
        
        
        for(int i=0; i<s.size(); i++)
        {
            if(map['z'-97] > 0 && map['e'-97] > 0 && map['r'-97] > 0 && map['o'-97] > 0)
            {
                map['z'-97]--; 
                map['e'-97]--; 
                map['r'-97]--;
                map['o'-97]--;
                ans += '0';
            }
            else if(map['o'-97] > 0 && map['n'-97] > 0 && map['e'-97] > 0)
            {
                map['o'-97]--; 
                map['n'-97]--; 
                map['e'-97]--;
                ans += '1';
            }
            else if(map['t'-97] > 0 && map['w'-97] > 0 && map['o'-97] > 0)
            {
                map['t'-97]--; 
                map['w'-97]--; 
                map['o'-97]--;
                ans += '2';
            }
            else if(map['t'-97] > 0 && map['h'-97] > 0 && map['r'-97] > 0 && map['e'-97] > 1)
            {
                map['t'-97]--; 
                map['h'-97]--; 
                map['r'-97]--;
                map['e'-97] -=2;
                ans += '3';
            }
            else if(map['f'-97] > 0 && map['o'-97] > 0 && map['u'-97] > 0 && map['r'-97] > 0)
            {
                map['f'-97]--; 
                map['o'-97]--; 
                map['u'-97]--;
                map['r'-97]--;
                ans += '4';
            }
            else if(map['f'-97] > 0 && map['i'-97] > 0 && map['v'-97] > 0 && map['e'-97] > 0)
            {
                map['f'-97]--; 
                map['i'-97]--; 
                map['v'-97]--;
                map['e'-97]--;
                ans += '5';
            }
            else if(map['s'-97] > 0 && map['i'-97] > 0 && map['x'-97] > 0)
            {
                map['s'-97]--; 
                map['i'-97]--; 
                map['x'-97]--;
                ans += '6';
            }
            else if(map['s'-97] > 0 && map['e'-97] > 1 && map['v'-97] > 0 && map['n'-97] > 0)
            {
                map['s'-97]--; 
                map['e'-97] -=2; 
                map['v'-97]--;
                map['n'-97]--;
                ans += '7';
            }
            else if(map['e'-97] > 0 && map['i'-97] >0 && map['g'-97] > 0 && map['h'-97] > 0 && map['t'-97] > 0)
            {
                map['e'-97]--; 
                map['i'-97]--; 
                map['g'-97]--;
                map['h'-97]--;
                map['t'-97]--;
                ans += '8';
            }
            else if(map['n'-97] > 1 && map['i'-97] > 0 && map['e'-97] > 0)
            {
                map['n'-97]-=2; 
                map['i'-97]--;
                map['e'-97] --; 
                ans += '9';
            }
            cout << ans<< "ans & o" << map['o'-97] << endl;
                
        }
        
        return ans;
    }
};

반응형

'Algorithm' 카테고리의 다른 글

[백준] 1427. 소트인사이트 (C++)  (38) 2022.01.25
[백준] 11656. 접미사 배열 (C++)  (9) 2022.01.25
[백준] 숫자놀이 C++  (16) 2022.01.25
[백준] 10814. 나이순 정렬 (C++)  (3) 2022.01.24
[백준] 1431. 시리얼 번호 (C++)  (4) 2022.01.23

댓글()

[백준] 1427. 소트인사이트 (C++)

Algorithm|2022. 1. 25. 10:04
반응형
 

1427번: 소트인사이드

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool cmp(int a, int b) 
{
	if (a > b) return true;
	else return false;
}

int main()
{
  string s;
  // int 배열 생성
  vector<int> a; 

  //초기 숫자 입력을 string 형태로  
  cin >> s;

	
  // string 인덱스 마다 -> int 형태로 변환 후
  // int 배열에 추가
  for(int i=0; i<s.size(); i++)
    a.push_back(s[i]-48);
       
  // int 배열 정렬
  sort(a.begin(), a.end(),cmp);
  
  for(int i=0; i<a.size(); i++)
    cout << a[i];

  return 0;
}
반응형

댓글()

[백준] 11656. 접미사 배열 (C++)

Algorithm|2022. 1. 25. 09:40
반응형
 

11656번: 접미사 배열

첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000보다 작거나 같다.

www.acmicpc.net

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool cmp(string a, string b) 
{
	if (a < b) return true;
	else return false;
}


int main()
{
  string s;
  vector<string> ss; 
  
  cin >> s;
	
  // 접미사 추출 및 string 벡터 저장
  for(int i=0; i<s.size(); i++)
  {
    string tmp = s.substr(i,s.size());
    ss.push_back(tmp);           
  }
  
 // sort
 sort(ss.begin(), ss.end(),cmp);
  
 // 출력
 for(int i=0; i<ss.size(); i++)
   cout << ss[i] << endl;

	return 0;
}
반응형

댓글()

[백준] 숫자놀이 C++

Algorithm|2022. 1. 25. 09:08
반응형
 

1755번: 숫자놀이

79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"이 된다. 80은 마찬가지로 "eight zero"라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero"가 "seven nine"보다 사전순으로

www.acmicpc.net

 

다양한 변수를 가지고 있는 객체를 하나의 변수를 기준으로 정렬하는 방법을 유용하게 잘 쓰고 있다.

마치 c++의 pandas를 만난 기분이다.

 

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

class number
{
    public: 
        int n;
        string N = "";
 
};

bool cmp(number a, number b) 
{
	if (a.N < b.N) return true;
	else return false;
}

string int2string(int k)
{
  string s;

  if(k == 1)
    s ="one";
  else  if(k == 2)
    s ="two";
  else  if(k == 3)
    s ="three";
  else  if(k == 4)
    s ="four";
  else  if(k == 5)
    s ="five";
  else  if(k == 6)
    s ="six";
  else  if(k == 7)
    s ="seven";
  else  if(k == 8)
    s ="eight";
  else  if(k == 9)
    s ="nine";
  else 
    s = "zero";
  return s;
}


int main()
{
  int enter=0;
  int m,n;
  cin >> m >> n;
  number p[100];

  for(int i=m; i<=n; i++)
  {
    string s;
         
    
    p[i].n = i;

    if(i/10 != 0)
      p[i].N = int2string(i/10);

    p[i].N += int2string(i%10);

    
  }
  
  sort(p+m,p+n+1,cmp);
  
 for(int i=m; i<=n; i++)
 {
   enter++;
   cout << p[i].n << " ";

   if(enter == 10)
   {
     cout << endl;
     enter = 0;
   }
 }
	return 0;
}
반응형

댓글()

[백준] 10814. 나이순 정렬 (C++)

Algorithm|2022. 1. 24. 20:05
반응형

 

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

이름 벡터 100개를 생성한 후, 나이에 해당하는 벡터에 입력해주는 알고리즘은

시간 초과로 실패했다

이유를 찾아보니, sort를 사용해야 했다.

 

int main()
{
  int n;
  vector<vector<string>> name;

  cin >> n;

  for(int i=0; i<200; i++)
  {
    vector<string> v;
    name.push_back(v);
  }

  for(int i=0; i<n; i++)
  {
    int old;
    string s;
         
    cin >> old >> s;
    name[old-1].push_back(s);
  }

  for(int i=0; i<200; i++)
      for(int k=0; k<name[i].size(); k++)
        cout << i+1 << " "<< name[i][k] << endl;
  
	return 0;
}

 

class와 sort를 사용해 풀었는데, 정답대로 잘 나오지만, 왜 틀렸는지는 알 수가 없다...

로직에는 문제가 없는데,,,, 백준 억까 멈춰!

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

class people
{
    public: 
        int age;
        string name;
 
};

bool cmp(people a, people b) 
{
	if (a.age < b.age) return true;
	else return false;
}



int main()
{
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  people p[n];

  for(int i=0; i<n; i++)
  {
    int old;
    string s;
         
    cin >> old >> s;
    p[i].age = old;
    p[i].name = s;
  }
  
  sort(p,p+n,cmp);
  
  for(int i=0; i<n; i++)
    cout << p[i].age << " " << p[i].name << endl; 
	return 0;
}
반응형

댓글()