<jupyter_start><jupyter_text>STOCK PRICE ANALYZER with TWITTER REACTION 2019-01-11 by <NAME>> Python  library를 이용해 주식을 예측해봅니다- 필요한 module들을 다운받습니다- numpy, sklearn, matplotlib- Support Vector Machine을 이용해 주가를 예측해봅시다> 모델은 3가지를 사용합니다- 선형모델- 다항모델- RBF모델(Radial Bias Fuction) RBF의 특징은 다음과 같습니다- 은닉층이 1개이다- 유클리디안 거리를 사용한다- 역전파 알고리즘- 안정성 판별이 가능하다<jupyter_code>%matplotlib inline

import csv
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt

dates=[]
prices=[]

# 데이터를 csv로부터 받아와 저장합니다
# dates에는 날짜가, prices에는 open 가격을 넣어줍니다
def get_data(filename):
    with open(filename, 'r') as csvfile:
        csvFileReader = csv.reader(csvfile)
        next(csvFileReader)
        for row in csvFileReader:
            dates.append(int(row[0].split('-')[0]))
            prices.append(float(row[1]))
    return

# 주식을 예상해봅니다
def predict_prices(dates, prices, x):
    dates = np.reshape(dates, (len(dates), 1))

    # 선형
    svr_lin = SVR(kernel= 'linear', C=1e3)
    # 다항
    svr_poly = SVR(kernel = 'poly', C=1e3, degree = 2)
    # RBF
    svr_rbf = SVR(kernel='rbf', C=1e3, gamma='auto')

    # 데이터 훈련
    svr_lin.fit(dates, prices)
    svr_poly.fit(dates, prices)
    svr_rbf.fit(dates, prices)

    # 데이터 표현
    plt.scatter(dates, prices, color='black', label='Data')
    plt.plot(dates, svr_rbf.predict(dates), color='red', label='RBF model')
    plt.plot(dates, svr_lin.predict(dates), color='green', label='Linear model')
    plt.plot(dates, svr_poly.predict(dates), color='blue', label='Polynomial model')
    # 그래프 레이블링
    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.title('Support Vector Regression')
    plt.legend()
    plt.show()

    #훈련된 데이터 반환
    return svr_rbf.predict(x)[0], svr_lin.predict(x)[0], svr_poly.predict(x)[0]

# CSV 파일 지정
get_data('snap.csv')
# 데이터 훈련
predicted_price = predict_prices(dates, prices, 21)
# 데이터 표시
print(predicted_price)
import pandas as pd

#pandas의 read_csv를 사용하면
#다음과 같이 data를 불러올 수 있습니다
snap_data = pd.read_csv('snap.csv')
snap_data<jupyter_output><empty_output><jupyter_text>더 쉽게 데이터를 받아오는 방법 quandl 모듈을 사용해 봅니다- start,end로 날짜를 지정하고- quandl.get으로 주식 데이터를 불러옵니다- 맨먼저 애플의 정보를 불러와봅니다- AAPL은 2018년 4월부터 주식정보가 없는데 이유가 뭘까요 .. ? 하루에 50번 넘게 불러오면 차단됩니다 ! 유의하세요- api를 등록하면 무제한으로 받아올 수 있습니다<jupyter_code>import pandas as pd
import quandl
import datetime

#시작 날짜와 마지막 날짜를 지정해줍니다
#마지막 날짜는 현재 컴퓨터 시간입니다
start = datetime.datetime(2018,3,1)
end = datetime.date.today()
 
s = "AAPL"
apple = quandl.get("WIKI/" + s, start_date=start, end_date=end)
# apple 데이터의 타입을 확인해봅시다
type(apple)

#데이터를 읽고 정제하기 쉽게 DataFrame으로 불러오는것을 알수있습니다
#맨앞 몇개의 데이터만 살펴봅시다
apple.head()<jupyter_output><empty_output><jupyter_text>데이터에서 중요한 지표들- Open : 시장이 열리고 난 후 가격- High : 최고가- Low : 최저가- Close : 장이 마감한 후 가격- Volume : 주식 거래 량- Adj가 붙은 것은 조정된 가격을 나타냅니다<jupyter_code>#plot 차트를 한번 그려봅시다

%pylab inline
pylab.rcParams['figure.figsize'] = (10,5)
apple['Open'].plot(grid=True)<jupyter_output>Populating the interactive namespace from numpy and matplotlib<jupyter_text>나스닥 상위 20개 기업들의 트윗을 분석해 봅시다> https://www.nasdaq.com/screening/companies-by-industry.aspx?sortname=marketcap&sorttype=1&exchange=NASDAQ 상위 20개 기업들의 트윗을 감정분석- TextBlob을 이용해 polarity와 subjectivity를 분석해봅니다- polarity와 subjectivity가 어제,오늘 주식에 영향을 주는지 알아봅니다<jupyter_code>from textblob import TextBlob
import nltk
import tweepy
import config
from textblob import TextBlob
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')

# 커스터머키
consumer_key = config.consumer_key
consumer_secret = config.consumer_secret
# 엑세스토큰
access_token = config.access_token
access_token_secret = config.access_token_secret

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)<jupyter_output>[nltk_data] Downloading package punkt to
[nltk_data]     C:\Users\shpkc\AppData\Roaming\nltk_data...
[nltk_data]   Package punkt is already up-to-date!
[nltk_data] Downloading package averaged_perceptron_tagger to
[nltk_data]     C:\Users\shpkc\AppData\Roaming\nltk_data...
[nltk_data]   Package averaged_perceptron_tagger is already up-to-
[nltk_data]       date!<jupyter_text>긍정, 부정, 주관적 요소들을 분석해봅니다- polarity > 0일경우 긍정적, 0보다 작으면 부정적 반응- polarity=0인 경우는 기사일 확률이 높습니다- 트윗 반응이 긍정적인 기업과 부정적인 기업으로 나눠서 분석해봅시다- 주관적 반응도 함께 알아봅니다<jupyter_code>#나스닥 상위 20개 기업
nasdaq_20 = ['Amazon', 'Microsoft', 'Alphabet', 'Apple', 'Facebook', 'Intel', 'Cisco',
            'Comcast', 'Pepsico', 'Netflix', 'Amgen', 'Adobe', 'PayPal', 'Broadcom', 
            'Costco', 'Texas Instruments', 'Twenty-First Century', 'Gilead Sciences',
            'NVIDIA', 'GILD']

#기업들의 트윗분석을 넣어줄 리스트
nasdaq_20_polarity_positive = []
nasdaq_20_polarity_negative = []
nasdaq_20_subjectivity = []

#20개 나스닥의 긍정, 부정, 주관을 알아봅니다
for company in nasdaq_20:
    company_tweet = api.search(company, len='en', count=100)
    
    polarity_score = 0
    subjectivity_score = 0
    
    for tweet in company_tweet:
        company = TextBlob(tweet.text)
        
        polarity_score += company.sentiment.polarity
        subjectivity_score += company.sentiment.subjectivity
    
    #긍정적일 경우 nasdaq_20_polarity_positive에 추가해주고
    #부정적일 경우 nasdaq_20_polarity_negative에 추가해줍니다
    if polarity_score > 0:
        nasdaq_20_polarity_positive.append(1)
        nasdaq_20_polarity_negative.append(0)
    else:
        nasdaq_20_polarity_positive.append(0)
        nasdaq_20_polarity_negative.append(1)
        
    #주관을 나타내는 subjectivity는 그냥 모두 더해서 넣어줍니다
    nasdaq_20_subjectivity.append(subjectivity_score)
        
#DataFrame을 만들어 기업이름, 긍정&부정, 주관 데이터를 저장합니다
df_stock = pd.DataFrame({'company' : nasdaq_20,
                        'company_polarity_positive' : nasdaq_20_polarity_positive,
                        'company_polarity_negative' : nasdaq_20_polarity_negative,
                        'company_subjectivity' : nasdaq_20_subjectivity})
df_stock<jupyter_output><empty_output><jupyter_text>어제 주식과 오늘 주식을 비교해봅니다- 등락 여부를 나타내는 함수를 만듭니다- 어제의 Open, High, Low, Close를 모두 더해- 오늘과 비교해 봅시다> 오늘 주식 또한 Open, High, Low, Close를 모두 더합니다<jupyter_code>trend_data = []

#등락여부를 나타내는 함수
def stock_change(stock_data):
    prev_price = 0
    today_price = 0
   
    #어제의 Open부터 Close까지 더합니다
    for i in range(4):
        prev_price += stock_data.iloc[0,i]
    #오늘의 Open부터 Close까지 더합니다 
    for i in range(4):
        today_price += stock_data.iloc[1,i]
    
    #어제보다 올랐으면 1, 내렸으면 0을 반환합니다
    if today_price > prev_price :
        trend_data.append(1)
    else:
        trend_data.append(0)
start_date = datetime.datetime(2018,1,10)
end_date = datetime.datetime(2018,1,11)

#주식을 불러오기 위해선 코드명이 필요합니다
#코드명을 넣어줍니다
#나중에는 크롤링을 이용해서 불러올수 있게 해보겠습니다
nasdaq_20_code = ['AMZN', 'MSFT', 'GOOGL', 'GOOG', 'AAPL', 'FB', 'INTC', 'CSCO', 'CMCSA', 'PEP', 'NFLX',
                 'AMGN', 'ADBE', 'PYPL', 'AVGO', 'TXN', 'COST', 'FOX', 'NVDA', 'GILD']


for i in range(12,20):
    code = nasdaq_20_code[i]
    stock_data = quandl.get("WIKI/" + code, start_date=start_date, end_date=end_date)
    
    stock_change(stock_data)

#DataFrame에 trend column을 만들고 분석한 trend를 넣어줍니다
df_stock.insert(4, 'trend', trend_data)

#trend 데이터를 살펴봅니다
#전날보다 증가한 기업이 16개, 전날보다 감소한 기업이 4개 있습니다
df_stock['trend'].value_counts()<jupyter_output><empty_output><jupyter_text>트위터가 주가에 영향을 주는지 분석해봅니다- 히트맵을 그려서 상관관계를 알아봅시다- seaborn의 heatmap을 사용합니다> 긍정적,부정적영향과 subjectivity도 알아봅시다<jupyter_code>import seaborn as sns

heatmap_data = df_stock[['company_polarity_positive', 'company_polarity_negative', 'company_subjectivity','trend']]

colormap = plt.cm.RdBu
plt.figure(figsize=(18,10))
plt.title('Correlation Between features', size=15, y=1.1)
sns.heatmap(heatmap_data.astype(float).corr(), linewidths=0.1, vmax=1.0,
           square=True, cmap=colormap, linecolor='white', annot=True, annot_kws={"size": 16})<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11213872832369942, 'fraction_numerical': 0.018754014129736672, 'mean_word_length': 4.1665560716655605, 'pattern_counts': {'":': 1, '<': 28, '<?xml version=': 0, '>': 36, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 5, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '493782', 'license': 'MIT', 'n_tokens_mistral': 4020, 'n_tokens_neox': 4454, 'n_words': 712, 'path': 'StockPriceAnalyzer_SiHyung.ipynb', 'repo_name': 'apostkor/StockPriceAnalyzer', 'size': '7792'}