Hier mal das Script, nix professionelles, aber es funktioniert.
Code: Alles auswählen
import multiprocessing
import xml.etree.ElementTree as ET
import datetime as dt
from datetime import date
from ib_insync import *
import requests
import requests_cache
import pandas as pd
import pandas_datareader as pdr
from pandas_datareader._utils import RemoteDataError
import yfinance as yf
import time
ib = IB()
ib.connect('127.0.0.1', 7496, clientId=12)
expire_after = dt.timedelta(days=3)
session = requests_cache.CachedSession(cache_name='cache', backend='sqlite',expire_after=expire_after)
yf.pdr_override()
start_date = '01-01-2021'
end_date = '07-01-2021'
start = dt.datetime.strptime(start_date, '%d-%m-%Y')
def pack1():
list = pd.read_csv("watch.csv", usecols=['Ticker', 'Name', 'Price', 'Change', 'Cap', 'EPS'])
rows = len(list.index)
while True:
for i in range(0, rows):
try:
ticker = list['Ticker'].values[i]
quote_url = 'https://query1.finance.yahoo.com/v7/finance/quote?symbols='+ticker
quote_req = requests.get(quote_url)
change = round(quote_req.json()['quoteResponse']['result'][0].get('regularMarketChangePercent', 0),2)
price = round(quote_req.json()['quoteResponse']['result'][0].get('regularMarketPrice', 0),2)
if 'epsCurrentYear' in quote_req.json()['quoteResponse']['result'][0]:
eps = round(quote_req.json()['quoteResponse']['result'][0].get('epsCurrentYear', 0),2)
else:
eps = '0'
cap = round(quote_req.json()['quoteResponse']['result'][0].get('marketCap', 0)/1000000000, 2)
time.sleep(1)
print(ticker,change,price,cap)
list.at[i, 'Price'] = price
list.at[i, 'Change'] = change
list.at[i, 'Cap'] = cap
list.at[i, 'EPS'] = eps
except KeyError as ke:
print(ke)
pass
except TypeError as te:
print(te)
pass
except RemoteDataError as rde:
print(rde)
pass
list.to_csv('pack1.csv', header=True, index=False)
time.sleep(600)
def pack2():
list = pd.read_csv("watch.csv", usecols=['Ticker', 'Volumen', '52Whigh', '52Wlow'])
rows = len(list.index)
while True:
for i in range(0, rows):
try:
ticker = list['Ticker'].values[i]
url_cap = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/'
url_cap2 = '?formatted=true&crumb=8ldhetOu7RJ&lang=en-US®ion=US&modules=summaryDetail&corsDomain=finance.yahoo.com'
cap_url = url_cap + ticker + url_cap2
req_cap = requests.get(cap_url)
volume = req_cap.json()['quoteSummary']['result'][0]['summaryDetail']['volume'].get('raw', 0)
high = req_cap.json()['quoteSummary']['result'][0]['summaryDetail']['fiftyTwoWeekHigh'].get('raw', 0)
low = req_cap.json()['quoteSummary']['result'][0]['summaryDetail']['fiftyTwoWeekLow'].get('raw', 0)
time.sleep(1)
print(ticker,volume,high,low)
list.at[i, 'Volumen'] = volume
list.at[i, '52Whigh'] = round(high, 2)
list.at[i, '52Wlow'] = round(low, 2)
except KeyError as ke:
print(ke)
pass
except TypeError as te:
print(te)
pass
except RemoteDataError as rde:
print(rde)
pass
list.to_csv('pack2.csv', header=True, index=False, columns=['Ticker', 'Volumen', '52Whigh', '52Wlow'])
time.sleep(180)
def rating():
list = pd.read_csv("watch.csv", usecols=['Ticker', 'Rating'])
rows = len(list.index)
while True:
for i in range(0, rows):
try:
ticker = list['Ticker'].values[i]
rat1_url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/'
rat2_url = '?formatted=true&crumb=swg7qs5y9UP&lang=en-US®ion=US&' \
'modules=upgradeDowngradeHistory,recommendationTrend,' \
'financialData,earningsHistory,earningsTrend,industryTrend&' \
'corsDomain=finance.yahoo.com'
rat_url = rat1_url + ticker + rat2_url
rat_req = requests.get(rat_url)
rating = rat_req.json()['quoteSummary']['result'][0]['financialData'].get('recommendationKey', 'None')
time.sleep(1)
print(ticker,rating)
list.at[i, 'Rating'] = rating
except KeyError as ke:
print(ke)
pass
except TypeError as te:
print(te)
pass
except RemoteDataError as rde:
print(rde)
pass
list.to_csv('rating.csv', header=True, columns=['Ticker', 'Rating'])
time.sleep(86400)
def rsi():
list = pd.read_csv("watch.csv", usecols=['Ticker', 'RSI'])
rows = len(list.index)
while True:
for i in range(0, rows):
try:
ticker = list['Ticker'].values[i]
rsi = pdr.get_data_yahoo(ticker, dt.datetime(2021, 5, 1), dt.datetime.now(),session=session)
delta = rsi['Close'].diff()
up = delta.clip(lower=0)
down = -1 * delta.clip(upper=0)
ema_up = up.ewm(com=13, adjust=False).mean()
ema_down = down.ewm(com=13, adjust=False).mean()
rs = ema_up / ema_down
rsi['RSI'] = 100 - (100 / (1 + rs))
rsi_value = rsi.iloc[-1]['RSI']
list.at[i, 'RSI'] = round(rsi_value, 2)
print(ticker,rsi_value)
except KeyError as ke:
print(ke)
pass
except TypeError as te:
print(te)
pass
except RemoteDataError as rde:
print(rde)
list.at[i, 'RSI'] = '0'
pass
list.to_csv('rsi.csv', header=True, index=False, columns=['Ticker', 'RSI'])
print('RSI CSV written')
time.sleep(1800)
def sma():
list = pd.read_csv("watch.csv", usecols=['Ticker', 'SMA200'])
rows = len(list.index)
while True:
for i in range(0, rows):
try:
ticker = list['Ticker'].values[i]
sma = pdr.get_data_yahoo(ticker, dt.datetime(2020, 5, 1),session=session)
#sma = yf.download(ticker, dt.datetime(2020, 5, 1))
sma['SMA10'] = sma['Close'].rolling(10).mean()
sma['SMA50'] = sma['Close'].rolling(50).mean()
sma['SMA200'] = sma['Close'].rolling(200).mean()
sma_value = sma.iloc[-1]['SMA200']
print(ticker, sma_value)
list.at[i, 'SMA200'] = round(sma_value, 2)
#time.sleep(1)
except KeyError as ke:
print(ke)
pass
except TypeError as te:
print(te)
pass
except RemoteDataError as rde:
print(rde)
pass
list.to_csv('sma.csv', header=True, index=False, columns=['Ticker', 'SMA200'])
time.sleep(180)
def stoch():
list = pd.read_csv("watch.csv", usecols=['Ticker', 'Stoch'])
rows = len(list.index)
while True:
for i in range(0, rows):
try:
ticker = list['Ticker'].values[i]
stoch = pdr.get_data_yahoo(ticker, dt.datetime(2021, 5, 1), dt.datetime.now(),session=session)
stoch['14-high'] = stoch['High'].rolling(14).max()
stoch['14-low'] = stoch['Low'].rolling(14).min()
stoch['%K'] = (stoch['Close'] - stoch['14-low']) * 100 / (stoch['14-high'] - stoch['14-low'])
stoch['%D'] = stoch['%K'].rolling(3).mean()
stoch2 = stoch.iloc[-1]['%D']
list.at[i, 'Stoch'] = round(stoch2, 2)
print(ticker,stoch2)
except KeyError as ke:
print(ke)
pass
except TypeError as te:
print(te)
pass
except RemoteDataError as rde:
print(rde)
pass
list.to_csv('stoch.csv', header=True, index=False, columns=['Ticker', 'Stoch'])
time.sleep(180)
def earnings_iv():
list = pd.read_csv("watch.csv", usecols=['Ticker', 'Earnings', 'IV'])
rows = len(list.index)
while ib.isConnected():
for i in range(0, rows):
try:
ticker = list['Ticker'].values[i]
contract = Stock(ticker, 'SMART', 'USD')
ib.reqMarketDataType(1)
ib.qualifyContracts(contract)
data = ib.reqMktData(contract, "106,100", False, False)
ib.sleep(1)
iv = round(data.impliedVolatility * 100, 2)
earn = ib.reqFundamentalData(contract, 'CalendarReport')
if type(earn) == str:
tree = ET.ElementTree(ET.fromstring(earn))
root = tree.getroot()
item = tree.find('.//Date')
earnings = item.text
else:
earnings = '01/01/2000'
print(ticker, earnings,iv)
list.at[i, 'Earnings'] = earnings
list.at[i, 'IV'] = iv
ib.cancelMktData(contract)
except KeyError as ke:
print(ke)
pass
except TypeError as te:
print(te)
pass
ib.disconnect()
list.to_csv('earnings_iv.csv', header=True, index=False, columns=['Ticker', 'Earnings', 'IV'])
time.sleep(86400)
def main():
p1 = multiprocessing.Process(target=rsi)
p2 = multiprocessing.Process(target=sma)
p3 = multiprocessing.Process(target=stoch)
p4 = multiprocessing.Process(target=rating)
p5 = multiprocessing.Process(target=pack1)
p6 = multiprocessing.Process(target=pack2)
p7 = multiprocessing.Process(target=earnings_iv)
p1.start()
p2.start()
p3.start()
p4.start()
p5.start()
p6.start()
p7.start()
if __name__ == "__main__":
main()