見出し画像

米国株で学ぶ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 はネットから情報をダウンロードする (スクレイピング) によく使われるツールです。




これ以降のコードの中身部分は、素直に上から解説してもよく分からないような気がします。

どこから解説していくのがいいかとか考えたり、コードの中身を全てしっかり理解するのは正直かなり大変です。

今後この解説記事書くにあたって、もうちょっと気合い入れますので時間かかるかもしれません。


徐々に書いていきますが、気長にお待ちください。


それではまた!

ここから先は

0字

¥ 500

この記事が気に入ったらサポートをしてみませんか?