3.「t08-ボリンジャーバンド」を改善して多数銘柄を連続して解析する方法

(2008年3月8日 16:44  AUさんからの質問)
井領さんの作られたKIkabu Mには大変お世話になっています。 今回、私もスクリーニングできるプログラムを作りたいと考えているのですが、今回発売された書籍を購読したら可能かどうか教えていただきたいと存じます。ちなみにプログラム経験は昔学校でかじった事がある程度であまり自身はありません。

内容:上場している全銘柄の株価を抽出し、ボリンジャーバンドの値を2週間分くらい計算したいと思っています。(特に株価を表示したりしたいとは考えていません。)
もし、可能なら抽出作業にはどれほどの時間がかかるのでしょうか?PCはPentium4 3.2G です。  もしよろしければ、ご回答よろしくお願いします。


<回答>
今回発売の本についているCD-ROMのサンプルマクロを途中で止める等して どのステータスで何をしているか勉強すればボリンジャーバンドでの解析は マスター出来ると思います。但しその場合もマクロのデバッグでありマクロの 基礎知識の本を一回は読んでいないと難しいと思います。 (なお昔N-BASICでプログラムを組んだことがある方でしたら、同じBASICであり理解できると思います)

なお、今回の本は1銘柄解析のサンプであり、上場している多数銘柄の連続解析例 はないので、これもそれなりにマクロが理解できないと自分では組めません。
もっと親切な回答を書きたいのですが、正直レベルで記述すると以上になります。

<再回答および類似質問に対する回答準備>
前回の回答は何となく誠意が感じられない回答だったので、本を買って欲しいと言う下心を少し入れた別の回答を以下に考えた。
この本はVBAの基礎知識がある方を対象にしており、一度は入門書を読む等多少のVBAの知識がないと理解できないと思います。但しマクロの自動記録が出来る等多少でも触ったことがある方なら、VBAスキルアップの早道は人の作ったマクロを見ることでありこの本は全サンプルソース公開であり勉強の資料として役立つと思います。

なお、上場している全銘柄の株価を抽出し、ボリンジャーバンドで解析する件は今回の本に多数銘柄を解析する方法の記載がないので以下に多数銘柄をボリンジャーバンドで解析する方法を説明します。概略理解できれば自分で組み直すことが出来ると思います。

(1)概略
・「t11-今日の値動き」の銘柄リストの取り込みプロシージャを、「t08-ボリンジャーバンド」に貼り付け連続で多数銘柄の解析を実行します。最終的な全銘柄の解析結果をまとめるマクロ例も合わせて紹介します。


(2)「t08-ボリンジャーバンド」UserForm1モジュールの変更
t08-ボリンジャーバンドのユーザーフォームの「データ取得&解析」ボタンをそのまま使用するが、 実行するプロシージャは下記のように変更のこと。(銘柄リスト作成は(4)項で説明)

Private Sub cmb1_Click()
      ' Call download  'こちらを消して下記を追加
     Call 銘柄リスト作成
End Sub

(3)「t08-ボリンジャーバンド」Module1の変更
・下記の灰色文字を削除(ここではブックの追加を行わない)、ピンク色はそのまま
・下記の赤色文字を追加する(多数銘柄の連続実行であり、シート名を銘柄コードにする)

Sub download()
Application.ScreenUpdating = False

'シートの種類チェックと画像削除
On Error Resume Next
    If ActiveSheet.Type <> xlWorksheet Then
        Workbooks.Add
    Else
       Sheets.Add
       For Each sheet_name In Worksheets
            If sheet_name.Name = ("時系列株価") Then
                Worksheets("時系列株価").Select
                Application.DisplayAlerts = False
                    ActiveWindow.SelectedSheets.Delete
                Application.DisplayAlerts = True
                    
            End If
        Next
    End If
On Error GoTo 0
Sheets.Add.Name = "時系列株価"

Sheets.Add.Name = "(" & zno + 1 & ")" & dat2(zno, 0) '変更

datbook = ActiveWorkbook.Name
UserForm1.txt1.Text = ""
 ・
 ・

(4)「t08-ボリンジャーバンド」へModule2を追加
・シートを追加して、このシートに新規の制御関係を記載する。
・追加方法は、Visual Basic Editor画面メニューの「挿入」「標準モジュール」をクリック (本ケースではModule2が追加される)
・そこに「t11-今日の値動き」のプロシージャ「銘柄リスト作成」を貼り付ける。
・貼り付け後の改造は下記を参照。追加(赤色)、削除(灰色)、一部変更(緑色)、そのまま(ピンク)。

Public dat2() As String      '表示銘柄datはModule1で使用済みでダブルのでこちらは2を付けた
Public zno As Integer        '自動実行No
Public zsu As Integer        '自動実行数量
Public datbook As String     '追加ブック名

Sub 銘柄リスト作成()

ReDim dat2(3000, 1) As String  ’dat → dat2 

If UserForm1.txt1.Text <> "" Then
    Call 銘柄1個
    Exit Sub
End If

If UserForm1.txt3.Text <> "" Then
   ' Call 銘柄1個
   zsu = 0
    dat2(0, 0) = UserForm1.txt3.Text 
    Call 連続実行
    Exit Sub
End If

'ファイル指定
 flt$ = "txtファイル(*.txt),*.txt"
fff = Application.GetOpenFilename(flt$, , Title:="txtファイル指定")

If fff = "False" Then
      MsgBox "銘柄コード記載のtxtファイルを指定して下さい"
      Exit Sub
End If

'Call シート追加

 ・・・略・・

    Input #1, dat2(i, 0), dat2(i, 1)  ’dat → dat2 
・・・略・・

'Range(Cells(2, 1), Cells(i + 1, 2)).Value = dat
'Call 不用シート削除
'UserForm1.Label2.Caption = fff & "から[" & i & "]件取り込みました"

UserForm1.txt1.Text = fff & "から[" & i & "]件取り込みました"
zsu = i - 1

Call 連続実行    '新規追加

Exit Sub
rest:
 ・・・略 ・・・
End Sub
’------------------------------------------------------------------------------------

Sub 連続実行()

'ブック追加
Workbooks.Add
datbook = ActiveWorkbook.Name

For zno = 0 To zsu
    Application.StatusBar = "解析実行中---" & zno + 1 & "/" & zsu + 1
    
    UserForm1.txt3.Text = dat2(zno, 0)  ’配列のデータをテキストボックスへ記入
    Windows(datbook).Activate      
    
    Call download           ’データ取得&ボリンジャーバンドで解析

    ActiveSheet.Move After:=Worksheets(Worksheets.Count)  ’追加シートを最終へ

    Application.ScreenUpdating = True   ’取りあえず実行結果を見る
    Application.ScreenUpdating = False
Next

Call 不用シート削除            

Application.StatusBar = "解析実終了"
End Sub

(5) 追加したModule2へ結果集計を追加
・下記のプロシージャをModule2へ貼り付けて下さい。
・これを実行で下図のようにメッセージボックスへ抽出結果を表示します。
・このプロシージャはスタートボタンを付けてないので、解析終了後にメニューの「ツール」から実行して下さい。
・スタートボタン設定や(解析後に引き続き実施でもOK)、結果をシートへ表示に改善等は各自で行って下い。


Sub 連続解析()
Dim kaik(5) As String '買い結果
Dim urik(5) As String '売り結果

Application.ScreenUpdating = False
For Each sheet_name In Worksheets
        shname = sheet_name.Name
         
    If shname <> uksh Then
        Sheets(shname).Select
        For i = 0 To 4                   '5日間の場合
            If kaik(i) = "" Then
                 kaik(i) = Cells(i + 4, 1) & ": "
                 urik(i) = Cells(i + 4, 1) & ": "
            End If
        
            If Cells(i + 4, 7) = "買い検討" Then
                 kaik(i) = kaik(i) & "[" & shname & "] "
            End If
            If Cells(i + 4, 7) = "売り検討" Then
                 urik(i) = urik(i) & "[" & shname & "] "
            End If
        Next
    End If
Next
msg = kaik(0) & Chr(10) & kaik(1) & Chr(10) & _
        kaik(2) & Chr(10) & kaik(3) & Chr(10) & kaik(4)
kari = MsgBox(msg, 0, "買い抽出銘柄")

msg = urik(0) & Chr(10) & urik(1) & Chr(10) & _
        urik(2) & Chr(10) & urik(3) & Chr(10) & urik(4)
kari = MsgBox(msg, 0, "売り抽出銘柄")

End Sub

(5)「t08-ボリンジャーバンド」Module8
・ボリンジャーバンド解析&チャート作成の、このModule8に変更はありません。

<補足説明>
・このボリンジャーバンド作成のModule8をそのまま使用できると言うことは、他の解析ツールもそのまま使用
 出来ると言うことです。たとえば「一目均衡表」を多数銘柄連続で行いたい場合は、上記(2)〜(4)のマクロを
 そのまま使用し、Module1の実行するマクロ指定を、「Call ボリンジャーバンドST」を「Call 一目均衡」
 に変えるだけで実行できます。
・なお、事前準備としては、Module8をModule10(一目均衡表は10になっている)に変える以外に、各種パラメータ
 を設定してある「指標シート」も一目均衡表の記載があるシートにする必要があります。(一目均衡表を最後に
 作成した関係で、t10ツールの「指標シート」を使用すれば他の全ツールの記載があります)

【ホ−ム】