[팩트폭력]엑셀은 인터넷보다 오래되었다 EXCEL/VBA

엑셀이 인터넷보다 먼저 나온 것이 맞는 데, '아 그렇치~맞네 맞어' 하며 얼마 전 주변에 제가 말한 게 생각난다. '데스크탑 애플리케이션에서 살아 남는 것은 MS Office밖에 없을 것 같다. 나중엔 모든 개발이 웹 애플리케이션이 될 것이다' 이미 미래시제가 아닌 현재진행형으로 일어나고 있는 현상일지도 모른다. 사실 개발자 구인소식만 봐도 데스크탑 개발자를 찾는 사례는 그리 많지 않다.

Felix Zumstein의 글(Fetching market data into Excel using Python)을 빌려 엑셀에 대한 흉을 보자면:
However, to get data from these providers into Excel, there is an issue: Excel has been around long before the Internet became widespread and VBA has not been updated for years. For example, VBA does not offer an easy way to deal with the JSON format, the de facto standard to exchange data over the Internet nowadays.
To gather data in Excel, we usually have to use a separate add-in for each data provider. Moreover, these generally do not support a BDH-style formula.
엑셀도 문제이긴 하지만, 가장 열 받는 점은 MS넘들이 VBA 개발에 너무 소홀한 점이다. 베이직언어만 사용할 거면 비주얼베이직닷넷 수준으로 하던 가, 아니면 파이썬이나 c언어를 엑셀에 네이티브하게 붙도록 하던가.... VSTO같은 편법은 이제 그만 했으면 한다.

어제도 파이썬으로 quandl 데이터를 가져와서 R로 만든 전략3개를 옮기느라 Felix Zumstein의 포스팅이 눈에 더 잘 들어온다. 테스트하는 과정에서 자주 quandl 데이터를 가져오다 짤릴 수 있으니 다운받은 데이터는 피클로 절임하고 , 또 불러오는 경우 다운받은 걸 읽어 오도록 하였다.
import quandl
import pandas as pd
import numpy as np

date0 = '2007-01-03'
date1 = '2017-03-31'

try:
vix = pd.read_pickle("df_vix(" + date0 + date1 + ")")
spx = pd.read_pickle("df_spx(" + date0 + date1 + ")")
skw = pd.read_pickle("df_skw(" + date0 + date1 + ")")

except Exception as e:
vix = quandl.get("YAHOO/INDEX_VIX", start_date=date0, end_date=date1)
vix.to_pickle("df_vix(" + date0 + date1 + ")")
spx = quandl.get("YAHOO/INDEX_GSPC", start_date=date0, end_date=date1)
spx.to_pickle("df_spx(" + date0 + date1 + ")")
skw = quandl.get("CBOE/SKEW", start_date=date0, end_date=date1)
skw.to_pickle("df_skw(" + date0 + date1 + ")")

spx['vix'] = vix['Close']
spx['close.ratio'] = (spx['High'] - spx['Close']) / (spx['High'] - spx['Low'])
spx['exposure'] = 10 * (spx['close.ratio'] - 0.5) / 3
spx['exposure'][((spx['vix'] > 20) & (spx['close.ratio'] > 0.8))] = 1
spx['exposure'][((spx['vix'] > 20) & (spx['close.ratio'] <= 0.2))] = -1
spx['exposure'][(spx['vix'] <= 20)] = 0

vix['sma'] = vix['Close'].rolling(22).mean()
skw['sma'] = skw['SKEW'].rolling(22).mean()
vix_rank = vix['sma'][-499:]
skw_rank = skw['sma'][-499:]

vix_rank = vix_rank.rank(ascending=True)[-1]/500
skw_rank = skw_rank.rank(ascending=True)[-1]/500
....

파이썬에서 한글 PYTHON

솔직히 나는 한글문제에는 둔감한 편이다. 프로그래밍에서 문자보다는 숫자를 다루는 일도 많고 한글처리에 신경를 쓸 바엔 아예 영어로 처리하는 게 편리해서이다. 그러나 내가 아닌 타인의 편의를 위해서는 한글을 다뤄야 한다. 그런데 matplotlib을 이용하여 한글이 포함된 그림을 그리는 경우 다음과 같은 깍두기 문자가 나온다.

이것은 한글처리의 문제라기보다 한글이 없는 영문 font가 기본으로 적용되기 때문이다. 다음은 해결방법중 하나이다.
1. 명령 프롬프트를 연다
2. RC 파일 위치를 찾는다

Python 3.6.0 |Anaconda 4.3.0 (32-bit)| (default, Dec 23 2016, 12:06:52) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
'C:\\Users\\Administrator\\Anaconda3\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc'
>>> quit()

3. 이 파일을 메모장으로 연다.

C:\> notepad C:\Users\Administrator\Anaconda3\Lib\site-packages\matplotlib\mpl-data\matplotlibrc

4. font.family 부분을 '맑은 고딕(영문으로 Malgun Gothic)'으로 설정한다.

#font.family : sans-serif
font.family : Malgun Gothic
#font.style : normal
또는 RC파일을 수정하지 않고 소스코드차원에서 다음과 같이 할 수도 있다.
from matplotlib import font_manager, rc
...
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)

주피터 노트북 에러#1 PYTHON

남이 만든 주피터 노트북을 돌리려고 하니 다음과 같은 에러가 떡 하니 보인다. 걍 잘 돌아가겠지 생각했는 데 첫 번째 셀부터 이런 에러가 나와 기를 죽인다. 본인의 개발환경은 윈도10, 아나콘다3 32비트를 사용중인데, 검색해보니 64비트에서도 같은 에러가 나는 경우가 있다. 아나콘다를 설치하는 과정에 문제는 없었다.

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Administrator\\.matplotlib\\fontList.py3k.cache'

개발자의 구글인 스택오버플로를 보니 이건 matplotlib의 문제가 아니라 파이썬의 문제이다. font_manager.py에서 코드를 다음과 같이 수정해본다.

key, direc, any = winreg.EnumValue( local, j)
if not is_string_like(direc):
continue
if not os.path.dirname(direc):
direc = os.path.join(directory, direc)
direc = direc.split('\0', 1)[0] # 새로 추가한 코드
direc = os.path.abspath(direc).lower()

휴 이렇게 한 고개를 넘어간다.

[URL]Error on import matplotlib.pyplot (on Anaconda3 for Windows 10 Home 64-bit PC)

파이썬의 filter()함수 PYTHON

VBA의 Filter()함수를 쓰다 보니 파이썬의 filter()함수를 말하지 않을 수가 없다. 파이썬의 filter()함수는 map(), reduce()처럼 매개변수로서 함수를 받아서 처리하는 함수이다. filter()함수는 이름에서 알 수 있듯이 연산의 결과에서 몇몇 요소들을 걸러내는 함수이다. 즉 함수와 리스트를 받아서 리스트의 원소를 매개변수로 전달한 함수(이를 필터라고 하는데, 연산의 결과를 True 또는 False값으로 돌려주는 함수이다)에 넣어 결과가 참인 리스트를 돌려주는 함수이다.

filter( function, iterable_object )

다음은 짝수인지 아닌지 판별하는 함수(filterEven)와 1~15까지의 리스트를 filter()함수에 전달하고 결과를 출력하는 예이다.
>>> myNum = range(1,16)
>>> myNum
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

# A very simple filter
>>> def filterEven(num):
... if num % 2 == 0:
... return True
... else:
... return False
...

# Output
>>> print filter(filterEven, myNum)
[2, 4, 6, 8, 10, 12, 14]



그동안 무시했던 매크로 보안수준 EXCEL/VBA

업무에서 VBA를 활용하지 않고 그냥저냥 사용하는 사용자들에게 VBA로 짠 프로그램을 배포하거나 VBA를 가르쳐주려면 가장 먼저 하는 작업이 매크로 보안수준을 낮추는 것이다. 기본값은 '모든 매크로 제외(알림표시)'이다.

보통 귀찮아서 '모든 매크로 포함' 옵션을 선택하는데,사실 FM대로 하자면 그러는 거 아니다. 잠깐 시간을 내어 매크로 보안옵션을 설명하자면
  1. 모든 매크로 제외(알림 표시 없음) : 신뢰할 수 있는 위치에 있는 파일을 제외하고 모든 매크로를 실행할 수 없음
  2. 모든 매크로 제외(알림 표시) : 매크로가 포함된 파일을 열면 '보안 경고'메시지가 나타나고 '콘텐츠 사용'버튼을 클릭해야 파일에 포함된 매크로를 사용할 수 있다.
  3. 디지털 서명된 매크로만 포함 : '모든 매크로 제외(알림 표시)' 설정과 동일하지만 디지털 서명된 매크로만 실행가능하다.
  4. 모든 매크로 포함 : '보안 경고' 메시지도 표시하지 않고 모든 매크로를 사용할 수 있다.
근데 여기서 신뢰할 수 있는 문서란 '보안 경고'없이 사용할 수 있는 문서를 의미하는데, [보안 센터]의 옵션중 '신뢰할 수 있는 게시자', '신뢰할 수 있는 위치', '신뢰할수 있는 문서' 옵션에 해당하는 것들이다.

1 2 3 4 5 6 7 8 9 10 다음