Es gibt zwei Methoden, um Anlageentscheidungen bei Aktienanlagen zu treffen: technische Analyse und Fundamentalanalyse. Dieses Mal werden wir uns mit der technischen Analyse befassen.
Prognostizieren Sie den durchschnittlichen Aktienkurs von Nikkei mithilfe von Twitter. Zunächst werde ich den allgemeinen Ablauf erläutern.
1, Holen Sie sich vergangene Tweets eines Kontos von Twitter mit der Twitter-API. 2, Analysieren Sie tägliche Tweets mit einem Polarwörterbuch. 3, Holen Sie sich Zeitreihendaten des durchschnittlichen Aktienkurses von Nikkei. 4, Prognostizieren Sie die Höhen und Tiefen des Aktienkurses am nächsten Tag anhand der täglichen Stimmung mithilfe von maschinellem Lernen.
Sie benötigen ein Zugriffstoken, um Tweets von Twitte abzurufen. Dies entspricht der ID und dem PASS im Benutzerkonto
Es bezieht sich auf zwei Arten von Zeichenketten, "Access Token Key" und "Access Token Secret".
Hier erhalten Sie Tweets, die ein bestimmtes Wort enthalten.
import time
from requests_oauthlib import OAuth1Session
import json
import datetime, time, sys
CK = '' #Verbraucherschlüssel''Geben Sie ein
CS = '' #Verbrauchergeheimnis''Geben Sie ein
AT = '' #Zugangstoken''Geben Sie ein
AS = '' #Zugriff auf Token Secret''Geben Sie ein
session = OAuth1Session(CK, CS, AT, AS)
url = 'https://api.twitter.com/1.1/search/tweets.json'
res = session.get(url, params = {'q':u'python', 'count':100})
res_text = json.loads(res.text)
for tweet in res_text['statuses']:
print ('-----')
print (tweet['created_at'])
print (tweet['text'])
Klicken Sie hier, um Tweets einschließlich künstlicher Intelligenz zu erhalten
import time
from requests_oauthlib import OAuth1Session
import json
import datetime, time, sys
CK = '' #Verbraucherschlüssel''Geben Sie ein
CS = '' #Verbrauchergeheimnis''Geben Sie ein
AT = '' #Zugangstoken''Geben Sie ein
AS = '' #Zugriff auf Token Secret''Geben Sie ein
session = OAuth1Session(CK, CS, AT, AS)
url = 'https://api.twitter.com/1.1/search/tweets.json'
res = session.get(url, params = {'q':u'Künstliche Intelligenz', 'count':100})
res_text = json.loads(res.text)
for tweet in res_text['statuses']:
print ('-----')
print (tweet['created_at'])
print (tweet['text'])
Ich werde versuchen, die Tweets von Nikkei Sangyo Shimbun zu bekommen.
import tweepy
import csv
consumer_key = "" #„Verbraucher erhalten hier mit einem persönlichen Konto_Schlüssel""Bitte geben Sie in "
consumer_secret = "" #„Verbraucher erhalten hier mit einem persönlichen Konto_Geheimnis""Bitte geben Sie in "
access_key = "" #„Zugang erhalten Sie hier mit einem persönlichen Konto_Schlüssel""Bitte geben Sie in "
access_secret = "" #„Zugang erhalten Sie hier mit einem persönlichen Konto_secret""Bitte geben Sie in "
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)
#Holen Sie sich Tweets
tweet_data = []
tweets = tweepy.Cursor(api.user_timeline,screen_name = "@nikkei_bizdaily",exclude_replies = True)
for tweet in tweets.items():
tweet_data.append([tweet.id,tweet.created_at,tweet.text.replace('\n',''),tweet.favorite_count,tweet.retweet_count])
tweet_data
# tweets.Im Datenordner als CSV gespeichert
with open('./6050_stock_price_prediction_data/tweets.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerow(["id", "text", "created_at", "fav", "RT"])
writer.writerows(tweet_data)
Was ist Emotionsanalyse? Text hat eine positive Bedeutung bei der Verarbeitung natürlicher Sprache. Oder es ist eine Technik, um zu beurteilen, ob es eine negative Bedeutung hat.
Durch emotionale Analyse von Produktbewertungen Es wird häufig für Marketing und Kundenbetreuung verwendet.
Der Hauptmechanismus der Emotionsanalyse sind die Wörter, die im Satz erscheinen Beurteilen Sie, ob es eine positive, negative oder neutrale Bedeutung hat.
Es gibt ein Polaritätswörterbuch als Kriterium für die Beurteilung Es wird in einem Wörterbuch definiert, in dem die positive oder negative Morphologie im Voraus definiert wird.
Die Emotionsanalyse wird unter Bezugnahme auf das Polaritätswörterbuch für jedes Wort im Dokument durchgeführt. Lassen Sie uns zunächst die Morphologie mit MeCab analysieren.
import MeCab
import re
#Erstellen Sie eine MeCab-Instanz. Wenn kein Argument angegeben wird, wird es zu einem IPA-Wörterbuch.
m = MeCab.Tagger('')
#Eine Funktion, die Text morphologisch analysiert und eine Liste von Wörterbüchern zurückgibt
def get_diclist(text):
parsed = m.parse(text) #Ergebnis der morphologischen Analyse (erhalten als Zeichenkette einschließlich Zeilenumbrüche)
lines = parsed.split('\n') #Listen Sie die Analyseergebnisse für jede Zeile separat auf (1 Wort)
lines = lines[0:-2] #Die letzten beiden Zeilen sind nicht erforderlich. Löschen Sie sie daher
diclist = []
for word in lines:
l = re.split('\t|,',word) #Weil jede Zeile durch einen Tabulator und ein Komma getrennt ist
d = {'Surface':l[0], 'POS1':l[1], 'POS2':l[2], 'BaseForm':l[7]}
diclist.append(d)
return(diclist)
Morgen wird es sonnig werden. Klicken Sie hier, wenn Sie das Argument festlegen
import MeCab
import re
#Erstellen Sie eine MeCab-Instanz. Wenn kein Argument angegeben wird, wird es zu einem IPA-Wörterbuch.
m = MeCab.Tagger('')
#Eine Funktion, die Text morphologisch analysiert und eine Liste von Wörterbüchern zurückgibt
def get_diclist(text):
parsed = m.parse(text) #Ergebnis der morphologischen Analyse (erhalten als Zeichenkette einschließlich Zeilenumbrüche)
lines = parsed.split('\n') #Listen Sie die Analyseergebnisse für jede Zeile separat auf (1 Wort)
lines = lines[0:-2] #Die letzten beiden Zeilen sind nicht erforderlich. Löschen Sie sie daher
diclist = []
for word in lines:
l = re.split('\t|,',word) #Weil jede Zeile durch einen Tabulator und ein Komma getrennt ist
d = {'Surface':l[0], 'POS1':l[1], 'POS2':l[2], 'BaseForm':l[7]}
diclist.append(d)
return(diclist)
get_diclist("Morgen wird es sonnig werden.")
Dieses Mal werden wir das Wort Emotionspolaritätskorrespondenztabelle als Polaritätswörterbuch verwenden.
Dies weist reelle Zahlen von -1 bis +1 unter Bezugnahme auf das "Iwanami Japanese Dictionary (Iwanami Shoten)" zu.
Je näher es an -1 liegt, desto negativer Je näher es an +1 liegt, desto positiver ist es.
Lesen Sie dann das Polaritätswörterbuch Erstellen Sie Listen und Wörterbücher.
#word_list, pn_Speichern Sie Word und PN im Listentyp.
import pandas as pd
pn_df = pd.read_csv('./6050_stock_price_prediction_data/pn_ja.csv', encoding='utf-8', names=('Word','Reading','POS', 'PN'))
word_list=list(pn_df['Word'])
pn_list=list(pn_df['PN'])
#pn_Wort als Diktat_list, pn_Erstellen Sie ein Wörterbuch, in dem die Liste gespeichert ist.
pn_dict = dict(zip(word_list,pn_list))
Die Implementierung besteht darin, auf das Polaritätswörterbuch zu verweisen und den PN-Wert zurückzugeben.
Ebenfalls Übergeben Sie get_diclist ("Es wird morgen gut") an die Funktion add_pnvalue, um zu sehen, wie es funktioniert Wir übergeben es auch an die Funktion get_mean, um den Durchschnitt der PN-Werte zu ermitteln.
import numpy as np
def add_pnvalue(diclist_old, pn_dict):
diclist_new = []
for word in diclist_old:
base = word['BaseForm'] #Holen Sie sich die Grundform aus einzelnen Wörterbüchern
if base in pn_dict:
pn = float(pn_dict[base])
else:
pn = 'notfound' #Wenn das Wort nicht in der PN-Tabelle enthalten ist
word['PN'] = pn
diclist_new.append(word)
return(diclist_new)
#Berechnen Sie den PN-Durchschnittswert jedes Tweets
def get_mean(dictlist):
pn_list = []
for word in dictlist:
pn = word['PN']
if pn!='notfound':
pn_list.append(pn)
if len(pn_list)>0:
pnmean = np.mean(pn_list)
else:
pnmean=0
return pnmean
dl_old = get_diclist("Morgen wird es sonnig werden.")
# get_diclist("Morgen wird es sonnig werden.")Die Funktion hinzufügen_Übergeben Sie es an pnvalue, um zu sehen, wie es funktioniert.
dl_new = add_pnvalue(dl_old, pn_dict)
print(dl_new)
#Machen Sie es auch zu einer Funktion bekommen_Übergeben Sie es, um den Durchschnitt der PN-Werte zu ermitteln.
pnmean = get_mean(dl_new)
print(pnmean)
Die Änderung des PN-Werts wird in einem Diagramm angezeigt.
import matplotlib.pyplot as plt
%matplotlib inline
df_tweets = pd.read_csv('./6050_stock_price_prediction_data/tweets.csv', names=['id', 'date', 'text', 'fav', 'RT'], index_col='date')
df_tweets = df_tweets.drop('text', axis=0)
df_tweets.index = pd.to_datetime(df_tweets.index)
df_tweets = df_tweets[['text']].sort_index(ascending=True)
# means_Erstellen Sie eine leere Liste mit dem Namen list und ermitteln Sie den Durchschnittswert für jeden Tweet.
means_list = []
for tweet in df_tweets['text']:
dl_old = get_diclist(tweet)
dl_new = add_pnvalue(dl_old, pn_dict)
pnmean = get_mean(dl_new)
means_list.append(pnmean)
df_tweets['pn'] = means_list
df_tweets = df_tweets.resample('D', how='mean')
#Zeichnen Sie das Datum auf der x-Achse und den PN-Wert auf der y-Achse.
x = df_tweets.index
y = df_tweets.pn
plt.plot(x,y)
plt.grid(True)
# df_tweets.df mit dem Namen csv_Bitte geben Sie die Tweets erneut aus.
df_tweets.to_csv('./6050_stock_price_prediction_data/df_tweets.csv')
Betrachtet man die Ergebnisse des Diagramms, so scheint es insgesamt viele negative Werte zu geben.
Dies liegt daran, dass das Polarwörterbuch viel Vokabular mit negativen Auswirkungen enthält. Standardisieren, um dieses Ergebnis anzupassen.
Standardisieren Sie den PN-Wert Ändern Sie außerdem die PN auf den Durchschnitt für jedes Datum und zeichnen Sie sie auf.
# means_Standardisierte Liste, x_Ausgabe als Standard
df_tweets['pn'] = (df_tweets['pn'] - df_tweets['pn'].mean()) / df_tweets['pn'].std()
#Ändern Sie außerdem die PN auf den Durchschnitt für jedes Datum und zeichnen Sie sie auf.
df_tweets = df_tweets.resample('D', how='mean')
x = df_tweets.index
y = df_tweets.pn
plt.plot(x,y)
plt.grid(True)
Recommended Posts