見出し画像

(文系のPython -完成版2) 決算結果を入力したらコンセンサス予想・決算結果・決算結果良し悪し判定・成長率をエクセルファイルに保存するプログラム

(目的)
決算結果出たときにさっと決算がよかったかどうかを確認し、データをエクセルファイルに保存する。

コマンドプロンプトに決算結果を打ち込み、Microsoft Excelに記録しておいたEPSコンセンサス予想、売上高コンセンサス予想、次期ガイダンスのコンセンサス予想(EPS, 売上高)と比較し、データをすべて別のエクセルファイルに保存する。

アウトプットは下記。

読み込み元シートは下記。

コマンドプロンプトには下記を出力。(補助的に)

(背景)
決算結果の良し悪しの基準はこれに基づいています。

(前提条件)
・Pythonをインストールしている
・コマンドプロンプトからpyファイルを呼び出せる
・BeautifulSoupを(pipで)インストールしている
・openpyxlを(pipで)インストールしている
・pprintを(pipで)インストールしている

(やり方)
まずは前回のところまでやる、のだけれど一応最初からポイントだけおさらい。

まずエクセルファイルからデータを読み込む

下準備。

import openpyxl
import re
import pprint

wb = openpyxl.load_workbook('sample2.xlsx')

# grab the active worksheet
ws = wb.active
dict = {}
outputList = []
inputList = []

セルA2以下が空欄(value ==None)になるまで続けるWhile True ループ。

cnt = 0
while True:
    if ws['A2'].offset(row=cnt, column=0).value == None:
        break

セルC2から右6つの値を取得し、リスト(outputListに入れる)

    for c in range(6):
        outputList.append(ws['C2'].offset(row=cnt, column=c).value)

A2とB2の値をつなげて辞書のキーとする。辞書の値はリストoutputListを入れる。入れ終わったらリストを空にする。

    key = str(ws['A2'].offset(row=cnt, column=0).value) + " -" + str(ws['B2'].offset(row=cnt, column=0).value)
    #同じキーが出てきたら、値が下のセルにアップデートされる。
    dict[key] = outputList
    outputList = []
    cnt += 1

コマンドプロンプトで値の入力を促す

Tik = input('input Ticker symbol:')
Qtr = input('input Quarter (MMM YYYY):')
key = Tik + " -" + Qtr

EPS = input('input reported EPS:')
Rev = input('input reported Revenue:')
EPS_g = input('input reported New EPS guidance (lower limit):')
Rev_g = input('input reported New Revenue guidance (lower limit):')

if文でインプットした値とエクセルから取ってきた値を比較し決算結果良し悪しの判断、および成長率の計算

try:
    if float(EPS) > dict[key][0]:
        EPSresult = 'GOOD'
        print("EPS is", EPSresult)
        score += 1
    else:
        EPSresult = 'BAD'
        print("EPS is", EPSresult)
except:
    pass

try:
    EPSgrowth = float(EPS) / dict[key][2] - 1
except:
    pass

try:
    if float(Rev) > float(re.sub(r"[BM]", "", dict[key][3])):
        REVresult = 'GOOD'
        print("Revenue is OK")
        score += 1
    else:
        REVresult = 'BAD'
        print("Revenue is bad")
except:
    pass

try:
    Revgrowth = float(Rev) / float(re.sub(r"[BM]", "", dict[key][5])) - 1
except:
    pass

try:
    if EPS_g == 'NA':
        EPS_g_result = "NA"
        print('New EPG guidance is NA')
    elif float(EPS_g) > dict[key][1]:
        print("New EPS guidance is OK")
        EPS_g_result = "GOOD"
        score += 1
    else:
        EPS_g_result = "BAD"
        print("New EPS guidance is bad")
except:
    pass

try:
    if Rev_g == 'NA':
        Rev_g_result = 'NA'
        print('New Revenue guidance is NA')
    elif float(Rev_g) > float(re.sub(r"[BM]", "", dict[key][4])):
        Rev_g_result = 'GOOD'
        print("New Revenue guidance is OK")
        score += 1
    else:
        Rev_g_result = 'BAD'
        print("New Revenue guidance is bad")
except:
    pass

if score == 4:
    Result = 'GOOD'
    print("Qtrly report result is", Result)
elif Rev_g_result == 'NA':
    Result = 'NA'
    print("Qtrly report result is", Result)
elif EPS_g_result == 'NA':
    Result = 'NA'
    print("Qtrly report result is", Result)
else:
    REsult = 'BAD'
    print("Qtrly report result is", Result)

エクセルに保存するデータをすべてリストinputListに入力

towb = openpyxl.load_workbook('checkqtrReport.xlsx')
#checkqtrReport.xlsxは事前に作っておく

# grab the active worksheet
tows = towb.active

#ひたすらリストに入れてく
inputList.append(Tik)
inputList.append(Qtr)
inputList.append(Result)
inputList.append(EPS)
inputList.append(dict[key][0])
inputList.append(EPSresult)
inputList.append('{:.2%}'.format(EPSgrowth))
inputList.append(Rev)
inputList.append(dict[key][3])
inputList.append(REVresult)
inputList.append('{:.2%}'.format(Revgrowth))
inputList.append(EPS_g)
inputList.append(dict[key][1])
inputList.append(EPS_g_result)
inputList.append(Rev_g)
inputList.append(dict[key][4])
inputList.append(Rev_g_result)


最後に、inputListの値を一個ずつエクセルに入力し、保存する。

まずはブランクのセルまで下に行く。

cnt = 0
while True:
    if tows['A2'].offset(row=cnt, column=0).value == None:
        break
    cnt += 1

で、A2からcnt分下に行ったセルから右にinputListの値を入れていく。

c = 0
for x in inputList:
    try:
        x = float(x)
    except:
        pass
    tows['A2'].offset(row=cnt, column=c).value = x
    c += 1

towb.save('checkqtrReport.xlsx')

おしまい。

改めてアウトプット(エクセル)。


コード全文。

import openpyxl
import re
import pprint

wb = openpyxl.load_workbook('sample2.xlsx')

# grab the active worksheet
ws = wb.active
dict = {}
outputList = []
inputList = []
cnt = 0
while True:
    if ws['A2'].offset(row=cnt, column=0).value == None:
        break
    for c in range(6):
        outputList.append(ws['C2'].offset(row=cnt, column=c).value)
    key = str(ws['A2'].offset(row=cnt, column=0).value) + " -" + str(ws['B2'].offset(row=cnt, column=0).value)
    #同じキーが出てきたら、値が下のセルにアップデートされる。
    dict[key] = outputList
    outputList = []
    cnt += 1

pp = pprint.PrettyPrinter(indent=3)
pp.pprint(dict)

Tik = input('input Ticker symbol:')
Qtr = input('input Quarter (MMM YYYY):')
key = Tik + " -" + Qtr

EPS = input('input reported EPS:')
Rev = input('input reported Revenue:')
EPS_g = input('input reported New EPS guidance (lower limit):')
Rev_g = input('input reported New Revenue guidance (lower limit):')

score = 0
print("")
try:
    if float(EPS) > dict[key][0]:
        EPSresult = 'GOOD'
        print("EPS is", EPSresult)
        score += 1
    else:
        EPSresult = 'BAD'
        print("EPS is", EPSresult)
except:
    pass

try:
    EPSgrowth = float(EPS) / dict[key][2] - 1
except:
    pass

try:
    if float(Rev) > float(re.sub(r"[BM]", "", dict[key][3])):
        REVresult = 'GOOD'
        print("Revenue is OK")
        score += 1
    else:
        REVresult = 'BAD'
        print("Revenue is bad")
except:
    pass

try:
    Revgrowth = float(Rev) / float(re.sub(r"[BM]", "", dict[key][5])) - 1
except:
    pass

try:
    if EPS_g == 'NA':
        EPS_g_result = "NA"
        print('New EPG guidance is NA')
    elif float(EPS_g) > dict[key][1]:
        print("New EPS guidance is OK")
        EPS_g_result = "GOOD"
        score += 1
    else:
        EPS_g_result = "BAD"
        print("New EPS guidance is bad")
except:
    pass

try:
    if Rev_g == 'NA':
        Rev_g_result = 'NA'
        print('New Revenue guidance is NA')
    elif float(Rev_g) > float(re.sub(r"[BM]", "", dict[key][4])):
        Rev_g_result = 'GOOD'
        print("New Revenue guidance is OK")
        score += 1
    else:
        Rev_g_result = 'BAD'
        print("New Revenue guidance is bad")
except:
    pass

if score == 4:
    Result = 'GOOD'
    print("Qtrly report result is", Result)
elif Rev_g_result == 'NA':
    Result = 'NA'
    print("Qtrly report result is", Result)
elif EPS_g_result == 'NA':
    Result = 'NA'
    print("Qtrly report result is", Result)
else:
    REsult = 'BAD'
    print("Qtrly report result is", Result)

#インプットの始まり

towb = openpyxl.load_workbook('checkqtrReport.xlsx')

# grab the active worksheet
tows = towb.active

#ひたすらリストに入れてく
inputList.append(Tik)
inputList.append(Qtr)
inputList.append(Result)
inputList.append(EPS)
inputList.append(dict[key][0])
inputList.append(EPSresult)
inputList.append('{:.2%}'.format(EPSgrowth))
inputList.append(Rev)
inputList.append(dict[key][3])
inputList.append(REVresult)
inputList.append('{:.2%}'.format(Revgrowth))
inputList.append(EPS_g)
inputList.append(dict[key][1])
inputList.append(EPS_g_result)
inputList.append(Rev_g)
inputList.append(dict[key][4])
inputList.append(Rev_g_result)

print(inputList)

cnt = 0
while True:
    if tows['A2'].offset(row=cnt, column=0).value == None:
        break
    cnt += 1

c = 0
for x in inputList:
    try:
        x = float(x)
    except:
        pass
    tows['A2'].offset(row=cnt, column=c).value = x
    c += 1

towb.save('checkqtrReport.xlsx')
ありがとうございます!褒められるって、うれしいですね。
3
1986年生まれ / シンガポール在住中
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。