nbconvert 사용

nbconvert은 jupyter notebook 파일을 markdown 파일 혹은 html 파일로 변환해주는 프로그램입니다.

설치

nbconvert 를 설치 한다.

1
2
3
4
5
# pip을 통해 nbconvert 설치
(env)$ pip install nbconvert

# conda를 통해 nbconvert 설치
(env)$ conda install nbconvert

사용

원하는 포맷을 --to 에 지정해서 변환한다, 지원되는 포맷은 다음 같다

  • HTML, LaTeX, PDF,WebPDF, Reveal.js HTML slideshow,
  • Markdown, Ascii, reStructuredText,executable script,notebook.

다음 같이 사용한다.

1
jupyter nbconvert --to FORMAT notebook.ipynb

nbconvert 로 markdown 변환 명령은 다음의 두가지 결과물을 생성한.

  • notebook.md : markdown 파일
  • notebook_files : markdown 파일에 포함되어 있는 모든 이미지를 모아놓은 폴더
1
2
3
(env)$ jupyter nbconvert notebook.ipynb
(env)$ ls
notebook.ipynb notebook.html notebook_files/

예를 들어 My_NOTEBOOK.ipynb 라는 jupyter notebook 파일을 markdown 파일로 변환한다면

1
(env)$ jupyter nbconvert --to markdown My_NOTEBOOK.ipynb

pyenv-doctor

pyenv 에 doctor 명령이 생겼다.

  • pyenv 설치 구성을 검증한다.
  • python 버전을 빌드하기 위한 개발 도구들

doctor 명령을 사용하려면 시스템에 개발도구와 빌드도구가 설치되어야 한다.

준비

pyenv 의 시스템 빌드환경에 필요한 도구를 설치가 필요하다.

Ubuntu/Linux

1
2
3
sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl git \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

macOS

1
brew install openssl readline sqlite3 xz zlib tcl-tk@8 libb2

pyenv doctor 사용

1
2
3
4
5
$ pyenv doctor
Cloning /home/USER/.pyenv/plugins/pyenv-doctor/bin/.....
Installing python-pyenv-doctor...
Installed python-pyenv-doctor to /tmp/pyenv-doctor.20250327094025.5063/prefix
Congratulations! You are ready to build pythons!

기타

시스템에 빌드 도구가 설치되지 않으면 doctor 명령을 실행하면 다양한 에러를 낸다.

1
2
3
4
5
6
7
$ pyenv doctor
...
...
configure: error: GNU readline is not installed.
Problem(s) detected while checking system.

See https://github.com/pyenv/pyenv/wiki/Common-build-problems for known solutions.

jupyterlab - kernel 관리

Jupyter-lab 의 kernel 은 Jupyterlab 과 실행 환경과 직간접으로 연결을 해준다.

ipykernel 은 jupyter에 대해서 iPython을 제공한다.

ipython은 jupyterlab에 kernel을 통해서 python 혹은 virtualenv 의 개발환경을 제공한다.

kernel

jupyter-lab 을 실행하면 커널 launcher 화면에 kernel이 출력된다.

실행중인 커널은 사이트 바에서 확인 가능하다.

jupyter 명령으로 커널을 관리할 수 있다.

jupyter 명령

jupyter 명령에서 kernels 를 생성, 제거 관리를 할 수 있다.

현재 kernel 목록을 확인 가능하다.

1
2
$ jupyter kernelspec list
python3 /home/user/.pyenv/versions/MyEnv/share/jupyter/kernels/python3

새 kernel 생성성

가상환경 TestEnv 가 있다고 가정한다.

TestEnv 의 python 환경을 jupyterlab 에서 사용하려면

해당 가상환경을 jupyterlab 커널에서 사용하게 하려면 커널을 생성해 주어야 한다.

그러기 위해서 ipykernel 이 필요하다

1
pip install ipykernel

ipykernel 로 새 kernel 생성:

1
python -m ipykernel install --name {MACHINE_NAME} --display-name "{DISPLAY_NAME}" --user

다음 명령에서 --user을 사용하면 사용자의 ~.local/share 공간에 커널이 추가 되고 사용자의 jupyterlab 에서 모두 사용할 수 있다.

1
2
$ python -m ipykernel install --name testenv_kernel --display-name "Test Env" --user
Installed kernelspec testenv_kernel in /home/user/.local/share/jupyter/kernels/testenv_kernel

kernelspec 으로 확인 할 수 있고,

1
2
3
4
5
~$ jupyter kernelspec list
Available kernels:
python3 /home/qkboo/.pyenv/versions/3.12.8/envs/TestEnv/share/jupyter/kernels/python3
testenv_kernel /home/qkboo/.local/share/jupyter/kernels/testenv_kernel
(TestEnv) qkboo:~$

Jupyterlab 의 launcher 화면에도 새 커널을 확인할 수 있다.

kernel 제거

kernelspec uninstall 명령을 사용해서 사용자 커널을 제거할 수 있다.

1
jupyter kernelspec uninstall {KERNEL_NAME}

testenv_kernel 을 삭제해 보자

1
2
3
4
5
jupyter kernelspec uninstall testenv_kernel
Kernel specs to remove:
testenv_kernel /home/user/.local/share/jupyter/kernels/testenv_kernel
Remove 1 kernel specs [y/N]: y
Removed /home/user/.local/share/jupyter/kernels/testenv_kernel

— 참고 —

  1. https://docs.posit.co/ide/server-pro/user/jupyter-lab/guide/jupyter-kernel-management.html

zipline-reloaded 빌드환경

zipline 은 Quantopian 이 운영하던 오픈소스 백테스팅 으로 2021년경 지원이 중단된 뒤로 Machine Learning for Trading 책의 저자가 fork 한 zipline-reloaded 프로젝트로 유지되고 있다.

오픈소스 개발에 참여하기 위해서 링크의 개발환경이 갖춰져야 한다.

개발환경 구성하기

https://zipline.ml4trading.io/development-guidelines.html

  1. python 3.12
  2. venv, pyenv, conda 등 가상환경 가능.

Linux 의존성 설치

컴파일을 위해서 리눅스 패키지 의존성을 설치한다.

1
sudo apt install libatlas-base-dev gfortran pkg-config libfreetype6-dev hdf5-tools

ta-lib 의존성

zipline 에는 ta-lib 를 사용하는데 C 기반의 컴파일이 필요하다.

  • linux / macos

ta-lib C library 설치가 된후에 파이썬 모듈을 설치한다.

1
sudo apt install ta-lib

numpy, sphinx, Cython 설치

1
pip install -U numpy Cython 

필요 모듈 설치하기

setuptools/build 설치

1
pip install -U setuptools wheel twine build

빌드

1
python -m build

dist 폴더에 .wheel 결과가 생성된다. 이 whl 을 설치한다

~/zipline-reloaded$ pip install dist/zipline_reloaded-3.0.3-cp311-cp311-linux_x86_64.whl

doc 빌드

sphinx 관련

1
pip install -U sphinx m2r2 sphinx_markdown_tables

cd docs

zipline-reloaded 1 - 설치

zipline 은 Quantopian 이 운영하던 오픈소스 백테스팅 으로 2021년경 지원이 중단된 뒤로 Machine Learning for Trading 책의 저자가 fork 한 zipline-reloaded 프로젝트로 유지되고 있다.

zipline 이란

  • zipline 은 Quantopian 이 운영하던 오픈소스 백테스팅이다.
  • 2021년경 업데이트 지원이 중단된 상태이다.
  • 여기서는 fork 중 Machine Learning for Trading 책의 저자 fork이 zipline-reloaded 프로젝트를 선택한다.

zipline의 fork 버전인 zipline-reload 를 설치하고 zipline은 bundle 를 통해서 데이터를 받아서 알고리즘을 실행하는 구조로 보이다. 여기서는 기본 번들로 사용하는 quandl 설치까지만 진행한다.

zipline 설치

zipline-reload 를 설치한다.

1
2
3
4
5
6
# pip
pip install zipline-reloaded


# conda
conda install -c conda-forge zipline-reloaded

quandl 시세 데이터 설치

기본 데이터 번들 Ziplin 을 위한 데이터: https://zipline.ml4trading.io/bundles.html

zipline은 기본 번들로 quandl 의 wiki 데이터 세트를 제공한다. Quandl 데이터 번들에는 자산의 일일 가격 데이터, 분할, 현금 배당금 및 자산 메타데이터가 포함됩니다.

Quandl은 2018년 초에 이 데이터 세트를 중단했으며 더 이상 업데이트되지 않습니다. 그럼에도 불구하고 자체 데이터 세트를 설정하지 않고 Zipline을 시험해 보는 것은 유용한 시작점입니다.

현재 quandl 데이터는 NASDAQ 에서 호스팅한다. 설치시 NASDAQ 에 가입해 설치를 했어야 한다.

Get a QUANDL API Key

*Ingest Zipline Bundle 을 다운받으려면 data.nasdaq.com에 가입해서 API key 를 얻는다. account setting 에 API Key 가 있다.

https://data.nasdaq.com/account/profile

Zipline 기본 Bundle

API key 를 복사해서 quandl 데이터 번들을 다운로드 하려면 zipline 명령으로 시작한다.

다음 명령 중 하나를 사용하면 기본 quandl 번들을 홈디렉토리에 다운로드 한다.

1
2
3
4
5
$ QUANDL_API_KEY='**********'  zipline ingest -b quandl

or

$ QUANDL_API_KEY='**********' zipline ingest

다운로드 되는 번들 파일은 사용자 홈디렉토리 아래 .zipline/data 폴더에 저장된다.

Jupyter Notebook 셀에서 실행한다면

! 다음에 명령을 넣어 주면 된다.

1
$ ! QUANDL_API_KEY='**********' zipline bundles

다운로드한 번들을 확인할 수 있다.

1
2
3
4
5
6
7
$ zipline bundles

csvdir <no ingestions>
quandl 2024-02-03 12:59:38.882421
quandl 2024-02-03 12:55:18.326897
quandl 2024-02-03 12:42:14.980288
quantopian-quandl <no ingestions>

zipline 으로 알고리즘 실행

zipline 은 3가지 방법으로 알고리즘을 실행할 수 있다. run 명령 도움말을 참조할 수 있다.

1
$ zipline run --help

기본 번들에 있는 자산의 가격 데이터를 사용해서 zipline 알고리즘을 실행해 보자.

Python - 문서화 도구 Sphinx

Sphinx 는 python의 대표적인 문서화 도구로 reStructedText 또는 Markdown 문서를 HTML, pdf, man page 등의 결과물로 생성할 수 있다.

sphinx 설치

sphinx 는 python 환경에서 실행이 된다. 설치는 python 환경 혹은 OS 환경에 직접 설치하는 방법이 있다. 파이썬 가상환경을 권장한다.

https://www.sphinx-doc.org/en/master/usage/installation.html

- Python 환경에 설치

python 환경 혹은 python 가상환경 (venv, virtualenv 등)에 설치

pip

1
pip install sphinx

Anaconda

1
conda install sphinx

- 시스템에 직접 설치

각 OS 의 SW 로 설치한다면 package 관리자를 사용해 설치한다.

Debian/Ubuntu

1
apt install python3-sphinx

RHEL, CentOS

1
yum install python-sphinx

macOS / home-brew

1
brew install sphinx-doc

유니코드 이해하기

한글을 표현하는 인코딩

한글 인코딩의 이해 1편: 한글 인코딩의 역사와 유니코드

한글 인코딩의 이해 2편: 유니코드와 Java를 이용한 한글 처리

한글과 유니코드

The Absolute Minimum Every Software Developer Must Know About Unicode in 2023

Jupyterlab 4 업그레이드 주의 사항.

Jupyter 3.x 를 사용중에 Jupyter 4.0 출시를 했다고 해서 가상환경을 만들고 jupyterlab 4.0 을 설치했었다. 조금 더 UI 가 명확해 보이고 괜잖았는데 한글 입력시 글가가 깨져서 입력되거나 혹은 현재 편집중인 Cell 의 위치가 달라져 보이는 이상한 증상이 있어서 4.0 업그레이드 버전 사용을 안했는데 이유는 Node.js 버전 문제로 보인다.

Node.js 버전

기존에 jupyterlab 3.6 에서 Node.js 14 버전을 사용하고 있었다. Jupyterlab 4.x 버전의 주피터 확장 모듈 빌드도 문제가 없었는데 위에 언급한 이상한 현상이 발생해서 Jupyterlab 4.x 가상환경에서 Node.Js 버전을 18버전으로 업그레이후 후에는 문제없이 사용중이다.

Jupyter 기반 환경에서 Multiprocess 실행시 print 출력 차이.

jupyter notebook에서 실행하면 차일드 프로세스로 실행한 print() 로 출력하는 결과를 확인할 수 업다. print 는 std out 에 출력하도록 되어 있다. 자식 프로세스에서 print 를 호출하면 spawn 을 사용해서 호출되어서 출력되지 않는다.

차일드 프로세스 print 문제

아래 코드는 아주 간단하게 메인 프로세스에서 새 프로세스를 생성하고 실행한다.

1
2
3
4
5
6
7
8
9
from multiprocessing import Process

def func(msg):
print(msg)

if __name__ == "__main__":
proc = Process(target=func, args=('Hello multiproess',))
proc.start()
proc.join()

이 코드는 소스로 쉘에서 실행하거나 Web 기반의 jupyterlab 에서 실행하면 아무 문제이 print 문이 잘 작동하고 출력 결과가 나온다.

1
2
>>> ! python mutiprocess1.py
Hello multiproess

print 의 Multiprocessing 에서 문제는 링크 참고1 을 읽어보기를 권한다. 이 글에서는 테스트한 내용을 정리만 했다.

원인

아래 링크 참고1 기사에서 설명을 자세히 하고 있다. 보통 파이썬에서 차일드 프로세스를 시작할 때는 'fork', 'spawn', 'forkserver' 방법이 있다고 한다. 그런데 spawn 으로 차일드 프로세스를 실행하면 std io 출력 버퍼가 자동으로 비워지지 않는다(print는 기본으로 flush가 되지 않는다). 그러다 보니 차일드 프로세스가 종료 하면서 자동으로 gabage collection에 의해 버퍼에 남아 있는 메시지가 사라지는 것이다.

해결 방법

  1. 메시지 버퍼가 사라지기 전에 flush 를 한다.
  2. fork 기반의 프로세스를 생성한다.

1. flush 사용

  1. 메시지 버퍼가 사라지기 전에 flush 를 한다.

이를 해결하기 위해 모든 print 의 출력은 즉시 flush 되도록 flush=True 옵션을 사용할 수 있다고 한다.

1
2
def func(msg):
print(msg, flush=Yes)

이 방법은 VS code 현재 jupyter 확장에서는 효과가 없다.

flush 란?

std io 의 버퍼 처리 흐름은 글 파일 I/O 버퍼링 을 살펴보고,

python에서 print 같은 표준 출력의 flush에 대해서 이글 의 그림을 참고한다.

2. fork 기반의 프로세스를 생성한다.

지원되는 프로세스 시작 방법은 아래 같이 확인이 가능하다.

1
2
3
4
import multiprocessing as mp

mp.get_start_method() # 현재 start 메서드
mp.get_all_start_methods() # 모든 start 메서드

아래 같이 start method 를 fork 로 강제 사용할 수 있다.

1
2
3
import multiprocessing as mp

mp.set_start_method('fork') # 현재 start 메서드

브라우저 기반의 jupyter 실행환경은 'fork', 'spawn', 'forkserver' 를 모두 가능하다. 하지만 현재 VS code 의 jupyter 확장은 에서는 spawn 만 지원하고 있다.

fork, spawn

링크 침고2 에 있는 글에서 Fork, Spawn 에 대한 설명을 읽어보자.

Forking

  • 포크한 부모 프로세스의 이미지를 그래도 사용한다.

Spwaning

  • 포크한 부모 프로세스와 다르게 새 이미지로 갱신한다.

sleep 으로 지연하면?

VS code 환경에서 아래 같이 sleep 으로 지연을 주어 봤지만 해결이 안된다.

1
2
3
4
5
6
7
8
def func(msg):
print(msg, flush=True)
time.sleep(1)

if __name__ == "__main__":
proc = mp.Process(target=func, args=('Hello multiproess',))
proc.start()
proc.join()

아래 같이 join 전에 sleep 으로 지연

1
2
3
4
5
6
7
8
9
def func(msg):
print(msg, flush=True)
time.sleep(1)

if __name__ == "__main__":
proc = mp.Process(target=func, args=('Hello multiproess',))
proc.start()
time.sleep(1)
proc.join()

결론

현재 테스트한 VS Code 의 jupyter 확장 버전은 아래 같다.

  • Windows VS code, Jupyter Extension
    • v2023.6.1101941928
    • v2023.7.1001901100

만약 VS code 에서 Multiprocess 디버깅시 다른 logger 라이브러리 등을 이용해야 할 것 같다.


참고

참고1 : How to print() from a Child Process in Python

참고2 : fork, vfork 그리고 posix_spawn 이야기

참고3 : foring, spawning 이미지

Windows Terminal에서 miniconda/ananconda Profile 사용

Anaconda / Miniconda 를 설치하고 윈도우즈에서 실행시 바로가기로 사용하는 방법을 정리했다. 모든 Commandline, Powershell 에서 conda 명령을 사용하려면 환경변수 PATH 에 지정을 해야 한다. 이 글에서는 바로가기를 사용하면 PATH 환경변수를 활용하지 않고도 쉽게 사용할 수 있다.

Anaconda/Miniconda 설치 프로그램으로 설치를 하면 바로가기를 만들어 준다. 여기서 힌트를 얻으면 된다.

바로가기 속성을 사용해 파워쉘로 conda 환경을 초기화 하기 위해서는 conda-hook.ps1 실행이 필요하다. 설치한 Anaconda 시작프로그램의 속성을 통해 알 수 있다. 보통 설치된 아래 위치에 있다.

  • C:\Users\USERID\miniconda3\shell\condabin\conda-hook.ps1

PowerShell

윈도우 기본 파워쉘과 Powershell 7 으로 바로가기 설정을 보면, conda-hook.ps1 을 포함해 바로가기 아이콘 속성에 파워쉘을 통해 실행하도록 설정하면 된다.

PowerShell 7

powershell 7 으로 Miniconda3 의 base 가상환경 기반 쉘을 실행한다.

1
"C:\Program Files\PowerShell\7\pwsh.exe" -ExecutionPolicy ByPass -NoExit -Command "& 'C:\Users\USERID\miniconda3\shell\condabin\conda-hook.ps1' ; conda activate 'C:\Users\USERID\miniconda3' "

기본 PowerShell 버전

1
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoExit -Command "& 'C:\Users\USERID\miniconda3\shell\condabin\conda-hook.ps1' ; conda activate 'C:\Users\USERID\miniconda3' "

Command Line

윈도우 Command 로 anaconda / miniconda 를 실행하려면 아래 같이 activate.bat 배치를 실행하면 된다.

1
%windir%\System32\cmd.exe "/K" C:\Users\daddy\miniconda3\Scripts\activate.bat C:\Users\daddy\miniconda3

Windows Terminal 프로파일 설정

윈도우 터미널에 새 프로파일 추가시 랜덤한 GUID 값이 필요하다. 터미널에서 New-Guid 명령으로 발행해 사용한다.

1
2
3
4
5
PS> New-Guid

Guid
----
9f2a1a27-fe9b-4421-ba19-6cea57188b17

PowerShell 7 버전

guid 는 New-Guid 로 발행해서 등록하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
{
"commandline": "C:\\Program Files\\PowerShell\\7\\pwsh.exe -ExecutionPolicy ByPass -NoExit -Command \"& 'C:\\Users\\USERID\\miniconda3\\shell\\condabin\\conda-hook.ps1' ; conda activate 'C:\\Users\\daddy\\miniconda3' \"",
"guid": "{fe2a1a27-9efb-4421-ba19-6cea57188b17}",
"name": "Miniconda3 64bit(ps7)",
"startingDirectory": "%USERPROFILE%"
},
{
"commandline": "C:\\Program Files\\PowerShell\\7\\pwsh.exe -ExecutionPolicy ByPass -NoExit -Command \"& 'C:\\Users\\USERID\\anaconda3\\shell\\condabin\\conda-hook.ps1' ; conda activate 'C:\\Users\\daddy\\anaconda3' \"",
"guid": "{3f2k7199-d35c-44e5-b82d-7cd5442175fc}",
"name": "Anaconda 64bit(ps7)",
"startingDirectory": "%USERPROFILE%"
},

윈도우 기본 PowerShell 버전

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"commandline": "%windir%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -ExecutionPolicy ByPass -NoExit -Command \"& 'C:\\Users\\USERID\\miniconda3\\shell\\condabin\\conda-hook.ps1' ; conda activate 'C:\\Users\\daddy\\miniconda3' \"",
"guid": "{573e44d9-1ff5-4f3f-b083-1b2fd9a6a575}",
"name": "Miniconda3 64bit",
"startingDirectory": "%USERPROFILE%"
},
{
"commandline": "%windir%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -ExecutionPolicy ByPass -NoExit -Command \"& 'C:\\Users\\USERID\\anaconda3\\shell\\condabin\\conda-hook.ps1' ; conda activate 'C:\\Users\\daddy\\anaconda3' \"",
"guid": "{f441f482-8cf6-47ed-9a9c-fc40df46c9ac}",
"name": "Anaconda 64bit",
"startingDirectory": "%USERPROFILE%"
},