반응형

/*******************************************************************************************************************
-- Title : [Py3.5] Implementing Subplots to the Chart w/ Matplotlib.pyplot
-- Reference : pythionprogramming.net
-- Key word : pythion 파이썬 matplotlib pyplot candlestick candlestick_ohlc numpy subplot subplot2grid
                  set_major_formatter set_major_locator annotate dict annotate() dict() 촛대 차트 촛대 그래프
                  주석 패널
*******************************************************************************************************************/

-- Figure

-- Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.ticker as mticker
from matplotlib.finance import candlestick_ohlc
from matplotlib import style
 
import numpy as np
import urllib
import datetime as dt
 
# -- 차트 스타일 설정
style.use('fivethirtyeight')
print(plt.style.available)
 
# -- 차트 스타일 관련 파일 경로 출력(?)
print(plt.__file__)
 
# -- 일자 변환 처리
def bytespdate2num(fmt, encoding='utf-8'):
    strconverter = mdates.strpdate2num(fmt)
 
    def bytesconverter(b):
        s = b.decode(encoding)
        return strconverter(s)
 
    return bytesconverter
 
# -- 차트 생성 위한 데이터 처리 및 출력(Subplot 설정, 표의 셀 합치기와 유사)
def graph_data(stock):
    fig = plt.figure()
    ax1 = plt.subplot2grid((61), (00), rowspan=1, colspan=1)
    plt.title(stock)
    ax2 = plt.subplot2grid((61), (10), rowspan=4, colspan=1)
    plt.xlabel('Date')
    plt.ylabel('Price')
    ax3 = plt.subplot2grid((61), (50), rowspan=1, colspan=1)
 
    # -- URL 경로 변수
    stock_price_url = 'http://chartapi.finance.yahoo.com/instrument/1.0/' + stock + '/chartdata;type=quote;range=1m/csv'
    #print(stock_price_url)
 
    # -- URL 통해 데이터소스 가져오기
    source_code = urllib.request.urlopen(stock_price_url).read().decode()
    #print (source_code)
 
    # -- '\n' 기준으로 분리하여 리스트로 변환
    stock_data = []
    split_source = source_code.split('\n')
    #print (split_source)
 
    # -- 콤마(,)를 기준으로 분리
    for line in split_source:
        split_line = line.split(',')
        #print (split_line)
 
        # -- 리스트가 6개이고 label:value형태 아닌것만 추출
        if len(split_line) == 6:                                          # list개수가 6개이면
            if 'values' not in line and 'labels' not in line:
                stock_data.append(line)
                #print (stock_data)
 
    #print (stock_data)
    #print ("-" * 100)
 
    # -- URL 통해 데이터소스 가져오기
    date, closep, highp, lowp, openp, volume = np.loadtxt(stock_data,
                                                          delimiter=',',
                                                          unpack=True,
                                                          converters={0: bytespdate2num('%Y%m%d')})
    # print(date)
    # print(closep)
    # print(len(date))
 
    x = 0
    y = len(date)
    ohlc = []
 
    # -- numpy를 tuple로 저장
    while x < y:
        append_me = date[x], openp[x], highp[x], lowp[x], closep[x], volume[x]
        ohlc.append(append_me)
        x += 1
 
    # -- 촛대차트 정의
    candlestick_ohlc(ax2, ohlc, width=0.4, colorup='#77d879', colordown='#db3f3f')
    #plt.show()
 
    # -- X축 값의 45도 회전
    for label in ax1.xaxis.get_ticklabels():
        label.set_rotation(45)
    #plt.show()
 
    # -- X축 값 일자 표현
    ax2.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
    ax2.xaxis.set_major_locator(mticker.MaxNLocator(10))
    ax2.grid(True)
 
    # -- Annotating Last Price Stock Chart
    bbox_props = dict(boxstyle='round', fc='w', ec='k', lw=1)
 
    ax2.annotate(str(closep[-1]), (date[-1], closep[-1]),
                 xytext=(date[-1+ 4, closep[-1]), bbox=bbox_props)
    #plt.show()
 
 
    # -- 차트 설정
    # plt.legend()
    plt.subplots_adjust(left=0.11, bottom=0.24, right=0.90, top=0.90, wspace=0.2, hspace=0)
    plt.show()
 
 
graph_data('EBAY')
 
 
 

cs

반응형

+ Recent posts