반응형

Git의 첫 시작은 Git Bash에서 mkdir부터 시작합니다.

 

오랜만에 다시 Git을 사용해보려고(거의 복기 수준) 매뉴얼 보면서 따라가보는데

그런데 오늘은 처음부터 복병이 있네요. Permission Denied라고 뜹니다 ㅠ_ㅠ

 

이걸 해결하려고 찾아보고 실행해본 방법 중 가장 쉬운방법은

아이콘에서 오른쪽 마우스 하고 관리자 권한으로 실행하는 방법이었습니다.

 

이 방법으로 Try 해보세요 :)

 

 

반응형
반응형

<순서>

1. 데이터 프레임 만들기

2. 데이터 프레임에 Column 추가

3. 데이터 프레임에서 Column 제거

 

 

1. 데이터 프레임 만들기

종종 샘플 데이터를 만들 때 데이터프레임을 직접 만들어야 하는 경우가 있습니다. R에서 데이터 프레임을 직접 만드는 방법은 아래와 같습니다.

# Data Frame 만들기

id <- c(1,2,3,4,5,6)
class <- c(1,1,1,1,2,2)
math <- c(50,60,45,30,25,50)
english <- c(98,97,86,98,80,89)

exam <- data.frame(id,class,math,english, stringsAsFactors = F)

1) c()를 이용해 길이를 맞춰 벡터를 생성한다

2) 해당 벡터를 data.frame이라는 함수와 함께 생성한다.

3) Character가 자동으로 Factor로 처리되는 것을 막기 위해 stringsAsFactors = F로 설정해준다.

 

결과는 아래와 같습니다.

  id class math english
1  1     1   50      98
2  2     1   60      97
3  3     1   45      86
4  4     1   30      98
5  5     2   25      80
6  6     2   50      89

 

꼭 이 방법을 사용해야 하는 것은 아니지만, 가장 깔끔하게 데이터를 생성할 수 있는 방법이라고 생각합니다.

더 좋은 방법은 댓글로 공유해주세요 :)

 

2. 데이터 프레임에 Column 추가하기

위에서 만든 데이터 프레임은 시험 점수에 대한 데이터 프레임입니다. 만약 데이터 프레임에 과학점수를 추가하고 싶을 수 있겠죠? 그럼 어떻게 해야 할까요?

# Data Frame Column 추가하기
# 1) $ 사용하기
exam$science <- c(50,60,78,58,65,98)

먼저 위와 같이 $로 이용한 방법이 있습니다.

기존의 데이터 프레임에서 $를 사용하여 새로운 Column이름을 붙여주고 똑같은 길이의 벡터를 붙여주는 방법입니다.

 

# 2) transform 함수 사용하기
exam <- transform(exam, physics = c(10,10,10,20,40,30))

두 번째로 transform 함수를 사용하는 방법입니다.

Transform 함수를 통하여 Physics라는 Column을 추가했습니다.

결과를 볼까요?

  id class math english science physics
1  1     1   50      98      50      10
2  2     1   60      97      60      10
3  3     1   45      86      78      10
4  4     1   30      98      58      20
5  5     2   25      80      65      40
6  6     2   50      89      98      30

Science와 Physics가 잘 생성된 것을 볼 수 있네요 :)

 

3. 데이터 프레임에서 Column 제거

마지막으로 만든 Column을 지우고 싶은 경우가 있을 수 있습니다. 현재 exam 데이터 프레임에는 science와 physics 점수가 들어가 있습니다. 이 중 physics 점수를 빼고 싶다고 가정할게요.  

 

# Data Frame Column Column 지우기

exam$physics <- NULL

 $을 사용해서 제거를 원하는 Column에 NULL을 할당해주면 됩니다. 간단하죠?

 

 

감사합니다 :)

반응형
반응형

데이터 분석에서 데이터를 구하는 일은 늘 숙제인 것 같다.

오늘은 네이버 실시간 증권 뉴스를 가져오는 연습을 진행해본다.

 

1. 네이버 증권뉴스 주소 

finance.naver.com/news/news_list.nhn?mode=LSS2D&section_id=101&section_id2=258

 

실시간 속보 : 네이버 금융

관심종목의 실시간 주가를 가장 빠르게 확인하는 곳

finance.naver.com

뉴스 제목에서 오른쪽 마우스 - 검사를 누르면 오른쪽에 패널이 생기면서 태그들이 생성됨

 

 

2. RStudio 켜고 패키지 다운 및 라이브러리 생성

install.packages(c("rvest","ggplot2","dplyr","httr"))
library(httr)
library(rvest)

 

3. URL 생성

url <- 'https://finance.naver.com/news/news_list.nhn?mode=LSS2D&section_id=101&section_id2=258'
data <- GET(url)

위에 링크에 맞는 url을 url객체에 넣어준다.

 

4. 태그를 찾아 text 뽑아내기

news <- read_html(data, encoding="EUC-KR")

headlines <- news %>% 
  html_nodes('dl') %>% 
  html_nodes('.articleSubject') %>% 
  html_nodes('a') %>% 
  html_text()

 

5. 결과 보기

 [1] "‘삼천피’‘천스닥’ 시대 눈앞에 왔다"                                                  
 [2] "박셀바이오, `투자위험종목` 지정에 6일 거래정지된다"                                     
 [3] "코로나19로 지친 삶…술·담배 소비액 역대 최대"                                          
 [4] "[신년 대예측]코스피 3천 시대?…동학개미 힘 어디까지?"                                   
 [5] "[데일리안 오늘뉴스 종합] 박원순 피소 몰랐다는 남인순에 野 맹폭, 배달비 부담에 직접 나.."
 [6] "[어르신이 행복한 나라] 경제력 있고 건강한데 여가는 아직도 경로당?"                      
 [7] "두산 오너家, 퓨얼셀 지분 3천억 규모 블록딜로 처분"                                      
 [8] "고객 대접할 쿠키를 발 위에…백화점 직원들의 일탈"                                       
 [9] "코스피 3000선 육박…배경엔 68조 고객예탁금"                                             
[10] "코스피 1000 돌파후 31년만에 `삼천스피`시대 연다"                                        
[11] "[마켓인사이트]두산 오너家의 '새옹지마'...석달 전보다 50% 높은값에 퓨얼셀 블록딜"        
[12] "[표]아시아 주요 증시 동향(1월 5일)"                                                     
[13] "국민연금, 대한항공의 아시아나 인수 '반대'...\"주주가치 훼손 우려\""                     
[14] "5일 장 마감 후 주요 종목 뉴스"                                                          
[15] "“세스코, 믿고 먹는 깨끗한 음식점 되는데 도움”"                                        
[16] "장 마감 후 기업공시[1월 5일]"                                                           
[17] "[마켓인사이트]AJ셀카, 중고차 '오토허브' 운영사 신동해홀딩스에 매각"                     
[18] "'8만전자' 된 삼성전자, 시총도 500조원 돌파"                                             
[19] "엔드림, 조이시티 지분 23만주 추가 취득"                                                 
[20] "오르비텍, 100억원 규모 CB 발행 결정"      

So Happy Baby

 

크롤링하는 법은 해도 해도 잘 안쓰니 까먹는 것 같다.

R을 산소처럼 사용해야 이 툴이 손에 익을텐데 아직은 멀었나보다.

Qlik 사용하듯 R을 편하게 다루는 날도 얼른 왔으면 좋겠다.

 

반응형

'Data > R' 카테고리의 다른 글

R) 명령어로 버전 업그레이드 하기  (1) 2021.02.12
R) Data Frame 다루기  (0) 2021.02.06
R) lapply와 sapply의 차이  (0) 2020.04.23
R) class(), typeof()의 차이  (0) 2020.04.23
R) apply 정리  (0) 2020.04.22
반응형

섣부르게 퀀트를 시작해야겠다는 마음은 잠깐 접어두기로 한다.

 

스스로 백테스팅을 진행할 수 있고 그 전략에 신뢰를 가질 수 있는 정도가 되어서야만이 그 전략을 흔들리지 않고 믿을 수 있는 실력에 이를 수 있다고 생각한다.

 

하지만 책들을 살펴봐도, 그런 백테스팅을 수동으로 할 수 있는 방법을 알려주는 곳이 잘 없는 것 같다. (백테스팅을 하더라도 안의 로직들은 숨겨져 있는 경우를 포함)

 

그래서 스스로 공부하면서 백테스트를 수행해보고 다양한 전략을 검증해보는 경지에 이르러보고 싶다는 생각이 들었다.

하지만 그냥 되지는 않을 것 같아서 시간을 두고 해보기로 했다.

 

업무가 바쁘지만, 시간을 쪼개서 이 작업과 공부를 병행할 수 있는 능력과 끈기를 길러보고 싶다.

오랫동안 잊고 있던 작업이다. 끈기 있게 물고 늘어져서 완성하는 것 말이다.

 

2021년은 제씨 퀀트의 원년의 해로 정하고 마음을 다잡아보자.

그리고 이 과정에서 나는 컴퓨터공학적 지식과 투자지식을 모두 활용하여 하나의 방법론으로 엮어갈 수 있는 힘과 능력을 얻게 되리라 믿어본다.

 

천천히, 하지만 꾸준히.

2021.01.03 제씨

반응형
반응형

"내가 직접 백테스팅을 해서 퀀트투자의 포트폴리오를 평가할 수는 없을까?"

이 질문으로부터 시작했습니다.

 

그 다음 이 질문으로 넘어갔지요.

"그럼 20년치의 기업 재무제표 데이터를 모두 구할 수는 없을까?"

 

Price의 변화와 거래량은 20년이든 30년이든 네이버 데이터를 활용하면 어렵지 않게 크롤링할 수 있었습니다.

 

하지만 재무제표 데이터는 손질이 많이 필요한 데이터이니만큼, 3년치 이상의 데이터를 구하기가 쉽지 않았죠.

 

그래서 현재는 FnGuide의 데이터를 유료로 구매해서 사용해볼 생각입니다.

백테스트를 수행해보기 위해서는 불가피한 과정이기도 할 것 같네요.

 

앞으로 20년치 데이터를 확보한 후 Qlik으로 백테스팅하여 퀀트를 수행하려고 합니다.

 

그 중간 과정을 보여드리도록 하죠.

반응형
반응형

 

먼저 하는 세줄 요약:

마션 너무 끝내줘. 엔지니어 멋있어. 나도 탐험이 하고 싶다.

 

주말마다 지방에서 업무를 하는 탓에 긴 시간을 버스에서 보내야 한다. 그런데 요즘 세상이 얼마나 좋아졌냐면, 스트리밍으로 영화를 봐버린다는 것이다. 갓플릭스의 은혜를 받고 본 마션의 후기, 지금 시작한다.

 

 

1. 엔지니어를 향한 미국의 시선

 

우리가 가장 가까이에서 사용하는 것들 중에서 엔지니어의 손으로부터 탄생하지 않은 것이 없다. 가전, 컴퓨터, 자동차, 핸드폰, 지금 타고 있는 이 버스까지. 엔지니어들은 늘 문제를 고민하며 그것을 해결할 수 있는 구체적 방법을 고안해 난제를 해결한 사람들이다. 그리고 그들에 대한 감독의 존경심이 이 영화 전체에 녹아져 있는 것 같다. 기술을 가진 사람이 결국 상상력을 가지면 그것을 진짜로 만들어낼 수 있는 거구나 하는 것을 영화로써 보여주는 것 뿐인데, 너무 벅차고 신났다.

만약 내가 어릴 때 이 영화를 봤고, 이 영화에서 의미하는 것들을 이해할 수 있었다면, 나는 지체없이 공학을 공부했을 것 같다. 그 때는 맞고 지금은 틀린 게 아니지만, 그래도 아쉽다. 상상력을 실천으로 만드는 힘에 나는 너무나도 큰 공경을 이제서야 가지는 것 같다.

 

2. 아직 탐험되지 않은 곳을 향한 인간의 호기심

 

현 지구의 구석구석은 탐험되었다. 물론 바다 아래 깊은 곳은 아직 인류의 영역 밖이나, 그래도 우리가 발을 딛고 걸을 수 있는 곳 중에서 인류의 호기심이 닿지 않은 곳이 없다. 새로운 곳에서 새로운 것을 만나는 것은 정말 신나는 일이다. 물론 그것이 겉잡을 수 없는 공포와 준비되지 않은 참혹함으로 이어져왔던 과거의 역사가 있지만, 그럼에도 불구하고 뻗어온 인류의 호기심 덕에 하나의 지구라는 공동체로서 세계인이 묶였다.

그런 의미에서 영화 내내 화성을 상상했다. 영화 속의 저 장면은 분명 똑같지 않더라도, 우주 저 편 어딘가에 실제로 존재하는 곳이겠지. 나도 저 곳에 닿아보고 싶다. 그 곳에서 붉은 흙을 비추는 태양빛을 바라보고 싶다는 생각을 했다.

 

3. 생존의 의지는 벅차오른다.

 

죽으려고 하는 의지는 무기력하다. 무엇도 할 수 없다고 느끼게 만들지만, 살아야겠다는 의지는 눈 앞에 있는 모든 문제를 해결할 수 있는 방법을 찾게 한다. 나는 문제해결의 순간이 생존, 또는 당면한 문제와 매우 가까이 있다는 것을 확인했다. 영어가 느는 순간은 내가 외국에서 유학을 해야 하는 때이며, 코딩이 느는 순간은 당장 내일 이 문제를 해결하지 않으면 처먹어야 하는 욕 때문이듯, 와트니를 움직인 것은 급박한 문제(물론 심각성에 있어서 비교가 안되는 수준이지만)를 해결해야 하겠다는 의지였던 것 같다.

 

4. 한 사람의 목숨을 두고 내리는 결정

 

예전에 피랍되었던 한국인을 두고 갑론을박했던 일이 있었다. 사람의 목숨과 그들을 구하는 데에 걸린 수많은 자원과 또다른 희생과 관련된 문제였기 때문이다. 그 때 피랍된 사람을 구해야겠다고 내린 결정에는 어떤 가치가 내포되어 있었을까? 만약 일이 잘못된다고 하더라도 그것을 이해할 수 있는 마음에는 무엇이 있을까?

한 사람의 목숨값은 얼마일까. 그것이 타인일 때는 그렇게 가벼워 보이지 않다가도, 나의 문제로 다가왔을 때는 그것은 온 세상의 문제다. 하지만 영화에서는 와트니의 생명만이 걸려있었다고 보이진 않는다. 인류가 걸어두고 온 희망, 꺼뜨리지 않고 그것을 찾으려는 의지, 앞서 말했던 벅차오르는 생에 대한 집착 같은 것이 눈물짓도록 힘쓰게 만드는 원동력 같다.

 

기대하지 않고 봤는데, 시간가는 줄 모르고 본 영화 마션. 2015년도 개봉한 영화이나 많은 사람에게 추천해주고 싶다. 아 이과갈걸.

반응형
반응형

노트패드에서 디버깅할 때 ; 단위로 끊어져있지 않은 경우 가독성이 매우 떨어진다..

이럴 때 사용할 수 있는 유용한 잡기!

 

1. 'Alt + F'

2. 찾을 내용 :  ; 

3. 검색 모드-확장(\n, \r, \t, \0, \x...) 체크

4. 바꿀내용 : ;\n

5. 모두 바꾸기(A) 클릭

반응형
반응형

안녕하세요 제씨입니다.

가을이 한층 더 깊어졌네요. 점점 추위가 익숙해지는 날씨가 되는 것 같습니다.

여러분도 고뿔 조심하셔요 :)

 

오늘은 고객사와 논의하면서 Performance에 대한 이슈가 제기되었습니다.

무슨 말이냐면, QlikView의 화면 로딩이 느리다는 것이지요 ㅠ_ㅠ

 

저도 어찌어찌하면서 찾아보니 다음과 같은 자료가 잘 정리되어 있더군요.

 

 

Performance and Optimization Best Practices in Qlik v2.pptx
3.45MB

 

Qlik community에서 배포되어있는 파일을 참고삼아 공유합니다.

영어로 되어있지만, 꼼꼼하게 퍼포먼스 향상을 어떻게 해야 하는지 적혀있으니 참고하세요 :)

 

 

퍼포먼스가 느려지는 이유는 다양하지만 대표적으로 꼽자면,

데이터가 너무 방대하거나, 화면에 표현식이 너무 많이 들어가 있거나

If나 반복문 로직을 사용해서 퍼포먼스가 안좋아지는 경우가 대표적이겠네요.

 

그럼 이런 퍼포먼스 이슈들을 어떻게 해결해야 할까요?

 

 

 

1. 복잡한 수식은 Script에서 해결하기

화면에서 If를 쓰거나 반복문을 사용할 때 먼저 생각해야 할 점은, 그 표현식의 로직을 Script에 태울 수 있냐는 점입니다.

그럼 Qvd파일로 마트화해서 데이터 값만 불러들이고, 표현식에서는 간단한 Sum정도로 표현할 수 있도록 하는 것이죠.

최대한 표현식을 가볍게 하는 게 좋습니다.

 

 

 

 

2. IF 연속문을 Pick-Match로 치환하기

If문 안에 If문이 들어있는 경우, 퍼포먼스에 큰 영향을 미친다고 합니다. If문이 기본적으로 연관된 테이블을 스캔하기 때문이라고 하네요. 그래서 시간이 지날수록 퍼포먼스가 좋아질 리가 없겠죠?

그럼 이런 경우 가급적이면 Pick-Match로 치환하여 표현할 수 있는 방법을 사용하는 게 좋습니다.

	If( Region=‘North America’,  100, 
		if( Region=‘Asia’,50, 
			if( Region=‘Europe’,75)
		)
	)
=pick( match( Region,'North America','Asia','Europe'),100,50,75)

 

 

3. Set으로 대체하여 사용하기

가급적 Set으로 사용할 수 있으면 Set으로 표현하고, If문을 최소화하는 게 좋습니다. 또한 If문을 불가피하게 사용해야 할 경우에는, 문자열 검색이 아닌 Integer 검색이 될 수 있도록 구축하는 게 좋습니다.

하지만 Set으로 표현할 수 있다면 최선이겠죠?

 

Worst:  Sum(  If(  ClientGroup=‘North America Sales’, Sales) )   

Better:  Sum( If ( ClientGroupNum=1,Sales))

Best:  Sum( {<ClientGroupNum={1}>} Sales)

 

 

 

 

4. AGGR(), 계산된 차원(Caculated Dimension)도 가급적 피하자

Aggr() 함수는 강력한 기능입니다. 표현식 내에서 Group By 값으로 집계된 값을 계산할 수 있도록 도와주죠. 하지만 퍼포먼스 측면에서는 도움이 되지는 않습니다. 그래서 가급적이면, Script 단에서 내려서 해결해주는 게 좋다고 하네요!

 

 

 

 

5. 3~4개 이상의 테이블을 참조하는 차트를 가급적 피하자

데이터 모델링에서 신경써야 하는 부분이겠죠. 그래서 Fact Table은 가급적 최소화 하는 게 좋습니다. 다양한 테이블을 참조해서 가져오게 되면 성능이 저하되니까요.

 

퍼포먼스를 고려한다면 가급적 모든 Table을 Concatenate해서 하나의 통테이블로 만들면 좋다고 합니다. 하지만 모델링 측면에서 반복되는 데이터를 줄이고, Schema를 담은 정리하기 위해서는 그 중간을 잘 찾아가는 게 개발자/컨설턴트의 역할일 것 같습니다.

 

 

가만 살펴보니 퍼포먼스 저하의 주범은 If문인 경우가 대부분이군요. 조건문을 최소화하는 방향으로 고객사의 화면을 가볍게 만들어봐야겠습니다. 숱을 치는 느낌으로 말이죠 :)

 

이상으로 오늘의 포스팅을 마치겠습니다.

그럼 다음 포스팅까지 안녕히!

반응형

+ Recent posts