米国株で学ぶPython 2-1
みなさんこんにちは。エビと申します。
大変お待たせいたしました。ついに!今回は実際のコードの解説に入っていこうと思います。
今回解説させていただくのは、カフェモカさんの書かれた
カップウィズハンドル判定プログラムです!
カフェモカさんより解説記事を出す許可を頂いております。
この場を借りてお礼申し上げます。
上の元記事カンタンな解説は書いてありますので、まずは元記事を参照ください。
元記事を読んで、こんなコード書いてみたい!とか、どんな構造なの?という方は、引き続きこちらの記事を読んでいただけると幸いです。
それでは中身に入っていきましょう!!!
あらためてカフェモカさんのコードと必要ファイルを載せておきます。
# -*- coding: utf-8 -*-
import os
import time
import schedule
import datetime
import requests
from bs4 import BeautifulSoup
from requests_html import HTMLSession
import numpy as np
import xlwings as xw
import glob
from concurrent.futures import ThreadPoolExecutor
from selenium import webdriver
import csv
symbol = np.full((5000),"------")
ch = np.full((5000),0)
r = np.full((5000),-9999.0)
p = np.full((5000),-9999.0)
wh52 = np.full((5000),-9999.0)
dwh52 = np.full((5000),250)
dath = np.full((5000),250)
dpivot = np.full((5000),250)
pivot = np.full((5000),-9999.0)
pflg = np.full((5000),0)
def wh52check(i):
cnt = 0
hcnt = 0
with open('C:\\Users\\tmp\\python\\dailychartdownload\\'+str(symbol[i])+'.csv') as w:
wreader = csv.reader(w)
for wrow in wreader:
cnt += 1
if cnt > 253:
hcnt = cnt-251
else:
hcnt = 2
scnt = cnt
wh52[i] = 0
cnt = 0
high = 0
with open('C:\\Users\\tmp\\python\\dailychartdownload\\'+str(symbol[i])+'.csv') as h:
hreader = csv.reader(h)
for hrow in hreader:
cnt += 1
if hrow[2][len(hrow[2])-1].isdecimal() is True:
if float(hrow[2]) > high:
high = float(hrow[2])
if cnt >= hcnt and float(hrow[2]) > wh52[i]:
wh52[i] = float(hrow[2])
dwh52[i] = scnt-cnt
if dwh52[i] <= 35 and wh52[i] >= high*0.99:
dpivot[i] = dwh52[i]
pivot[i] = wh52[i]
if dwh52[i] >= 10:
pflg[i] = 1
if dwh52[i] > 35 and wh52[i] >= high*0.99:
low = 99999
dlow = 0
cnt = 0
with open('C:\\Users\\tmp\\python\\dailychartdownload\\'+str(symbol[i])+'.csv') as p:
preader = csv.reader(p)
for hrow in preader:
cnt += 1
if cnt >= scnt - dwh52[i]:
if hrow[3][len(hrow[3])-1].isdecimal() is True:
if float(hrow[3]) < low:
dlow = scnt-cnt
low = float(hrow[3])
cnt = 0
with open('C:\\Users\\tmp\\python\\dailychartdownload\\'+str(symbol[i])+'.csv') as p:
preader = csv.reader(p)
for hrow in preader:
cnt += 1
if cnt >= scnt - dlow:
if hrow[2][len(hrow[2])-1].isdecimal() is True:
if float(hrow[2]) > pivot[i]:
dpivot[i] = scnt-cnt
pivot[i] = float(hrow[2])
plow = 99999
cnt = 0
with open('C:\\Users\\tmp\\python\\dailychartdownload\\'+str(symbol[i])+'.csv') as p:
preader = csv.reader(p)
for hrow in preader:
cnt += 1
if cnt >= scnt - dpivot[i]:
if hrow[3][len(hrow[3])-1].isdecimal() is True:
if float(hrow[3]) < plow:
plow = float(hrow[3])
if low >= wh52[i]*0.67 and dpivot[i] >= 10 and dpivot[i] <= int(dwh52[i]*0.5) and pivot[i] >= wh52[i]*0.9 and plow > 0.5*(pivot[i]+low):
pflg[i] = 2
def is_num(s):
try:
float(s)
except ValueError:
return False
else:
return True
def bot():
print("CWHcheck start")
i = 0
if(os.path.exists('C:\\Users\\tmp\\python\\pythonv3\\input.csv')):
with open('C:\\Users\\tmp\\python\\pythonv3\\input.csv', 'r', encoding='shift-jis') as fin:
for line in fin.readlines():
i += 1
toks = line.split('~')
symbol[i] = toks[0]
nsym = i
i = 0
if(os.path.exists('C:\\Users\\tmp\\python\\pythonv3\\52whl.csv')):
with open('C:\\Users\\tmp\\python\\pythonv3\\52whl.csv', 'r', encoding='shift-jis') as fin:
for line in fin.readlines():
i += 1
toks = line.split('~')
wh52[i] = float(toks[2])
ns2 = list(np.arange(1,nsym+1))
# Webページを取得して解析する
#========計算処理========
print('wh52check')
with ThreadPoolExecutor(4) as e:
ret = e.map(wh52check, ns2)
#=======================
f = open("C:\\Users\\tmp\\python\\pythonv3\\d52wh.csv", 'w', encoding='shift-jis')
for jj in range(1,nsym+1):
f.write(str(symbol[jj])+','+str(dwh52[jj])+','+str(dath[jj])+'\n')
f.close()
f = open("C:\\Users\\tmp\\python\\pythonv3\\pivot.csv", 'w', encoding='shift-jis')
for jj in range(1,nsym+1):
f.write(str(symbol[jj])+','+str(pflg[jj])+','+str(pivot[jj])+','+str(dpivot[jj])+'\n')
f.close()
if __name__ == '__main__':
bot()
必要ファイルがこちらです。↓
CWHcheck.py は上記の内容のコードファイル、52whl.csv は52week high and low の略でfinviz というサイトから引用 しているそうです。(スクレイピングという手法を用いていると予想されます。)
input.csv はfinvizから引用した、銘柄の個別データになります。
カフェモカさんの以下の記事で取得方法がありました。
※ご本人の記事にこのように記載がありましたが、購入される際にはご本人に確認の上購入のほどよろしくお願いします。
AAPL.csv は銘柄の始値終値などの取得したデータで、yahoo finance から引用されています。分析したい銘柄のデータがそれぞれ必要となります。今回は例としてAAPLを利用しているそうです。
各ファイルが揃ったところで、コードの解説に参りましょう。
# -*- coding: utf-8 -*-
import os
import time
import schedule
import datetime
import requests
from bs4 import BeautifulSoup
from requests_html import HTMLSession
import numpy as np
import xlwings as xw
import glob
from concurrent.futures import ThreadPoolExecutor
from selenium import webdriver
import csv
まずはこの辺りから。
①コメントアウト
# の付いた列はコメントアウトと言います。コードの実行には関係なく、自分や他の人が読んだ時に分かりやすいように言葉を入れることが出来ます。
今回は# coding utf-8 となっていますね。
ここでutf-8を詳しく解説はしませんが、パソコンの文字認識システムの一つ的な解釈で良いと思います。パソコンは0と1しか認識できませんが、そんな中で文字を認識させるためのシステムのようなものです。
②import
次にimport です。import 〇〇 がたくさんありますね。ここで〇〇に入るのはライブラリとかモジュールとか呼ばれますが、要は便利ツールです。
一番上のimport os というのは os モジュールを使いますよーと言っているイメージですかね。
osやtime, schedule などたくさんの便利ツールを使用していますね。
import A
import B as C
from D import E
はどれも便利ツールを使う宣言と思っていただいて良いと思います。
import A は Aに含まれるもの全てを読み込みます。
import B as C はBをCという名前で読み込むということです。
import numpy as np のように、numpy というツールをコード内で np という名前で使いますという宣言です。コードの中で出てくる np という言葉はnumpyの中の機能使ってますってことです。datetime を dt にしたり、schedule をsd にしても構いません。
from D import E は Dの一部を読み込む宣言です。今回はseleniumとかいろんなのに使われてますね。selenium はネットから情報をダウンロードする (スクレイピング) によく使われるツールです。
これ以降のコードの中身部分は、素直に上から解説してもよく分からないような気がします。
どこから解説していくのがいいかとか考えたり、コードの中身を全てしっかり理解するのは正直かなり大変です。
今後この解説記事書くにあたって、もうちょっと気合い入れますので時間かかるかもしれません。
徐々に書いていきますが、気長にお待ちください。
それではまた!
ここから先は
¥ 500
この記事が気に入ったらサポートをしてみませんか?