Il existe deux méthodes pour prendre des décisions d'investissement dans l'investissement boursier: l'analyse technique et l'analyse des fondamentaux. Cette fois, nous traiterons de l'analyse technique.
Prédisez le cours moyen de l'action Nikkei en utilisant Twitter. Tout d'abord, je vais vous expliquer le flux général.
1, récupérez les tweets d'un compte Twitter en utilisant l'API Twitter. 2, Analysez les tweets quotidiens à l'aide d'un dictionnaire polaire. 3, obtenez des données de séries chronologiques du cours moyen de l'action Nikkei. 4, prédisez les hauts et les bas du cours de l'action le lendemain à partir du sentiment quotidien en utilisant l'apprentissage automatique.
Vous aurez besoin d'un jeton d'accès pour récupérer les tweets de Twitte. C'est comme l'ID et le PASS dans le compte utilisateur
Il fait référence à deux types de chaînes de caractères, "Access Token Key" et "Access Token Secret".
Ici, vous obtiendrez des tweets contenant un certain mot.
import time
from requests_oauthlib import OAuth1Session
import json
import datetime, time, sys
CK = '' #La clé du consommateur''Entrer à l'intérieur
CS = '' #Secret du consommateur''Entrer à l'intérieur
AT = '' #Jeton d'accès''Entrer à l'intérieur
AS = '' #Access Token Secret''Entrer à l'intérieur
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'])
Cliquez ici pour obtenir des tweets incluant l'intelligence artificielle
import time
from requests_oauthlib import OAuth1Session
import json
import datetime, time, sys
CK = '' #La clé du consommateur''Entrer à l'intérieur
CS = '' #Secret du consommateur''Entrer à l'intérieur
AT = '' #Jeton d'accès''Entrer à l'intérieur
AS = '' #Access Token Secret''Entrer à l'intérieur
session = OAuth1Session(CK, CS, AT, AS)
url = 'https://api.twitter.com/1.1/search/tweets.json'
res = session.get(url, params = {'q':u'Intelligence artificielle', 'count':100})
res_text = json.loads(res.text)
for tweet in res_text['statuses']:
print ('-----')
print (tweet['created_at'])
print (tweet['text'])
Je vais essayer d'obtenir les tweets de Nikkei Sangyo Shimbun.
import tweepy
import csv
consumer_key = "" #"Consommateur obtenu avec un compte personnel ici_clé""Veuillez entrer "
consumer_secret = "" #"Consommateur obtenu avec un compte personnel ici_secret""Veuillez entrer "
access_key = "" #"Accès obtenu ici avec un compte personnel_clé""Veuillez entrer "
access_secret = "" #"Accès obtenu ici avec un compte personnel_secret""Veuillez entrer "
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)
#Recevez des 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.Enregistré dans le dossier de données en tant que csv
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)
Qu'est-ce que l'analyse des émotions? Le texte a une signification positive en utilisant le traitement du langage naturel. Ou c'est une technique pour juger si elle a une signification négative.
En analysant émotionnellement les avis sur les produits Il est largement utilisé pour le marketing et le support client.
Le principal mécanisme d'analyse des émotions est constitué des mots qui apparaissent dans la phrase Jugez s'il a une signification positive, négative ou neutre.
Il existe un dictionnaire de polarité comme critère de jugement Elle est définie dans un dictionnaire dans lequel la morphologie positive ou négative est définie à l'avance.
L'analyse des émotions est effectuée en se référant au dictionnaire de polarité pour chaque mot du document. Analysons d'abord la morphologie à l'aide de MeCab.
import MeCab
import re
#Créez une instance MeCab. Si aucun argument n'est spécifié, il devient un dictionnaire IPA.
m = MeCab.Tagger('')
#Une fonction qui analyse morphologiquement le texte et renvoie une liste de dictionnaires
def get_diclist(text):
parsed = m.parse(text) #Résultat de l'analyse morphologique (obtenu sous forme de chaîne de caractères avec sauts de ligne)
lines = parsed.split('\n') #Lister les résultats de l'analyse séparément pour chaque ligne (1 mot)
lines = lines[0:-2] #Les deux dernières lignes sont inutiles, supprimez-les
diclist = []
for word in lines:
l = re.split('\t|,',word) #Parce que chaque ligne est séparée par une tabulation et une virgule
d = {'Surface':l[0], 'POS1':l[1], 'POS2':l[2], 'BaseForm':l[7]}
diclist.append(d)
return(diclist)
Il fera beau, demain. Cliquez ici lorsque défini dans l'argument
import MeCab
import re
#Créez une instance MeCab. Si aucun argument n'est spécifié, il devient un dictionnaire IPA.
m = MeCab.Tagger('')
#Une fonction qui analyse morphologiquement le texte et renvoie une liste de dictionnaires
def get_diclist(text):
parsed = m.parse(text) #Résultat de l'analyse morphologique (obtenu sous forme de chaîne de caractères avec sauts de ligne)
lines = parsed.split('\n') #Lister les résultats de l'analyse séparément pour chaque ligne (1 mot)
lines = lines[0:-2] #Les deux dernières lignes sont inutiles, supprimez-les
diclist = []
for word in lines:
l = re.split('\t|,',word) #Parce que chaque ligne est séparée par une tabulation et une virgule
d = {'Surface':l[0], 'POS1':l[1], 'POS2':l[2], 'BaseForm':l[7]}
diclist.append(d)
return(diclist)
get_diclist("Il fera beau, demain.")
Cette fois, nous utiliserons le mot table de correspondance de polarité d'émotion comme dictionnaire de polarité.
Ceci attribue des nombres réels de -1 à +1 en référence au "Dictionnaire japonais Iwanami (Iwanami Shoten)".
Plus il est proche de -1, plus il est négatif Plus il est proche de +1, plus il est positif.
Ensuite, lisez le dictionnaire de polarité Créez des listes et des dictionnaires.
#word_list, pn_Stockez respectivement Word et PN dans le type de liste.
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_mot comme dict_list, pn_Créez un dictionnaire qui stocke la liste.
pn_dict = dict(zip(word_list,pn_list))
L'implémentation consiste à se référer au dictionnaire de polarité et à renvoyer la valeur PN.
Aussi Passez get_diclist ("Ça ira bien demain") à la fonction add_pnvalue pour voir comment cela fonctionne Nous le passons également à la fonction get_mean pour connaître la moyenne des valeurs PN.
import numpy as np
def add_pnvalue(diclist_old, pn_dict):
diclist_new = []
for word in diclist_old:
base = word['BaseForm'] #Obtenez le formulaire de base à partir de dictionnaires individuels
if base in pn_dict:
pn = float(pn_dict[base])
else:
pn = 'notfound' #Si le mot ne figure pas dans la table PN
word['PN'] = pn
diclist_new.append(word)
return(diclist_new)
#Calculez la valeur moyenne PN de chaque tweet
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("Il fera beau, demain.")
# get_diclist("Il fera beau, demain.")La fonction ajouter_Passez-le à pnvalue pour voir comment cela fonctionne.
dl_new = add_pnvalue(dl_old, pn_dict)
print(dl_new)
#Faites-en également une fonction get_Transmettez-le à un moyen de connaître la moyenne des valeurs PN.
pnmean = get_mean(dl_new)
print(pnmean)
Le changement de la valeur PN est affiché dans un graphique.
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_Créez une liste vide appelée liste et trouvez la valeur moyenne de chaque 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')
#Tracez la date sur l'axe des x et la valeur PN sur l'axe des y.
x = df_tweets.index
y = df_tweets.pn
plt.plot(x,y)
plt.grid(True)
# df_tweets.df avec le nom csv_Veuillez renvoyer les tweets.
df_tweets.to_csv('./6050_stock_price_prediction_data/df_tweets.csv')
En regardant les résultats du graphique, il semble qu'il y ait de nombreuses valeurs négatives dans l'ensemble.
C'est parce que le dictionnaire polaire contient beaucoup de vocabulaire avec des implications négatives. Standardisez pour ajuster ce résultat.
Standardiser la valeur PN En outre, modifiez le PN à la moyenne pour chaque date et tracez-le.
# means_Liste standardisée, x_Sortie comme std
df_tweets['pn'] = (df_tweets['pn'] - df_tweets['pn'].mean()) / df_tweets['pn'].std()
#En outre, modifiez le PN à la moyenne pour chaque date et tracez-le.
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