반응형

ChatGPT의 가능성

 

ChatGPT에서 발표한 GPTs로 이제 프로그래머가 아닌 일반 사람들이 자기만의 AI를 활용할 수 있는 세상이 열리게 되었다.

상상해 보자.

친구와 대화하는 것과 마찬가지로 컴퓨터와 빠르게 소통할 수 있는 세상을!
그런 세상이 어떻게 보일까?
일상 생활 속에서 어떤 응용 프로그램을 만들어 사용할까?

 

이러한 인공 지능 모델의 영향은 단순한 음성 어시스턴트를 넘어서며, OpenAI의 모델 덕분에 개발자들은 이제 한때 과학 소설로만 여겨졌던 방식으로 우리의 필요를 이해하는 응용 프로그램을 만들 수 있다.

ChatGPT란?

 

그런데 GPT-4 ChatGPT는 무엇일까?


먼저 이러한 인공지능 모델의 기초, 기원 및 주요 기능을 알아보도록 하자.
이러한 모델의 기본을 이해함으로써 다음 세대의 LLM 기반 응용 프로그램을 만드는 길에 한 발자국 나아갈 수 있을 것이기 때문이다.

 

GPT-4 ChatGPT의 개발을 형성한 기본적인 구성 요소를 제시한다.
우리의 목표는 언어 모델과 NLP의 포괄적인 이해, 트랜스포머 아키텍처의 역할, 그리고 GPT 모델 내의 토큰화 및 예측과정을 제공하는 것이다.

 

LLM(대형 언어 모델)로서, GPT-4 ChatGPT는 기계 학습(ML)과 인공 지능(AI)의 하위 분야인 자연어 처리(NLP) 분야에서 얻은 최신 유형의 모델이다.


GPT-4
ChatGPT에 대해 알아보기 전에 NLP와 그와 관련된 분야를 살펴보는 것이 중요합니다.

AI에 대한 다양한 정의가 있지만, 대략적으로 합의되는 정의 중 하나는 AI가 일반적으로 인간 지능이 필요한 작업을 수행할 수 있는 컴퓨터 시스템의 개발이라고 말한다.


이 정의에 따라 많은 알고리즘이 AI 범주에 속한다.
예를 들어 GPS 애플리케이션에서의 교통 예측 작업이나 전략적 비디오 게임에서 사용되는 규칙 기반 시스템을 생각해보자.
이러한 예에서 기계는 외부에서 보면 이러한 작업을 수행하기 위해 지능이 필요한 것처럼 보인다.

ML AI의 하위 집합이다.
ML
에서는 AI 시스템에서 사용되는 의사 결정 규칙을 직접 구현하지 않는다.
대신 시스템이 예제에서 스스로 학습할 수 있게 하는 알고리즘을 개발하려고 한다.
ML
연구가 시작된 1950년대 이후로 많은 ML 알고리즘이 과학 문헌에서 제안되었다다.

이 중에서도 딥러닝 알고리즘이 주목을 받았다.
딥러닝은 뇌의 구조에서 영감을 받은 알고리즘에 중점을 둔 ML의 한 분야다.
이러한 알고리즘을 인공신경망이라고 한다.
이들은 매우 큰 양의 데이터를 처리하고 이미지 및 음성 인식, 그리고 NLP와 같은 작업에서 매우 우수한 성능을 발휘할 수 있다.
GPT-4
ChatGPT는 트랜스포머(변환자)라고 불리는 특정 유형의 딥러닝 알고리즘을 기반으로 한다.
트랜스포머(변환자)는 읽기 기계와 같이 작동한다.
문장이나 텍스트 블록의 다른 부분에 주의를 기울여 그 문맥을 이해하고 일관된 응답을 생성한다.
또한 문장 내 단어의 순서와 그 문맥을 이해할 수 있다.
이로 인해 언어 번역, 질문 응답, 텍스트 생성과 같은 작업에서 높은 효율을 발휘한다.
위 그림은 이러한 용어들 간의 관계를 나타나고 있다.

 

NLP는 컴퓨터가 자연스러운 인간 언어를 처리, 해석 및 생성할 수 있도록 하는 AI의 하위 분야다.
현대적인 NLP 솔루션은 기계 학습 알고리즘을 기반으로 한다.
NLP
의 목표는 컴퓨터가 자연어 텍스트를 처리할 수 있게 하는 것이다.
이 목표는 다음과 같은 다양한 작업을 포함한다:

 

1. 텍스트 분류

입력 텍스트를 미리 정의된 그룹으로 분류한다.
이에는 감정 분석 및 주제 분류와 같은 작업이 포함된다.
기업은 감정 분석을 사용하여 고객이 서비스에 대한 의견을 이해할 수 있다.
이메일 필터링은 "개인", "소셜", "프로모션" "스팸"과 같은 카테고리로 이메일을 분류하는 주제 분류의 예다.

 

2. 자동 번역

텍스트를 한 언어에서 다른 언어로 자동 번역한다.
이것은 한 프로그래밍 언어에서 다른 언어로 코드를 번역하는 작업과 같이 다양한 영역을 포함할 수 있다.
예를 들어, Python에서 C++로 코드를 번역하는 것도 포함된다.

 

3. 질문 응답

주어진 텍스트를 기반으로 질문에 답한다.
예를 들어, 온라인 고객 서비스 포털은 제품에 관한 FAQ를 대답하기 위해 NLP 모델을 사용할 수 있으며, 교육용 소프트웨어는 학습 주제에 관한 학생의 질문에 답변하기 위해 NLP를 사용할 수 있다.

 

4. 텍스트 생성

주어진 입력 텍스트(프롬프트라고도 함)를 기반으로 일관되고 관련성 있는 출력 텍스트를 생성한다.

 

앞서 언급한 대로 LLMs는 텍스트 생성 작업 등 다양한 작업을 해결하려는 ML 모델이다.
LLMs
는 컴퓨터가 인간 언어를 처리, 해석 및 생성할 수 있게 하며, 보다 효과적인 인간-기계 커뮤니케이션을 가능하게 한다.
이를 위해 LLMs는 방대한 양의 텍스트 데이터를 분석하거나 학습하며 문장 내 단어 간의 패턴과 관계를 학습한다.
이러한 학습 프로세스를 수행하기 위해 다양한 데이터 원본을 사용할 수 있다.
이 데이터에는 Wikipedia, Reddit, 수천 권의 책의 아카이브 또는 인터넷 자체의 아카이브에서 가져온 텍스트가 포함될 수 있다.
주어진 입력 텍스트를 기반으로, 이러한 학습 프로세스를 통해 LLMs는 다음에 나올 단어에 대한 가장 가능성 있는 예측을 할 수 있으며 이를 통해 입력 텍스트에 의미 있는 응답을 생성할 수 있다.
최근 몇 달 동안 게시된 현대적인 언어 모델은 이제 텍스트 분류, 기계 번역, 질문 응답 및 기타 많은 NLP 작업과 같은 대부분의 NLP 작업을 직접 수행할 수 있는 크기와 학습된 텍스트 양이 매우 크다.


GPT-4
ChatGPT 모델은 텍스트 생성 작업에서 뛰어난 현대적인 LLMs이.

 

파이썬으로 OpenAI API의 'Hello World' 예제 실행

 

OpenAI GPT-4 ChatGPT를 서비스로 제공한다.
이것은 사용자가 모델의 코드에 직접 액세스하거나 자체 서버에서 모델을 실행할 수 없다는 것을 의미한다.
그러나 OpenAI는 모델의 배포 및 실행을 관리하고 사용자는 계정과 비밀 키가 있다면 이러한 모델을 호출할 수 있다.

먼저 OpenAI 웹 페이지에 로그인되어 있는지 확인하자.

 

API 키가 준비되었으면, OpenAI API를 사용한 첫 번째 "Hello World" 프로그램을 작성할 시간이다.

 

다음은 OpenAI Python 라이브러리를 사용한 첫 번째 코드 라인을 보여준다.
OpenAI
가 어떻게 서비스를 제공하는지 이해하기 위해 클래식한 "Hello World" 예제를 시작하자.

 

먼저 pip를 사용하여 Python 라이브러리를 설치한다:

!pip install openai

 

다음으로 Python에서 OpenAI API에 액세스하자:

import openai
# openai ChatCompletion 엔드포인트 호출
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "Hello World!"}],
)
# 응답 추출
print(response["choices"][0]["message"]["content"])

 

다음과 같은 출력이 표시다:

```

안녕하세요! 오늘 어떻게 도와드릴까요?

Hello there! How may I assist you today?

OpenAI Python 라이브러리를 사용하여 첫 번째 프로그램을 작성했다.

 

OpenAI API 키 설정


그럼 이 라이브러리를 사용하는 방법에 대해 조금 더 자세한 내용을 살펴보자.

 

관찰하신 대로 코드 스니펫에서 OpenAI API 키를 명시적으로 언급하지 않았다.
이것은 OpenAI 라이브러리가 자동으로 OPENAI_API_KEY라는 환경 변수를 찾도록 설계되어 있기 때문이다.
또는 다음 코드를 사용하여 API 키가 포함된 파일을 가리킬 수 있다:

# 파일에서 API 키 로드
openai.api_key_path = <경로>,

또는 다음 방법을 사용하여 코드 내에서 API 키를 수동으로 설정할 수 있다:

# API 키 로드
openai.api_key = os.getenv("OPENAI_API_KEY")

권장 사항은 환경 변수에 대한 널리 사용되는 규칙을 따르는 것이다.
, .gitignore 파일에서 소스 제어에서 제외된 .env 파일에 키를 저장하는 것이다.
그런 다음 Python에서 load_dotenv 함수를 실행하여 환경 변수를 로드하고 openai 라이브러리를 가져올 수 있다:

from dotenv import load_dotenv
load_dotenv()
import openai

중요한 점은 .env 파일을 로드한 후에 openai import 선언을 가져와야 하며, 그렇지 않으면 OpenAI 설정이 올바르게 적용되지 않을 수 있다.

 

파이썬 코딩을 통해 프롬프트에 접근해 보면, ChatGPT와의 프롬프트를 파악하는데 도움이 될 수 있다고 본다. 
하지만, 매우 빠르게 변화하고 있는 LLM모델이기 때문에, openai의 Playground에서 본인만의 AI와 만나보는 것이 더 나을 것이라 생각한다. 

다음에는 Playground를 간단히 살펴보도록 할 생각이다.

https://platform.openai.com/playground

 

OpenAI Platform

Explore developer resources, tutorials, API docs, and dynamic examples to get the most out of OpenAI's platform.

platform.openai.com

 

참고문헌) Developing Apps with GPT-4 and ChatGPT

 

Developing Apps with Gpt-4 and Chatgpt | Caelen, Olivier - 교보문고

Developing Apps with Gpt-4 and Chatgpt |

product.kyobobook.co.kr

 

반응형
반응형

요즘 LLM 인공지능으로 세상이 또 하나의 변화에 직면한 것으로 보인다. 
그 중에서 가장 앞선 곳이 OpenAI라고 할 수 있다. 

AI의 구조에 대해 좀 더 빠르게 알아보는 것이 필요한 시점이라 생각한다.

1. AI 프로젝트 시작하기

요즘 ChatGPT로 촉발된 LLM(Large Language Model)이 폭발적으로 성장하고 있다.

이로 인해 많은 사람들이 인공지능에 대해 정말 많은 관심을 갖게 되었다.

파이썬은 그 여정에 있어서 강력한 동반자가 될 것이라고 생각한다.
왜냐하면 대부분의 인공지능 라이브러리를 파이썬에서 지원하고 있고, 배우기 쉽고 사용하기 편한 파이썬 언어가 인공지능 분야에서는 대세라고 생각하기 때문이다.

 

머신 러닝 라이브러리 소개

Scikit-Learn

Scikit-Learn은 사용하기 매우 쉽지만, 많은 머신 러닝 알고리즘을 효율적으로 구현하므로 머신 러닝을 배우기에 좋은 출발점이 된다.
이것은 2007년 David Cournapeau에 의해 만들어졌으며, 현재는 프랑스 컴퓨터 과학 및 자동화 연구소(Inria)의 연구팀이 주도적으로 이끌고 있다.

TensorFlow

TensorFlow는 분산 수치 계산을 위한 좀 더 복잡한 라이브러리다.
이것은 수백 개의 멀티-GPU(그래픽 처리 장치) 서버에 걸쳐 계산을 분산시켜 매우 큰 신경망을 효율적으로 훈련하고 실행할 수 있게 만들어준다.
TensorFlow(TF)는 Google에서 만들어졌으며, 많은 대규모 머신 러닝 애플리케이션을 지원한다.
2015년 11월에 오픈 소스로 공개되었으며, 2.0 버전은 2019년 9월에 출시되었다.

Keras

Keras는 신경망을 훈련하고 실행하기 매우 간단하게 만드는 고수준의 딥러닝 API이다.
Keras는 TensorFlow와 함께 번들로 제공되며, 모든 집약적인 계산을 위해 TensorFlow에 의존한다.

 

데이터 수집 및 처리

모든 AI 프로젝트의 시작점은 데이터 수집이다.
파이썬은 데이터 수집과 처리를 위한 훌륭한 라이브러리들을 제공한다.
pandas는 데이터 분석을 위한 필수 라이브러리이며, numpy는 수치 계산을 위한 강력한 도구다.
scikit-learn은 데이터 전처리와 모델링을 위한 간편한 기능들을 제공한다.
이 라이브러리들을 사용하여 데이터를 수집하고, 정제하며, 유용한 특성을 추출하는 작업을 진행한다.

첫 번째 머신러닝 모델 구축

데이터가 준비되었다면, 간단한 머신러닝 모델을 구축할 차례다.
scikit-learn의 분류기나 회귀 모델을 사용해보자.
예를 들어, 붓꽃(Iris) 데이터 세트를 사용하여 각 붓꽃의 종류를 분류하는 모델을 만들 수 있다.
이 과정에서 모델을 훈련시키고, 검증하며, 성능을 평가하는 방법을 배울 수 있다.

 

2. 파이썬으로 복잡한 AI 문제 해결하기

딥러닝 입문

TensorFlow나 PyTorch와 같은 프레임워크를 사용하여 딥러닝 모델을 구축하는 방법을 배워보자.
이러한 프레임워크는 복잡한 신경망을 쉽게 설계하고 학습시킬 수 있게 해준다.
간단한 이미지 분류부터 시작하여 점차 복잡한 문제로 나아가자.

사례 연구

실제로 파이썬을 사용하여 해결된 복잡한 AI 문제들을 살펴보는 것도 매우 유익하다.
Google의 AlphaGo부터 자율 주행 자동차에 이르기까지, 파이썬은 다양한 혁신적인 프로젝트에 사용되었다.

3. 파이썬 AI 리소스와 커뮤니티

학습 리소스

Coursera’나 ‘edX’와 같은 온라인 학습 플랫폼에서는 파이썬과 AI 관련 강좌를 제공한다.
또한 ‘GitHub’에는 수많은 오픈소스 프로젝트가 있어 실제 코드를 살펴보고 학습할 수 있는 기회를 제공한다.

커뮤니티 참여

Stack Overflow’, ‘Reddit’, ‘Kaggle’과 같은 플랫폼에서는 전 세계의 개발자들과 지식을 공유하고 문제를 해결할 수 있다.
또한, 파이썬과 AI 관련 컨퍼런스나 워크샵에 참여하여 네트워킹을 할 수 있다.

최신 동향 유지

AI 분야는 빠르게 발전하고 있다.
arXiv’, ‘Google Scholar’ 등의 리소스를 통해 최신 연구를 접하고, ‘Medium’이나 ‘Towards Data Science’와 같은 블로그를 통해 새로운 트렌드를 확인하도록 하자.

반응형
반응형

PyPDF2 맛보기

가끔 pdf파일에서 텍스트를 추출할 일이 있다.
그때 활용할 수 있도록 Python언어로 pdf파일에서 텍스트를 읽어오는 방법에 대해 예제 코드와 함께 알아본다.

 

1. 필요한 라이브러리

PDF파일을 읽어들이기 위해 PyPDF2 라이브러리를 설치한다.

!pip install PyPDF2

2. 예시 코드

공개된 사이트에서 PDF파일을 갖고 온다. 
이번에는 국토교통부 홈에 있는 보도자료에 바로 올라온 '주택건설사업 인허가 속도 높인다'라는 제목의 파일을 읽어들일 것이다. 쉽게 설명하기 위해 주 디렉토리에 'sample.pdf'라는 파일명으로 다운받아 저장했다.

# 라이브러리를 읽어들인다.
from PyPDF2 import PdfReader

# PDF파일을 읽어서 reader라는 변수에 저장한다.
reader = PdfReader("sample.pdf")

파일을 읽어들인 후에는 전체 페이지가 몇 페이지인지 알아보고 전체 페이지에서 다음과 같이 텍스트를 추출하도록 한다.

반응형
pages = reader.pages

text = ""

for page in pages:
    sub = page.extract_text()
    text += sub
    
# 텍스트를 전부 잘 추출했는지 확인한다.    
print(text)

위 예시 파일에서 텍스트를 잘 읽어들인 것을 확인할 수 있다.

PyPDF의 좀 더 복잡한 기능은 '사용자 가이드'를 참고하면 많은 도움이 될 것이다.

 

반응형
반응형

FRED에서 제공하는 API를 통해 데이터를 받아 사용하면 FRED의 데이터 소스에 변화가 있더라도 바로 바로 대응이 가능하겠지만, 그 정도로 데이터를 보는 사람이라면 이 정보가 필요없을 것이다.

나처럼 쉽게 경기선행 지표를 확인하고자 하는 사람들이 참고했으면 좋겠다.

먼저 관련 라이브러리를 설정하고 읽어들인다.

# matplotlib 설정(그래프 그리기)
import matplotlib.pyplot as plt

plt.rcParams['axes.grid'] = True
plt.rcParams['figure.figsize'] = (12,6)
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['axes.formatter.limits'] = -10000, 10000

import FinanceDataReader as fdr

그럼, 이제부터 나스닥지수의 흐름을 보는 데 도움이 되는 대표적인 선행 지표들을 함께 살펴보도록 한다.

1. 주간 실업수당 청구건수(ICSA)

경기가 나빠지는 경우 후행지표로 동작하지만, 경기가 좋아지는 경우 선행 지표로 활용할 수 있다고 한다. 연속 실업수당 청구건수는 CCSA이다.

df = fdr.DataReader('FRED:NASDAQCOM,ICSA','2010-01-01')
ax = df.plot(secondary_y='NASDAQCOM')
ax = ax.axvspan('2019-12-01', '2023-10-25', color='gray', alpha=0.2)

팬데믹 기간에 폭발적으로 증가하다가 최근에는 과거 평균으로 돌아간 상태이다.

2. 소비자 심리지수(UMCSENT)

UMCSENT는 미시건대 소비자 심리지수 추이로 소비자 설문 결과를 수치화한 값이다. 100을 기준으로 100이상이면 긍정적이고 100이하면 부정적으로 본다.

df = fdr.DataReader('FRED:NASDAQCOM,UMCSENT','2010-01-01')
ax = df.plot(secondary_y='NASDAQCOM')
ax = ax.axvspan('2019-12-01', '2023-10-25', color='gray', alpha=0.2)

팬데믹 때 급락한 후 일시 회복하다가 재차 하락한 후 조금씩 회복하고 있다. 아직 70대 수준으로 부정적인 상태이다.

반응형

3. 주택 판매지수(HSN1F)

주택 판매지수는 주택시장 활성화 정도를 나타내는 지수이다. 주가 하락에 앞서 주택 판매지수가 선행하는 특징을 보인다.

df = fdr.DataReader('FRED:NASDAQCOM,HSN1F','2015-01-01')
ax = df.plot(secondary_y='NASDAQCOM')
ax = ax.axvspan('2019-12-01', '2023-10-25', color='gray', alpha=0.2)

2020년부터 현재까지 나스닥지수와 주택 판매지수 추이를 보면, 2020년에는 주택 판매지수가 더 높게 나오다가 2021년 주택 판매지수가 먼저 하락한 것을 볼 수 있다. 그 후 2022년부터 나스닥지수도 하락하고 있다. 

4. 실업률(UNRATE)

실업률은 불황에는 후행지표, 경기회복에는 동행지표로 동작한다고 한다.

df = fdr.DataReader('FRED:NASDAQCOM,UNRATE','2015-01-01')
ax = df.plot(secondary_y='NASDAQCOM')
ax = ax.axvspan('2019-12-01', '2023-10-25', color='gray', alpha=0.2)

실업률은 팬데믹 때 급격히 증가했다가 지속적으로 낮아져 평년 수준으로 돌아와 있는 상태이다.

5. M2 통화량(M2SL)

M2 통화량은 시중에 돈이 얼마나 많이 풀려있는지 보여주는 유동성 지표이다.

df = fdr.DataReader('FRED:NASDAQCOM,M2SL','2015-01-01')
ax = df.plot(secondary_y='NASDAQCOM')
ax = ax.axvspan('2019-12-01', '2023-10-25', color='gray', alpha=0.2)

6. 하이일드 채권 스프레드(BAMLH0A0HYM2)

하이일드 채권은 낮은 신용등급 회사에 투자하는 고위험, 고수익 채권이다. 여기서 스프레드는 국채 수익률과의 차이를 말한다. 불황일수록 하이일드 채권 스프레드는 더 커진다.

df = fdr.DataReader('FRED:NASDAQCOM,BAMLH0A0HYM2','2015-01-01')
ax = df.plot(secondary_y='NASDAQCOM')
ax = ax.axvspan('2019-12-01', '2023-10-25', color='gray', alpha=0.2)

참고 사이트)

FinanceDataReader 깃헙

 

Jupyter Notebook Viewer

선행지표란 경기가 좋아질 것인지 혹은 나빠질 것인지 앞서 반응하는 지표를 말합니다. 대표적인 선행 지표들이 무엇이 있는지 그리고, 이 선행지표들을 살펴봄으로 향후 주식 시장의 흐름을

nbviewer.org

FRED : https://fred.stlouisfed.org/

 

Federal Reserve Economic Data | FRED | St. Louis Fed

Welcome to FRED, your trusted source for economic data since 1991. Download, graph, and track 823,000 US and international time series from 114 sources. Welcome to FRED, your trusted source for economic data since 1991. Download, graph, and track 823,000 U

fred.stlouisfed.org

 

반응형
반응형

웹스크래핑은 인터넷에서 수집할 수 있는 비정형화된 데이터를 다루는 기술이라고 할 수 있다.
비정형화된 데이터는 데이터베이스에 저장될 수 있는 템플릿에 맞는 데이터 모델이 아니라, 다양항 포멧으로 된 데이터라고 보면 된다.
웹에서 얻을 수 있는 텍스트, 이미지, 오디오, 비디오 또는 다른 형태의 조합들을 모두 말한다고 할 수 있다. 
웹스크래핑은 인터넷으로부터 분석하거나 연구를 수행하기 위해  방대한 데이터들을 수집하고 추출할 수 있도록 해주는 매우 유용한 기술이다.
데이터 사이언티스트 또는 엔지니어들이 데이터를 모으거나, 효과적인 의사결정을 위해 비즈니스에 도움이 되는 정보들을 추출할 수 있도록 해준다. 

웹 스크래핑 프로세스 flow

웹 스크래핑은 언제나 다이나믹하다고 생각한다.
왜냐하면 많은 웹사이트들이 계속 업데이트되고, 새로운 기술을 도입해서 변화하고 있기 때문에, 동일한 웹 스크래핑으로 원하는 데이터를 얻지 못할 수 있기 때문이다. 
또한, 개인정보 보호 등 윤리적 이슈로 인해 웹 스크래핑을 하지 못하도록 막는 웹사이트도 늘어나고 있고, 그러한 흐름에 따라 웹 스크래핑이 어려워지고 있다고 할 수 있다.

파이썬에서 웹 스크래핑에 주로 사용하는 라이브러리로 BeautifulSoup, Requests, Urllib, Selenium과 같은 라이브러리가 있다.
좀 더 쉽게 웹 스크래핑을 할 수 있도록 도와주는 Scrapy와 같은 프레임워크도 존재한다. 

보통 자바스크립트를 사용하지 않는 일반적인 HTML사이트는 BeautifulSoup+requests 또는 Scrapy를 사용해 스크래핑을 할 수 있다.
하지만, 우리가 스크래핑하고 싶어하는 많은 사이트들은 자바스크립트를 거의 사용한다고 보면 된다. 그래서, 이런 사이트들은 selenium같은 툴이 더 유용하게 사용되고 있다.

Web Opinion Mining

Web Opinion Mining은 유저들에게 더 나은 의사결정을 할 수 있도록 의미있는 인사이트를 제공하기 위해 다양한 웹 소스들로부터 데이터를 분석해서 의견들을  전달하는 것을 말한다. 
컴퓨터 모델링 기법을 통한 인간의 감정과 그것의 분석에 대한 연구는 감정 분석 또는 Opinion Mining이라고 한다. 우리가 SNS의 글들을 통해 감정 분석을 많이 하는데, 이때 사용되는 것이 Natural Language Processing(NLP) 기술이다. 

 

반응형

'파이썬으로 할 수 있는 일 > 크롤링' 카테고리의 다른 글

Scrapy(스크래피)란?  (0) 2017.03.23
반응형

알고리즘 : 어떤 문제를 풀기 위한 절차나 방법, 구체적으로 어떤 문제가 주어진 '입력' 정보를 원하는 '출력(답)' 정보로 만드는 일련의 과정을 말함.

1부터 n까지 연속한 정수의 합을 구하는 알고리즘1
1부터 n까지 숫자를 차례로 더하는 방법을 사용함

def sum_n(n) :
    s = 0 # 합을 계산할 변수
    for i in range(1, n+1): # 1부터 n까지 반복(n+1은 제외)
        s = s + i
    return s
sum_n(10)

55

1부터 n까지 연속한 정수의 합을 구하는 알고리즘2
수학자 가우스의 계산 방법을 사용함

def sum_n(n):
    return n * (n+1)//2 # 슬래시 두개는 정수 나눗셈을 의미

알고리즘 1과 2를 비교했을 때, 숫자가 커지면 커질수록 알고리즘2가 더 효과적으로 동작한다는 것을 알 수 있다. 
동일한 문제를 해결하는 여러 알고리즘 중 어떤 알고리즘이 더 좋은지 판단하는 것을 '알고리즘 분석'이라고 한다.

1부터 N까지 연속한 정수의 곱을 구하는 알고리즘1

정수의 합을 구하는 알고리즘 1을 고쳐서 작성한다. 1부터 N까지의 곱은 팩토리얼(factorial)이라고 한다. 팩토리얼은 숫자 뒤에 느낌표를 붙여 표기하며 1부터 n까지 연속한 숫자를 차례로 곱한 값을 말한다. '계승'이라고도 한다.

def fact(n):
    f = 1 # 곱을 계산할 변수, 초기값은 1
    for i in range(1, n+1):
        f = f * i
    return f

1부터 N까지 연속한 정수의 곱을 구하는 알고리즘2

재귀 호출(recursion)은 어떤 함수 안에서 자기 자신을 부르는 것을 말한다. 팩토리얼을 재귀 호출로 표현하면, n! = n * (n-1)!로 표현할 수 있다.

def fact(n):
    if n <=1:
        return 1
    return n * fact(n-1)

재귀 호출에는 종료 조건이 꼭 필요하다. 종료 조건이 없으면 RecursionError 또는 Stack Olverflow 등의 에러가 발생할 수 있다.

두 자연수 a와 b의 최대공약수를 구하는 알고리즘1

최대공약수는 두 개 이상의 정수의 공통약수에서 가장 큰 값을 의미한다. 두 수의 약수 중에서, 공통된 것을 찾아, 그 값 중 최댓값을 찾는 것이다. 

def gcd(a, b):
    i = min(a, b) # 두 수 중에서 최솟값을 구하는 함수
    while True:
        if a % i == 0 b % i == 0:
            return i
        i = i -1 # i를 1만큼 감소시킨다

 

두 자연수 a와 b의 최대공약수를 구하는 알고리즘2

수학자 유클리드의 유클리드 알고리즘을 사용해서 문제를 풀 수 있다. 이때 사용하는 것이 재귀 호출이다. 

def gcd(a, b):
    if b == 0: # 종료 조건
        return a
    return gcd(b, a % b) #  좀 더 작은 값으로 자기자신을 호출

재귀 호출은 처음 사용할 때는 혼란스러울 수 있지만, 한번 익혀두면 여러가지 문제를 아주 단순하게 풀 수 있는 강력한 무기가 될 수 있다.

 

위에서 알아본 알고리즘들을 보면, 일련의 순서에 따라 함수를 작성하는 것보다 관련 알고리즘을 사용하는 것이 매우 간단하고 효율성을 높이는 것을 알 수 있다.

가장 핵심적인 알고리즘을 숙지하고 있는 것이 프로그램을 작성하는데 한단계 높은 방법을 제시한다는 것을 알고 있도록 하자.

<참고> 모두의 알고리즘 with  파이썬, 이승찬 저

반응형
반응형

pandas는 Series, DataFrame 두개를 중심으로 데이터를 다룬다.

그 중 DataFrame에서 주로 사용하는 명령을 먼저 간단히 정리해 본 다음, loc와 iloc를 알아볼 것이다.

먼저 라이브러리를 읽어들인다.

import pandas as pd
import numpy as np

그 다음 사용할 데이터를 DataFrame 데이터 유형으로 만든다.

dates = pd.date_range('2023-09-01', periods=6)
df = pd.DataFrame(np.random.randn(6,5), index = dates, columns=['A', 'B', 'C', 'D', 'E'])
df

head() 명령을 사용하면 기본적으로 첫 5행을 보여준다. 괄호에 숫자를 기입하면 그 숫자만큼 행을 더 볼 수 있다.

df.head()

index, columns 명령을 사용하면 DataFrame의 컬럼과 인덱스를 확인할 수 있다.

df.index

df.columns

DataFrame에 값들은 values 명령을 사용해 확인하면 된다. 

df.values

info() 명령을 사용하면 DataFrame의 개요를 알 수 있다.

df.info()

describe() 명령을 사용하면 통계적 개요를 확인할 수 있다. 

df.describe()

sort_values() 명령은 by로 지정된 컬럼을 기준으로 정렬된다. ascending 옵션을 사용하면 오름차순(=True)이나 내림차순(=False)으로 정렬할 수 있다.

df.sort_values(by='C', ascending=True)

반응형

DataFrame.loc

인덱스인 dates 변수를 사용해 특정 날짜의 데이터만 보고 싶으면 df.loc 명령을 사용하면 된다. loc는 location 옵션으로 슬라이싱할 때 loc 옵션을 이용해서 위치 값을 지정할 수 있다.

df.loc[dates[0]]

컬럼을 지정한 후 모든 행을 보고 싶다면, 다음과 같이 하면 된다.

df.loc[:, ['B', 'D']]

행과 열의 범위를 모두 지정해 볼 수도 있다.

df.loc['2023-09-03':'2023-09-05', ['B', 'D']]

 

DataFrame.iloc

loc 명령과 달리 행과 열의 번호를 이용해 데이터에 바로 접근하려고 할 때는 iloc 명령을 사용한다.
iloc를 사용하면 행이나 열의 범위를 지정하면 된다. 특히 콜론(:)을 사용하면 전체 데이터를 불러온다.

아래 명령 iloc[4]는 5번째 행의 전체 컬럼 값을 불러오게 된다. 0번부터 시작하기 때문에 5번 행을 불러오게 된다.

df.iloc[4]

다음과 같이 범위를 정해서 불러올 수도 있다. 2번째 행부터 5번째 앞, 즉 2번째~4번째 행과 0번부터 2번째 열의 데이터만 가져오게 된다.

df.iloc[2:5, 0:3]

범위가 아니라 콤마(,)로 행이나 열을 지정해 데이터를 가져올 수도 있다. 행이나 열에 대해 전체를 가져오고 싶은 곳에는 그냥 콜론(:)을 사용한다.

df.iloc[1:4, :]

DataFrame에서 특정 조건을 만족하는 데이터만 가져올 수도 있다.
다음과 같이 조건을 입력해서 사용한다.

df[df.B > 0]

 

반응형
반응형

절대 모멘텀 전략은 단일 종목에도 백테스트를 할 수 있다. 그러나 상대 모멘텀 전략은 다수 종목으로 투자 대상군을 형성해야 이용할 수 있다. 

상대 모멘텀 전략에서는 모멘텀 지수를 계산하기 위해 과거 1개월 종가의 수익률을 계산한다. 지난달 마지막 일자를 기준으로 전체 투자 대상 종목에서 상대적으로 높은 수익률을 보인 상위 종목에 매수 신호를 발생시킨다. 

먼저 사용할 라이브러리들을 읽어들인다.

import pandas as pd 
import numpy as np
import FinanceDataReader as fdr

그 다음 파이낸스데이타리더 라이브러리를 사용해 주식 데이터를 읽어들인다.

# 주식을 먼저 선정한다. 여기서는 10개의 종목을 선정한다. 
# 애플 AAPL, 아마존 AMZN, 메타 META, 월마트 WMT, 넷플릭스 NFLX, 제너럴 모터스 GM, 마이크로소프트MSFT, 테슬라 TSLA, 엔비디아 NVDA, 코카콜라 KO
# 주식 기간은 2015.1.1~2023.08.31
ticker = ['AAPL', 'AMZN', 'META', 'WMT', 'NFLX', 'GM', 'MSFT', 'TSLA', 'NVDA', 'KO']
all_df = pd.DataFrame()
for f in ticker: 
    temp = fdr.DataReader(f, '2015-01-01', '2023-08-31')
    temp['CODE'] = f
    temp.reset_index(inplace = True)
    all_df = pd.concat([all_df, temp], axis = 0, ignore_index = True) #pandas 2.0이상에서는 append 함수가 없어지고, concat함수를 사용해야 함
all_df.head()

읽어드린 주식 데이터에서 필요한 컬럼만 추출해 사용할 수 있도록 데이터를 전처리하는 함수를 아래처럼 만든다.

def data_preprocessing(sample, t_code, base_date):
    sample = sample[sample['Date'] >= base_date][['Date','CODE','Adj Close']].copy()
    sample.reset_index(inplace = True, drop = True)
    sample['STD_YM'] = sample['Date'].dt.to_period(freq='M') 
    sample['1M_RET'] = 0.0
    ym_keys = list(sample['STD_YM'].unique())
    return sample, ym_keys

data_preprocessing함수로 데이터를 전처리해서 price_df, ym_keys 변수에 저장한다. 
이때 기준 날짜를 정할 수 있다. 이번에는 2019-01-01로 기준 날짜를 정했다.

price_df, ym_keys = data_preprocessing(all_df, ticker, base_date ='2019-01-01')
price_df.head()

월별 데이터를 저장할 month_last_df라는 데이터프레임을 만들고, 각 주식별 1개월간 수익률을 계산하여 '1M_RET'이라는 컬럼에 넣도록 한다.

month_last_df = pd.DataFrame(columns = ['Date', 'CODE', '1M_RET'])

for f in ticker: 
    temp_df = price_df[price_df['CODE'] == f][['Date','CODE','STD_YM','Adj Close','1M_RET']].copy()
    for ym in ym_keys:
        m_ret = temp_df.loc[temp_df[temp_df['STD_YM'] == ym].index[-1],'Adj Close'] \
        / temp_df.loc[temp_df[temp_df['STD_YM'] == ym].index[0],'Adj Close']
        temp_df.loc[temp_df['STD_YM'] == ym, ['1M_RET']] = m_ret
        month_last_df = month_last_df._append(temp_df.loc[temp_df[temp_df['STD_YM'] == ym].index[-1], ['Date', 'CODE', '1M_RET']])

그 다음으로 종목별 종가를 저장할 stock_df라는 데이터프레임도 만들도록 한다.

stock_df = pd.DataFrame(columns = ['Date', 'CODE', 'Adj Close'])
stock_df = pd.concat([stock_df, price_df.loc[:,['Date', 'CODE', 'Adj Close']]], sort=False)
stock_df.sort_values(by = 'Date', ascending = True).head(10)

월별 수익률이 행으로 쌓여있는 데이터를 피벗해 일자별로 종목별 수익률 데이터로 만든다. 종목 코드를 컬럼으로 올리고, DataFrame의 rank()함수를 사용해 월말 수익률의 순위를 퍼센트 순위로 계산하고 상위 40% 종목만 선별한 다음 나머지 값에는 np.nan값을 채운다.

month_ret_df = month_last_df.pivot_table(index='Date', columns='CODE', values='1M_RET').copy()
month_ret_df = month_ret_df.rank(axis=1, ascending=False, method='max', pct=True)
month_ret_df = month_ret_df.where(month_ret_df < 0.4, np.nan)
month_ret_df.fillna(0, inplace=True)
month_ret_df[month_ret_df !=0] = 1
stock_codes = list(stock_df['CODE'].unique())

month_ret_df.head()

월말일자로 1로 표시된 종목코드와 0으로 표시된 종목코드를 확인할 수 있다. 다음 날짜로 넘어갈 때 0에서 1로 되면 제로 포지션에서 매수 포지션으로 변경되고 1에서 0으로 변경되면 청산한다. 1에서 1로 변함없는 종목은 매수후 보유상태를 유지한다.

반응형

다음에 진행할 순서는 월말에 거래 신호가 나타난 종목을 대상으로 포지셔닝을 처리하는 것이다.

sig_dict = dict()
# 신호가 포착된 종목 코드만 읽어오기
for date in month_ret_df.index: 
    ticker_list = list(month_ret_df.loc[date, month_ret_df.loc[date,:] >= 1.0].index)
    sig_dict[date] = ticker_list
stock_c_matrix = stock_df.pivot_table(index='Date', columns='CODE', values='Adj Close').copy()
book = create_trade_book(stock_c_matrix, list(stock_df['CODE'].unique()))

for date, values in sig_dict.items(): # 포지셔닝
    for stock in values:
        book.loc[date,'p '+ stock] = 'ready ' + stock
        
book = tradings(book, stock_codes) # 트레이딩

신호가 발생한 종목 리스트를 만들고 stock_df 변수를 피벗해 만든 stock_c_matrix 변수를 전달해 새로운 거래 장부 역할 변수를 만든다. 

거래 장부 역할 변수는 다음의 코드로 작성된 create_trade_book() 함수로 만들어진다. 

그 다음 for 문을 사용해 월초 일자별 신호가 발생한 종목에 포지션을 기록한다. 이렇게 포지셔닝을 해놓고 두번째로 만든 tradings() 함수를 통해 트레이딩을 진행하게 된다.

- create_trade_book() 함수

def create_trade_book(sample, sample_codes):
    book = pd.DataFrame()
    book = sample[sample_codes].copy()
    book['STD_YM'] = book.index.to_period(freq='M')
    
    for c in sample_codes:
        book['p '+c] = ''
        book['r '+c] = ''
    return book

- tradings() 함수

def tradings(book, s_codes):
    std_ym = ''
    buy_phase = False
    for s in s_codes:
        print(s)
        
        for i in book.index:
            if book.loc[i, 'p '+ s] == '' and book.shift(1).loc[i, 'p '+s] == 'ready ' +s:
                std_ym = book.loc[i, 'STD_YM']
                buy_phase = True
                
            if book.loc[i, 'p '+ s] == '' and book.loc[i, 'STD_YM'] == std_ym and buy_phase == True:
                book.loc[i, 'p '+ s] = 'buy ' + s
            if book.loc[i, 'p '+ s] == '':
                std_ym = None
                buy_phase = False
    return book

마지막으로 거래 장부 book에 있는 거래를 가지고 상대 모멘텀 전략의 거래 수익률을 계산할 multi_returns() 함수를 아래와 같이 만든다.

def multi_returns(book, s_codes):
    # 손익 계산
    rtn = 1.0
    buy_dict = {}
    num = len(s_codes)
    sell_dict = {}
    
    for i in book.index:
        for s in s_codes:
            if book.loc[i, 'p ' + s] == 'buy '+ s and \
            book.shift(1).loc[i, 'p '+s] == 'ready '+s and \
            book.shift(2).loc[i, 'p '+s] == '' :     # long 진입
                buy_dict[s] = book.loc[i, s]
#                 print('진입일 : ',i, '종목코드 : ',s ,' long 진입가격 : ', buy_dict[s])
            elif book.loc[i, 'p '+ s] == '' and book.shift(1).loc[i, 'p '+s] == 'buy '+ s:     # long 청산
                sell_dict[s] = book.loc[i, s]
                # 손익 계산
                rtn = (sell_dict[s] / buy_dict[s]) -1
                book.loc[i, 'r '+s] = rtn
                print('개별 청산일 : ',i,' 종목코드 : ', s , 'long 진입가격 : ', buy_dict[s], ' |  long 청산가격 : ',\
                      sell_dict[s],' | return:', round(rtn * 100, 2),'%') # 수익률 계산.
            if book.loc[i, 'p '+ s] == '':     # zero position || long 청산.
                buy_dict[s] = 0.0
                sell_dict[s] = 0.0


    acc_rtn = 1.0        
    for i in book.index:
        rtn  = 0.0
        count = 0
        for s in s_codes:
            if book.loc[i, 'p '+ s] == '' and book.shift(1).loc[i,'p '+ s] == 'buy '+ s: 
                # 청산 수익률계산.
                count += 1
                rtn += book.loc[i, 'r '+s]
        if (rtn != 0.0) & (count != 0) :
            acc_rtn *= (rtn /count )  + 1
            print('누적 청산일 : ',i,'청산 종목수 : ',count, \
                  '청산 수익률 : ',round((rtn /count),4),'누적 수익률 : ' ,round(acc_rtn, 4)) # 수익률 계산.
        book.loc[i,'acc_rtn'] = acc_rtn
    print ('누적 수익률 :', round(acc_rtn, 4))

상대 모멘텀 전략의 수익률은 다수 종목을 가지고 계산하므로 단일 종목으로 계산한 절대 모멘텀 전략의 수익률 계산과는 다른 것을 알 수 있다. 하지만, 절대 모멘텀 전략이나 상대 모멘텀 전략 모두 전에 보유하고 있던 포지션 여부를 검사한 후 그에 따라 진입과 청산, 유지를 결정하는 것이라는 기본적인 개념은 동일하다. 

마지막 수익률 계산은 다음 코드로 실행된다.

multi_returns(book, stock_codes) # 수익률 계산

 

<참고 서적> 퀀트 전략을 위한 인공지능 트레이딩

반응형

+ Recent posts