<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>choi-jiwoo.log</title>
        <link>https://velog.io/</link>
        <description>A coffee lover ☕️</description>
        <lastBuildDate>Sun, 19 Feb 2023 16:06:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>choi-jiwoo.log</title>
            <url>https://velog.velcdn.com/images/choi-jiwoo/profile/db565e73-a5cc-44bd-a3b6-539d13068d56/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. choi-jiwoo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/choi-jiwoo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[VS Code pylint unable to import 문제 해결]]></title>
            <link>https://velog.io/@choi-jiwoo/VS-Code-pylint-unable-to-import-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@choi-jiwoo/VS-Code-pylint-unable-to-import-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Sun, 19 Feb 2023 16:06:22 GMT</pubDate>
            <description><![CDATA[<h2 id="문제의-시작">문제의 시작...</h2>
<p>VS Code에서 python에 사용할 linter로 pylint를 설정 해주었는데 아래 사진과 같은 import error 가 발생했다. </p>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/53801d00-e50e-4400-a874-ab55f21960ff/image.png" alt="1"></p>
<p>구글링을 해보니 pylint에 path와 관련된 문제였다. pylint를 가상환경에서 설치하였기 때문에 pylint가 다른 디렉터리에 있는 모듈을 인식할 수 없는것이었다.</p>
<p>그럼 문제를 알았으니 해결해보자.</p>
<h2 id="lets-do-it">Let&#39;s Do It</h2>
<p>pylint에 <code>init-hook</code>을 설정해주면 되는데 이게 뭘까 찾아보았다. 구글링을 해보는데 Import error에 대한 해결 방법으로 <code>init-hook</code>을 설정해주면 된다라는 내용은 많이 있었는데 구체적인 내용은 찾기가 힘들었다. </p>
<p>계속 구글링을 해보다 보니 <code>init-hook</code>은 initialization hooks를 의미하고 pylint가 초기실행(initialize)될 때 파이썬 코드를 실행시켜주는 옵션이다. 주로 <code>sys.path</code>를 설정하는데 사용된다. 이번 문제도 path와 관련된 문제로 pylint에게 모듈이 있는 path를 알려주면 pylint가 모듈을 찾을 수 있게 되고 <code>import</code>를 정상적으로 할 수 있게 되는 것이다.</p>
<p><code>init-hook</code> 설정은 .vscode 폴더 안에 settings.json 에 다음과 같은 설정을 추가해 주면 된다.</p>
<pre><code class="language-{JSON}">&quot;python.linting.pylintArgs&quot;: [
    &quot;--init-hook&quot;,
    &quot;import sys; sys.path.append(&#39;path to folder your module is in&#39;)&quot;
]</code></pre>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/cbbe994a-874e-4ce1-9e8b-38b78dcff4ca/image.png" alt="2"></p>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/82a517a7-6c72-43b6-9a16-236b9edb2b59/image.png" alt="3"></p>
<p><code>append()</code> 안에 자신의 모듈이 있는 디렉터리를 적어주면 끝!</p>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/4eca2a23-78d7-4267-8fe2-541e1ca2efd9/image.png" alt="4"></p>
<p>이제 import error가 보이지 않는다!</p>
<h2 id="one-more-thing">One More Thing...</h2>
<p>PEP 328에 따르면 모듈은 절대경로를 사용하여 import를 해야 한다고 명시하고 있다. 그 이유로 파이썬의 라이브러리가 확장되고 여러 패키지들이 소개되면서 같은 이름의 모듈이 생겨나게 되었고 그냥 <code>import foo</code>를 하게 되면 이게 어떤 foo를 말하는 것인지 알기 어려워지는 상황이 되었기 때문이다. </p>
<blockquote>
<p>As Python&#39;s library expands, more and more existing package internal modules suddenly shadow standard library modules by accident. It&#39;s a particularly difficult problem inside packages because there&#39;s no way to specify which module is meant.</p>
</blockquote>
<p>구글에서도 오픈소스 프로젝트를 위한 코드 스타일 가이드를 제시하고 있는데 Python Style Guide 에서도 마찬가지로 절대경로를 사용하여 <code>import</code>하라고 명시하고 있다.</p>
<blockquote>
<p>Do not use relative names in imports. Even if the module is in the same package, use the full package name. This helps prevent unintentionally importing a package twice.</p>
</blockquote>
<p>이러한 사실들을 적용하면 pylint에 import error를 다른 방법으로도 해결할 수 있다.</p>
<p>바로 import 하려는 모듈들을 절대경로를 사용하여 import 하면 pylint 에서도 다른 설정 없이 모듈을 읽을 수 있게 된다. </p>
<pre><code class="language-python">from 패키지 import 모듈</code></pre>
<p>하지만 이렇게 하면 <code>python 패키지/모듈.py</code> 방식으로 파이썬을 실행하면 <code>ModuleNotFoundError: No module named &#39;모듈&#39;</code> 이라는 에러 메세지를 받게 될것이다. python 실행시 패키지 디렉터리를 sys.path 제일 첫번째에 (<code>sys.path[0]</code>) 지정하게 되기 때문에 이미 그 패키지 디렉터리 안에 들어와 있는 상황이니 해당 패키지를 찾을 수 없는 것이다. 따라서 파이썬 실행을 <code>python -m 패키지.모듈</code> 방식으로 해주어야 한다.</p>
<h2 id="reference">Reference</h2>
<ul>
<li><p><a href="https://www.python.org/dev/peps/pep-0328/">PEP 328 – Imports: Multi-Line and Absolute/Relative</a></p>
</li>
<li><p><a href="https://google.github.io/styleguide/pyguide.html#s2.2-imports">Google Python Style Guide</a></p>
</li>
<li><p><a href="https://stackoverflow.com/questions/45448182/absolute-imports-in-python-not-working-relative-imports-work">Absolute imports in python not working, relative imports work</a></p>
</li>
<li><p><a href="https://stackoverflow.com/questions/51095449/pylint-false-positive-e0401-import-errors-in-vscode-while-using-venv">pylint false positive E0401 import errors in vscode while using venv</a></p>
</li>
<li><p><a href="https://www.getcodeflow.com/pylint-configuration.html">Pylint configuration</a></p>
</li>
<li><p><a href="https://sam.hooke.me/note/2019/01/call-python-script-from-pylint-init-hook/">Call Python script from pylint init-hook</a></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA['python' 응용프로그램이 들어오는 네트워크 연결을 허락하도록 하겠습니까?]]></title>
            <link>https://velog.io/@choi-jiwoo/python-%EC%9D%91%EC%9A%A9%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%B4-%EB%93%A4%EC%96%B4%EC%98%A4%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%97%B0%EA%B2%B0%EC%9D%84-%ED%97%88%EB%9D%BD%ED%95%98%EB%8F%84%EB%A1%9D-%ED%95%98%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C</link>
            <guid>https://velog.io/@choi-jiwoo/python-%EC%9D%91%EC%9A%A9%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%B4-%EB%93%A4%EC%96%B4%EC%98%A4%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%97%B0%EA%B2%B0%EC%9D%84-%ED%97%88%EB%9D%BD%ED%95%98%EB%8F%84%EB%A1%9D-%ED%95%98%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C</guid>
            <pubDate>Sun, 19 Feb 2023 16:05:27 GMT</pubDate>
            <description><![CDATA[<img width="261" alt="1" src="https://velog.velcdn.com/images/choi-jiwoo/post/02b5c595-06ff-4216-8ebe-f44c9300e9f2/image.png">

<h2 id="문제의-시작">문제의 시작...</h2>
<p>맥에서 <a href="https://streamlit.io/">Streamlit</a>을 사용하여 웹앱을 만들고있는데 <code>streamlit run app.py</code> 명령어를 칠 때마다 위 사진과 같은 경고창이 뜬다.</p>
<p>매번 &#39;허용&#39; 눌러주기가 귀찮아서 해결방법을 인터넷에 찾아보았다.</p>
<p>그러다 이 <a href="https://web.archive.org/web/20140228153242/http://silvanolte.com/blog/2011/01/18/do-you-want-the-application-to-accept-incoming-network-connections">블로그</a> 글을 발견하고 문제를 해결할 수 있었다.</p>
<p>Streamlit을 사용할 때 해결법은 아니지만 파이썬도 하나의 프로그램이니까 접근방식은 똑같았다.</p>
<h2 id="lets-do-it">Let&#39;s Do It</h2>
<p>우선 왜 이런 경고창이 계속 뜨는지 알아보자.</p>
<p>맥에서 잘모르는 앱에 대해서 네트워크 접근을 막으려는 보안정책 때문에 streamlit 앱을 실행시킬때 마다 방화벽에 걸려 경고창을 날리는것 같다.</p>
<p>그래서 위에 블로그에서 나온 해결방법이 해당 응용프로그램에 <a href="https://developer.apple.com/kr/support/code-signing/">코드서명</a>을 추가하여 맥이 해당 앱을 안전하다고 판단하게 만다는것이다.</p>
<h3 id="인증서-생성">인증서 생성</h3>
<h4 id="키체인-접근--인증서-지원--인증서-생성">&#39;키체인 접근&#39; &gt; 인증서 지원 &gt; 인증서 생성</h4>
<img width="617" alt="2" src="https://velog.velcdn.com/images/choi-jiwoo/post/2a4367b9-5123-47bd-9b72-5e6d1ddb2f35/image.png">


<img width="617" alt="3" src="https://velog.velcdn.com/images/choi-jiwoo/post/a98216e8-a686-4798-a24a-ca894a33cf14/image.png">


<h4 id="인증서-생성-정보">인증서 생성 정보</h4>
<img width="617" alt="4" src="https://velog.velcdn.com/images/choi-jiwoo/post/c132dd63-cdd3-46c3-b8de-588181e040b6/image.png">

<p>이름은 아무거나 원하는걸로 설정해주자.</p>
<img width="617" alt="5" src="https://velog.velcdn.com/images/choi-jiwoo/post/0f8314b1-e2cc-4f9b-896c-4e282be7b930/image.png">

<p>계속</p>
<img width="617" alt="6" src="https://velog.velcdn.com/images/choi-jiwoo/post/2efde509-1b14-4a6f-b3bc-c014d8795c7a/image.png">

<p>일련번호도 원하는걸로 설정.</p>
<img width="617" alt="7" src="https://velog.velcdn.com/images/choi-jiwoo/post/89313fa3-bbeb-48f4-9b68-feeafe68f251/image.png">

<p>원하는 정보를 입력하고 이후부턴 모두 &#39;계속&#39;으로 진행하면 된다.</p>
<img width="617" alt="8" src="https://velog.velcdn.com/images/choi-jiwoo/post/ef4535f2-2858-4c8b-b57b-cb5aa1200099/image.png">

<p>인증서 생성 완료!</p>
<p>인증서를 생성하였으니 인증서를 적용할 응용프로그램이 있는 위치를 알아보자.</p>
<h3 id="파이썬-경로-확인">파이썬 경로 확인</h3>
<p>각자 파이썬이 설치되어있는 경로를 찾으면 된다. 근데 맥은 기본적으로 파이썬이 내장되어있기도 하고 Homebrew나 pyenv로 설치하기도 하고 참 여러 경로를 통해 설치될 때가 있다... 그리고 파이썬 설치 경로를 찾는 법도 여러 방법이 있을것이다. 나는 방화벽 문제니깐 방화벽 설정에 들어가봤을 때 아래 사진처럼 python3.10이 딱 등록되어있길래 우클릭해서 &#39;Finder에서 보기&#39;로 찾았다.</p>
<img width="617" alt="10" src="https://velog.velcdn.com/images/choi-jiwoo/post/9d5b6424-ef55-4b75-b73c-eb9a1df861c3/image.png">

<img width="617" alt="11" src="https://velog.velcdn.com/images/choi-jiwoo/post/9ee739c0-629c-4359-a8ea-ca6085154f2d/image.png">

<h3 id="코드-서명">코드 서명</h3>
<p>생성한 인증서와 파이썬 경로를 집어 넣어 코드 서명을 해준다.</p>
<h4 id="코드-서명-sign">코드 서명 (sign)</h4>
<p><code>$ codesign -s &quot;인증서이름&quot; -f /코드서명할프로그램경로</code></p>
<h4 id="인증-verify">인증 (verify)</h4>
<p><code>$ codesign -vvv /코드서명할프로그램경로</code></p>
<img width="617" alt="13" src="https://velog.velcdn.com/images/choi-jiwoo/post/91a88323-5c2c-46b3-a317-4e5d3acce6ba/image.png">

<h2 id="result">Result</h2>
<p>이제 streamlit 앱을 실행시키면 마지막으로 한번 경고창이 뜨고 그 이후에는 다시 뜨지 않는다!</p>
<h2 id="closing-words">Closing Words</h2>
<p>아직 배우는 입장에서 개발의 세계는 참 넓다..</p>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://web.archive.org/web/20140228153242/http://silvanolte.com/blog/2011/01/18/do-you-want-the-application-to-accept-incoming-network-connections">Do you want the application to accept incoming network connections?</a></li>
<li><a href="https://apple.stackexchange.com/questions/393715/do-you-want-the-application-main-to-accept-incoming-network-connections-pop">&#39;Do you want the application &quot;main&quot; to accept incoming network connections?&#39; pop up while running Go applications</a></li>
<li><a href="https://developer.apple.com/kr/support/code-signing/">코드 서명</a></li>
<li><a href="http://cwyang.github.io/2020/12/09/osx-codesign-notarization.html">맥OS 앱 코드사인 및 공증하기</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 가상환경 설정 with venv]]></title>
            <link>https://velog.io/@choi-jiwoo/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-with-venv</link>
            <guid>https://velog.io/@choi-jiwoo/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-with-venv</guid>
            <pubDate>Sun, 19 Feb 2023 16:02:25 GMT</pubDate>
            <description><![CDATA[<h2 id="문제의-시작">문제의 시작...</h2>
<p>처음 파이썬으로 프로그래밍을 시작했을 때 여러 디렉터리에서 작업을 했고 그때 그때 필요한 패키지들을 막 설치하곤 했는데 그러다 보니 프로젝트별 패키지 관리가 엉망 이었다. 특히 특정 프로젝트에 필요한 패키지들을 나열하기 위해  <code>requirements.txt</code>를 생성하고 Github에 push 하려는데 참 난감했다. 프로젝트 마다 패키지들을 관리할 수 있는 어떤 좋은 방법이 없을까?</p>
<p><strong>정답은 &#39;가상환경&#39;!</strong></p>
<p><strong>가상환경</strong>을 사용하면 프로젝트마다 별도의 환경에서 작업을 할 수 있게 된다. 파이썬 버전도 따로 설정할 수 있고 패키지도 필요한 패키지들만을 적절하게 설치해서 사용할 수 있다. 이렇게 하면 <code>requirements.txt</code>를 생성하는것도 깔끔하게 해결된다.</p>
<h2 id="lets-do-it">Let&#39;s Do It</h2>
<p>터미널을 열고 가상환경을 생성 해보자. 파이썬3 부터 가상환경 설정을 위해 <code>venv</code>라는 라이브러리를 제공하는데 만약 파이썬2 라면 <code>virtualenv</code>를 사용하면 된다. (본글은 Mac OS를 기준으로 작성하였음을 알린다)</p>
<pre><code class="language-shell">$ cd [디렉터리]
$ python -m venv [가상환경이름]
$ source [가상환경이름]/bin/activate</code></pre>
<p>위와 같이 해주면 가상환경이 생성되고 이제 마음껏 패키지들을 설치하면 된다. </p>
<p>가상환경을 비활성화 하려면 아래와 같이 해주면 된다.</p>
<pre><code class="language-shell">$ deactivate</code></pre>
<h2 id="one-more-thing">One More Thing...</h2>
<p>VS Code, PyCharm 같은 에디터에서 python interpreter를 생성한 가상환경으로 설정해주면 가상환경에서 작업할 수 있게 된다.</p>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/">Installing packages using pip and virtual environments</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[미국 상장 기업 공시 데이터]]></title>
            <link>https://velog.io/@choi-jiwoo/%EB%AF%B8%EA%B5%AD-%EC%83%81%EC%9E%A5-%EA%B8%B0%EC%97%85-%EA%B3%B5%EC%8B%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0</link>
            <guid>https://velog.io/@choi-jiwoo/%EB%AF%B8%EA%B5%AD-%EC%83%81%EC%9E%A5-%EA%B8%B0%EC%97%85-%EA%B3%B5%EC%8B%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0</guid>
            <pubDate>Sun, 19 Feb 2023 15:55:15 GMT</pubDate>
            <description><![CDATA[<h2 id="sec-edgar-api">SEC EDGAR API</h2>
<p><strong>SEC</strong>는 <strong>Securities and Exchange Commission</strong>의 약자로 미국 증권거래위원회다. <a href="https://www.sec.gov/edgar/search-and-access">SEC EDGAR</a> 는 미국 증시에 상장되어있는 회사들이 자신들의 공시자료를 올리는 시스템이다. 한국에 전자공시시스템 <a href="http://dart.fss.or.kr/">DART</a> 같은곳이다.</p>
<p>이곳에서 EDGAR 시스템에 있는 데이터를 사용할 수 있게 <a href="https://www.sec.gov/edgar/sec-api-documentation">공식 API</a>를 공개하기 시작했는데 따로 API key를 발급 받지 않아도 사용이 가능하다.</p>
<p>유로 API가 있긴 있다.
개발자 등록을 하고 API key를 받고 사용할 수 있고, Companies, Core Financials, Insider Trades, Institutional Ownership, Desciptions 데이터셋을 제공하고 있다. 자세한 사항은 <a href="https://developer.edgar-online.com/docs">이곳</a>에서 확인할 수 있다.</p>
<h2 id="lets-have-a-look">Let&#39;s Have A Look!</h2>
<p>사이트에 설명을 보면 회사들이 제출한 공시 자료들과 여러 재무 정보가 담겨있는 XBRL 형식의 문서에서 추출한 데이터들을 REST API 형태로 제공한다.</p>
<blockquote>
<p>Submissions by company and extracted XBRL data are available via RESTful APIs on data.sec.gov, offering JSON formatted data.</p>
<p>Currently included in the APIs are the submissions history by filer and the XBRL data from financial statements (forms 10-Q, 10-K,8-K, 20-F, 40-F, 6-K, and their variants).</p>
</blockquote>
<p><strong>XBRL</strong> 이란 기업 재무 정보를 표준화된 방식으로 보고할 수 있도록 만들어진 XML 형식의 기업보고용 언어이다. SEC 뿐만 아니라 다른 국가에서도 기업이 재무 정보를 보고할 때 XBRL을 사용하여 보고한다.</p>
<blockquote>
<p>Extensible Business Markup Language (XBRL) is an XML-based format for reporting financial statements used by the SEC and financial regulatory agencies across the world.</p>
</blockquote>
<h2 id="data-offered">Data Offered</h2>
<p>SEC에서는 현재 4가지 정도의 데이터를 제공 하고 있다.</p>
<table>
<thead>
<tr>
<th>데이터</th>
<th>링크</th>
</tr>
</thead>
<tbody><tr>
<td>기업이 제출한 보고서 목록</td>
<td><a href="https://data.sec.gov/submissions/CIK##########.json">https://data.sec.gov/submissions/CIK##########.json</a></td>
</tr>
<tr>
<td>기업의 특정 재무 항목에 대한 과거 데이터 <br> (예: 매입채무)</td>
<td><a href="https://data.sec.gov/api/xbrl/companyconcept/CIK##########/us-gaap/AccountsPayableCurrent.json">https://data.sec.gov/api/xbrl/companyconcept/CIK##########/us-gaap/AccountsPayableCurrent.json</a></td>
</tr>
<tr>
<td>기업의 모든 과거 재무 데이터</td>
<td><a href="https://data.sec.gov/api/xbrl/companyfacts/CIK##########.json">https://data.sec.gov/api/xbrl/companyfacts/CIK##########.json</a></td>
</tr>
<tr>
<td>특정 시점에 기업별 특정 재무 데이터 <br> (예: 2019년 1분기 매입채무)</td>
<td><a href="https://data.sec.gov/api/xbrl/frames/us-gaap/AccountsPayableCurrent/USD/CY2019Q1I.json">https://data.sec.gov/api/xbrl/frames/us-gaap/AccountsPayableCurrent/USD/CY2019Q1I.json</a></td>
</tr>
<tr>
<td>전체 데이터 다운로드</td>
<td><a href="http://www.sec.gov/Archives/edgar/daily-index/xbrl/companyfacts.zip">http://www.sec.gov/Archives/edgar/daily-index/xbrl/companyfacts.zip</a></td>
</tr>
</tbody></table>
<p><code>CIK##########.json</code> 이란것이 계속해서 나오는데 <strong>CIK</strong> 는 <strong>Central Index Key</strong>의 약자로 10개의 숫자로 구성된 회사마다 부여되는 유니크한 번호다. 예를들어 애플의 CIK는 <em>0000320193</em> 이다.</p>
<p>그런데 해당 회사의 데이터를 불러오려면 이 CIK를 알아야 하는데 어떻게 알 수 있을까?
방법은 여러가지가 있지만 가장 간단하게는 <a href="https://www.sec.gov/edgar/searchedgar/companysearch.html">SEC 사이트</a>에서 원하는 회사 이름으로 검색하면 알 수 있다.
<img src="https://velog.velcdn.com/images/choi-jiwoo/post/21c95433-d24f-48c0-b395-80dfefda4bb9/image.png" alt="CIK of Apple"></p>
<p>다른 방법은 지금 소개하는 API에 포함되진 않지만 SEC에서 제공하는 또다른 방식으로 모든 등록된 회사의 CIK, 티커, 거래소 데이터를 가져올 수도 있다. 자세한 사항은 <a href="https://www.sec.gov/os/accessing-edgar-data">이곳</a>에서 확인할 수 있다.</p>
<p>파이썬으로 가져와 보자</p>
<pre><code class="language-python">import requests

url = &#39;https://www.sec.gov/files/company_tickers_exchange.json&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla&#39;}
res = requests.get(url, headers=headers)
cik_list = res.json()</code></pre>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/b9a10593-9d1d-40f3-a99b-657a19979983/image.png" alt="cik_list"></p>
<p>추가로 dictionary로 되어있는 cik_list를 pandas dataframe으로 만들어서 사용하면 손쉽게 검색이 가능해진다.</p>
<pre><code class="language-python">import pandas as pd

cik_df = pd.DataFrame(cik_list[&#39;data&#39;], columns=cik_list[&#39;fields&#39;])</code></pre>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/ffbc54c8-9e42-4501-a43a-040fde811624/image.png" alt="result dataframe"></p>
<h2 id="closing-words">Closing Words</h2>
<p>API를 제공하기 시작한게 그렇게 오래 되지 않은것으로 알고 있는데 그래서인지 아직은 부족한 부분이 있는것 같다.</p>
<p>그리고 이 데이터들은 모두 회사의 재무와 관련된 데이터들 이어서 재무회계와 US-GAAP에 능통한 분들과 같이 사용하면 데이터에 가치를 최대치로 끌어올릴 수 있을것 같다.</p>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://www.sec.gov/os/accessing-edgar-data">Accessing EDGAR Data</a></li>
<li><a href="https://www.sec.gov/developer">Developer Resources</a></li>
<li><a href="http://xbrl.or.kr/xbrl%EC%9D%B4%EB%9E%80/">XBRL이란?</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[네이버 금융 과거 주가 데이터 크롤링]]></title>
            <link>https://velog.io/@choi-jiwoo/%EB%84%A4%EC%9D%B4%EB%B2%84-%EA%B8%88%EC%9C%B5-%EA%B3%BC%EA%B1%B0-%EC%A3%BC%EA%B0%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%81%AC%EB%A1%A4%EB%A7%81</link>
            <guid>https://velog.io/@choi-jiwoo/%EB%84%A4%EC%9D%B4%EB%B2%84-%EA%B8%88%EC%9C%B5-%EA%B3%BC%EA%B1%B0-%EC%A3%BC%EA%B0%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%81%AC%EB%A1%A4%EB%A7%81</guid>
            <pubDate>Sun, 03 Jul 2022 05:50:25 GMT</pubDate>
            <description><![CDATA[<h2 id="데이터-소스">데이터 소스</h2>
<p>파이썬으로 주가 데이터를 사용하려 할 때 <a href="https://pypi.org/project/yfinance/">yfinance</a>나 <a href="https://github.com/financedata/financedatareader">financeDataReader</a>와 같은 좋은 패키지를 사용하면 간단하게 주가 데이터를 불러올 수 있다. 하지만 이번 포스팅에선 간단하게 <a href="https://finance.naver.com/">네이버 금융</a>에서 직접 주가 데이터를 불러와 보고자 한다. 재밌으니깐 ㅎㅎ</p>
<h2 id="lets-have-a-look">Let&#39;s Have A Look</h2>
<p>네이버 금융에 접속한 후 검색창에서 삼성전자를 검색하고 결과 페이지에서 &#39;차트&#39; 탭을 누르면 <a href="https://finance.naver.com/item/fchart.naver?code=005930">삼성전자의 주가 차트</a>를 볼 수 있다. <del><em>제발 가즈아!</em></del></p>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/b1ab9fa4-d9b8-4d1c-a7bc-7575d0c07473/image.png" alt="005930"></p>
<p>여기서 크롬으로 <strong>개발자 도구</strong>를 열고 <strong>네트워크</strong>에서 <code>Fetch/XHR</code>을 누르면 브라우저가 서버와 실시간으로 주고 받은 데이터들을 확인할 수 있다. 주가 차트가 다 불러와진 상태에서는 불러온 데이터를 볼 수 없으므로 <strong>개발자 도구</strong>를 열어둔 상태에서 새로고침을 해보면 뭔가 줄줄이 생기는걸 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/ec3e01d6-7946-44df-867f-fbd3a67356a4/image.png" alt="network"></p>
<p>이것들 중 주가 데이터를 담고 있는것은 siseJson.naver?로 시작하는것으로 Headers에 요청보낸 URL을 확인하고 이 URL로 GET request를 보내면 데이터를 불러올 수 있다.</p>
<h2 id="lets-code">Let&#39;s Code!</h2>
<pre><code class="language-python">import ast
import pandas as pd
import requests

url = &#39;https://api.finance.naver.com/siseJson.naver&#39;
params = {
    &#39;symbol&#39;: &#39;005930&#39;,  # 삼성전자
    &#39;requestType&#39;: 1,  # 무엇인지 모르겠음
    &#39;startTime&#39;: &#39;20220101&#39;,
    &#39;endTime&#39;: &#39;20220122&#39;,
    &#39;timeframe&#39;: &#39;day&#39;,  # &#39;week&#39;, &#39;month&#39;
}</code></pre>
<p>날짜 범위는 YYYYMMDD 형식으로 해주고 파라미터 중 하나라도 빠지면 데이터가 불러와지지 않으니 다 채워넣어 주자.</p>
<p>이제 GET request를 보내고 응답코드가 <code>200</code>이 반환되면 성공적으로 데이터를 불러온 것이다.</p>
<pre><code class="language-python">res = requests.get(url, params=params)
print(res)  # or print(res.status_code)
# Output: &lt;Response [200]&gt;</code></pre>
<pre><code class="language-python">print(res.text)</code></pre>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/7433f241-3560-47c2-aff6-62b0e73a47e3/image.png" alt="res.text"></p>
<p>응답 받은 데이터를 쓸만한 데이터로 만들으려면 추가적으로 전처리 과정이 필요하다.</p>
<h2 id="cleaning-time">Cleaning Time</h2>
<p>먼저 응답 받은 문자열 데이터에서 구두점들을 제거해주고 데이터프레임으로 변환해 주었다.</p>
<pre><code class="language-python">data = res.text.strip()
stock = ast.literal_eval(data)  # 문자열을 배열로 변환
stock = pd.DataFrame(stock, columns=stock[0])
stock.drop(0, inplace=True)</code></pre>
<p>그리고 각 Column 마다 알맞은 데이터 타입으로 변환해 주었다.</p>
<pre><code class="language-python">stock[&#39;날짜&#39;] = pd.to_datetime(stock[&#39;날짜&#39;])
ohlcv = [&#39;시가&#39;, &#39;고가&#39;, &#39;저가&#39;, &#39;종가&#39;, &#39;거래량&#39;]
stock[ohlcv] = stock[ohlcv].apply(pd.to_numeric)
stock[&#39;외국인소진율&#39;] = stock[&#39;외국인소진율&#39;].astype(&#39;float64&#39;)</code></pre>
<h2 id="result">Result</h2>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/bc79ecfd-5863-4f17-a391-334d81000eb4/image.jpeg" alt="df"></p>
<h2 id="closing-words">Closing Words</h2>
<p>이렇게 불러온 주가 데이터는 실시간 데이터가 아니기 때문에 트레이딩에 사용하기에는 적합하지 않고 시계열 분석이나 백테스팅 목적으로 사용할 수 있을것이다. 그리고 비공식적인 방법으로 데이터를 불러오는 것이기 때문에 개인적인 목적 외에 사용하는 것은 권장하지 않는다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[investing.com 과거 주가 데이터 크롤링]]></title>
            <link>https://velog.io/@choi-jiwoo/investing.com-%EA%B3%BC%EA%B1%B0-%EC%A3%BC%EA%B0%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%81%AC%EB%A1%A4%EB%A7%81</link>
            <guid>https://velog.io/@choi-jiwoo/investing.com-%EA%B3%BC%EA%B1%B0-%EC%A3%BC%EA%B0%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%81%AC%EB%A1%A4%EB%A7%81</guid>
            <pubDate>Fri, 01 Jul 2022 14:46:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>[UPDATE 🔔]</strong></p>
</blockquote>
<ul>
<li>현재 확인해 본 바로는 investing.com 에서 Request를 날려 데이터를 불러오는 방식을 막아 놓은 것으로 보입니다. <a href="https://github.com/alvarobartt/investiny/issues/73">참고</a></li>
<li>기존 방식으로 주가 데이터를 크롤링하는것은 어려울것으로 보이네요..</li>
</ul>
<hr>
<h2 id="데이터-소스">데이터 소스</h2>
<p><a href="https://www.investing.com/">investing.com</a>은 미국은 물론 전세계의 주식 정보를 제공해주는 사이트다. <a href="https://kr.investing.com/">한국어</a>로도 서비스 하고 있다!</p>
<p><a href="https://github.com/alvarobartt/investpy">investpy</a>와 <a href="https://github.com/FinanceData/FinanceDataReader">FinanceDataReader</a> 같은 패키지 들이 investing.com 으로 부터 주가 데이터를 불러와서 파이썬에서 간단하게 주가 데이터를 사용할 수 있게 해준다.</p>
<p>주가 데이터를 가져오기 위해선 위에서 언급한 좋은 패키지들이 있고 *&quot;Don&#39;t reinvent the wheel&quot;* 이라는 말이 있지만, 같은 wheel 에도 여러 디자인이 있는것 처럼 한번 직접 코딩 해 보는것도 재밌으니깐 ㅎㅎ</p>
<h2 id="lets-have-a-look">Let&#39;s Have A Look!</h2>
<p>크롤링 하는 방법을 자세히 알아보자.
investing.com 에서 <a href="https://www.investing.com/equities/apple-computer-inc">애플(AAPL)</a>을 검색한 후 <code>Historical Data</code> 탭을 누르면 과거 주가 테이블이 나온다.</p>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/c80b2ca7-4d81-4ba4-94fb-36bd2d322eb7/image.png" alt="1"></p>
<p>여기서 원하는 날짜 범위를 설정해줄 수 있다.
<img src="https://velog.velcdn.com/images/choi-jiwoo/post/a0de4187-bc91-4a0d-95b3-a6a52558527d/image.png" alt="2"></p>
<p>날짜 범위를 설정하기 전에 크롬 개발자 도구를 열고 <code>Network</code> 탭으로 이동해 놓고 날짜를 설정해 주자.
<img src="https://velog.velcdn.com/images/choi-jiwoo/post/5e651b5f-07cc-4aa2-8a60-943a399f56d3/image.png" alt="3"></p>
<p>날짜를 설정하면 테이블이 리로딩 되면서 네트워크 탭에 <code>HistoricalDataAjax</code> 라는 이름의 request를 확인 할 수 있다.
<img src="https://velog.velcdn.com/images/choi-jiwoo/post/c8839888-54ee-48ce-99a8-ee3699e60ebf/image.png" alt="4"></p>
<p>Request URL을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/choi-jiwoo/post/130c0de6-fe73-47fd-93d3-2cf63f26e6ce/image.png" alt="5"></p>
<p><code>Payload</code> 탭에서 어떤 파라미터 값이 request에 전달되었는지 보면 여러가지가 나오는데 여러 request를 보내봤을 때 필요한건 <code>curr_id</code>, <code>st_date</code>, <code>end_date</code>, <code>interval_sec</code>, <code>action</code> 정도 였다. 다른건 다 뭔지 알겠는데 <code>curr_id</code>가 무엇인지 정확히는 모르겠지만 아마 investing.com에서 종목 마다 부여한 고유번호인것 같다.
<img src="https://velog.velcdn.com/images/choi-jiwoo/post/cb0695fb-d84d-412b-9a6f-5b81daa22769/image.png" alt="6"></p>
<p>그럼 원하는 종목의 주가 데이터를 크롤링 하려면 해당 종목의 <code>curr_id</code>를 알아야 하는데 이건 검색을 통해 알아낼 수 있었다.</p>
<p>아까와 동일하게 개발자 도구의 <code>Network</code> 탭을 열어놓은 상태에서 investing.com 검색창에 원하는 종목의 티커/심볼/종목코드 를 검색하면
<img src="https://velog.velcdn.com/images/choi-jiwoo/post/6cffe3f2-8765-49cc-9cd3-84eff340372c/image.png" alt="7"></p>
<p><code>Network</code> 탭에 <code>SearchTopBar</code> 이라는 request가 보인다. Request URL을 확인하고 <code>Payload</code> 탭에 내용을 확인하고
<img src="https://velog.velcdn.com/images/choi-jiwoo/post/077abe44-a933-4ba3-a0ff-4e33df7b28f2/image.png" alt="8"></p>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/a723fefd-7885-46f7-beac-82ba85f5330e/image.png" alt="9"></p>
<p><code>Preview</code> 탭을 눌러보면 Response 받은 데이터를 확인해 볼 수 있다. 이게 검색창에 종목 코드를 검색 했을때 응답으로 받은 데이터인 것이다.</p>
<p>티커/심볼/종목코드를 <strong>정확히</strong> 검색 하였다면 결과 리스트에 첫번째 항목이 찾고자 하는 종목일 것이다.</p>
<p>여기서 종목의 <code>curr_id</code>를 찾을 수 있는데, <code>quotes</code> 에 첫번째 item을 눌러보면 해당 검색결과의 간단한 정보가 담겨있고 <code>pair_id</code>라는 것이 담겨있는데 이것이 <code>curr_id</code>와 동일한 것이다. <em>(왜 이름이 다른지는 모르겠지만 구글링을 통해 두개가 같은것 이라는 것을 확인함)</em></p>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/f2ebbb91-8b11-4167-a4a2-553b98125b2e/image.png" alt="10"></p>
<p>이제 어떻게 주가 데이터를 크롤링 해야할 지 알았으니 코드를 짜보자!</p>
<h2 id="lets-code">Let&#39;s Code!</h2>
<p><a href="https://www.investing.com/equities/apple-computer-inc">애플(AAPL)</a>의 주가 데이터를 크롤링 해보자!</p>
<p>우선 애플의 <code>curr_id</code>를 추출해야 한다. 위에서 언급한것 처럼 검색창을 통해 <code>curr_id</code>를 추출한다.
POST 방식으로 request를 보내주는데 request header에 <code>User-Agent</code> 와 <code>X-Requested-With</code> 을 설정해 주어야 한다. <em>(<a href="https://ohgyun.com/346">X-Requested-With</a>에 관한 것은 링크 참고)</em></p>
<pre><code class="language-python">import requests
import pandas as pd

ticker = &#39;AAPL&#39;
url = &#39;https://www.investing.com/search/service/searchTopBar&#39;
headers = {
    &#39;User-Agent&#39;: &#39;Mozilla&#39;,
    &#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;,
}
form_data = {
    &#39;search_text&#39;: ticker,
}
res = requests.post(url, data=form_data, headers=headers)
data = res.json()
first_quote_result = data[&#39;quotes&#39;][0]
curr_id = first_quote_result[&#39;pairId&#39;]  # curr_id = 6408</code></pre>
<p>자 이제 <code>curr_id</code>를 알았으니 주가 데이터를 크롤링 해보자.
날짜 형식이 <code>%m/%d/%Y</code> 이니깐 주의하자.</p>
<pre><code class="language-python">st_date = &#39;01/06/2022&#39;
end_date = &#39;02/06/2022&#39;
form_data = {
    &#39;curr_id&#39;: curr_id,
    &#39;st_date&#39;: st_date,
    &#39;end_date&#39;: end_date,
    &#39;interval_sec&#39;: &#39;Daily&#39;,
    &#39;action&#39;: &#39;historical_data&#39;,
}
url = &#39;https://www.investing.com/instruments/HistoricalDataAjax&#39;
res = requests.post(url, data=form_data, headers=headers)</code></pre>
<p>응답 받은 데이터를 확인해보자.</p>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/d1749c53-7425-4f04-a7ec-39aa1b562fa2/image.png" alt="11"></p>
<p>HTML 코드다.
실제로 개발자 도구에서 <code>Response</code> 를 보면 HTML 이고 <code>&lt;table&gt;</code> 태그를 확인할 수 있다.
<img src="https://velog.velcdn.com/images/choi-jiwoo/post/3953d508-fe00-4816-a3a8-4770c7542d9d/image.png" alt="12"></p>
<p>파이썬에선 HTML 코드에서 데이터를 추출하는 대표적인 방법으론 <a href="https://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a> 와 <a href="https://pandas.pydata.org/">pandas</a> 가 있다.
여기선 pandas를 사용할 것인데 왜냐하면 <a href="https://pandas.pydata.org/docs/reference/api/pandas.read_html.html">pandas.read_html</a> 을 사용하면 간단하게 HTML 테이블을 <code>pandas.DataFrame</code> 으로 바꿀 수 있기 때문이다! <em>(그저 빛✨)</em></p>
<p>이어서 코드를 짜보자.
<code>pd.read_html</code> 은 HTML에 있는 모든 &lt;table&gt; element를 추출하기 때문에 리스트를 반환한다.
반환값을 확인해 보았을 때 인덱스 0 에 들어 있는 값이 주가 데이터 값 이었다.</p>
<pre><code class="language-python">data = res.text
tables = pd.read_html(data)
historicl_price = tables[0]</code></pre>
<h2 id="result">Result</h2>
<p><code>historical_price</code> 에 과거 주가 데이터가 잘 담겨있다.</p>
<p><img src="https://velog.velcdn.com/images/choi-jiwoo/post/425ac2f0-288c-40cc-8ae2-deff784fd072/image.png" alt="13"></p>
<h2 id="closing-words">Closing Words</h2>
<p>이 코드를 클래스나 함수로 만들면 여러 종목을 검색할 때 코드 재사용율을 높일 수 있다. 여기선 패스..</p>
]]></description>
        </item>
    </channel>
</rss>