ホームページの更新もブログの更新も、休んでいたのは、まったく個人的な理由からです。
信頼性を強く保てる株式ソフトの改変に没頭していました。原始に遡るならば遠く昭和の化石時代から小さな改変を加えるならばバージョンを重ねること何百回にもなるかもしれない自作のソフトです。
これが、会計ソフトや他のデータベースソフトの基本にもなりました。
数年前にそれなりに自信を持って改変したにもかかわらず、本心がかなり猜疑的なようだったのか、ご宣託のあった選択銘柄を完全に無視し「あでもないこうでもない」と画面とにらめっこしながら突入したマーケットで、刀折れ矢尽き果てる敗残の日々に勤しんでいました。
しかし、崖っぷちの四面楚歌に陥った今日、起死回生の手を尽くさねばと、ホームページもブログもいつものように犠牲にし、一日1パーセントの利益確保を心がけることにしました。
そして、手堅く動かせるソフトへと全面的に改変していました。ようやく、本日、全データを本格変換するソフトとして起動させましたので、一息ついたところです。
ただ今、コンピ連合が楽しそうに2005年からの日々のデータを変換しています。ひょっとすると数日後にまた全部やり直しするかもしれないのに、この快調な動きに水を差さないようにブログの更新に来ました。
プログラムの構成に関しては、作る人によって様々です。ここで記載したプログラムは、株式だけのみならず、会計や住所録などのデータ記録にも応用したものです。
私の経験から言えることは、簡単な変数名、例えばA$とか安易につけないほうが良いようですね。プログラムを改変するにしたがって変数が多くなるので、見てすぐわかるような変数名、例えば、hajime(始値)とかにすることで、どこで何を使うかの時にもんぞり打たなくて済みます・・・たぶん。
ここに例示したコードのKWZやUWZなどそのときの思いつきで付けているので、改変するたびにどういう意味だったのか何度探ったことでしょう。一発変換で、変数名を変えられるるけれど、後で更に困りそうなので変えるに変えれずです。
仮に販売など配布する場合でも中身を見られないように実行ファイルにするのだから、作った本人がわかるようにしておかないと泣きを見ますね。解かりやすい変数名にしたとしても、プログラムの動作を左右はしません。
このサブプログラムを作るまで、会社四季報から必要なデータを入力するのに1週間以上も要していました。それが、ヤフーの企業情報から収集してエクセルファイルを作ってくれるので、情報収集から個別銘柄への格納まで、10分ほどに。
もっとも、このサブプログラムはデータ変換に欠かせないので最初から作って動作させていたのだけれど、僅か10行ほどの追加に数年も躊躇していたことになりました。
順調に動いてくれるものだから、ひと月、ふた月分を変換させては、気に入らないと全てを初期化し全銘柄の格納庫を作り直させて楽しんでいます。手入力で味わえない高速の利点でもありますね。
ビジュアル・ベーシックでの銘柄データ保管庫作成部分コード例
Sub DataHenkan2008()
* 変数は、全て任意。ビジュアル・ベーシックの動作コードにかからないものを設定。
Dim J As Integer
Dim DataCode$(6000), DataName$(6000)
Dim DataKabusu(6000) As Currency
Dim DataHaito(6000), DataRieki(6000), DataShisan(6000) As Double
Dim DataTuki(6000), DataGyosyu(6000), DataItiba(6000), DataTanni(6000) As Integer
Dim I, U, JKL, HLP(600), DF(600), BS2(600) As Integer
Dim C1$, DB$, DHH$, HH$, HH2$
Dim KE11, KE21, KE31, KE41, FK1 As Double
Dim KS1, HP1, LP1, KSH11, KSH21, DH2 As Long
Dim DBC As Long
* ここで収集した個別銘柄の基本データの変換準備。
JKL = 0
Open "C:\*○○○○\DBKanri\銘柄データ.CSV" For Input As #3
For I = 1 To 6000
If EOF(3) Then JKL = I: GoTo 5
Input #3, DataCode$(I), DataItiba(I), DataName$(I), DataKabusu(I), DataHaito(I), DataRieki(I), DataShisan(I), DataTuki(I), DataTanni(I), DataGyosyu(I)
Next I
5:
Close #3
* ここから、個別銘柄の格納庫を作成する。個別銘柄格納庫では、すでに銘柄リストファイルの読み込み済みが前提。
For J = 1 To Kasu
For U = J To JKL
If DataCode$(U) = HC$(J) Then BaiTan = BaiTanni(J): GoSub 7
Next U
Next J
GoTo 500
7:
HH2$ = Str$(J)
HH$ = " " + HH2$ + " 件目の " + DataCode$(J) + " を変換中です。"
Form**.Caption = HH$
A$ = DataCode$(J)
B$ = DataName$(J)
If BaiTan = 1 Then If DataKabusu(J) < 10000000 Then KS = DataKabusu(J): GoTo 8
If BaiTan = 1 Then If DataKabusu(J) >= 10000000 Then KS = DataKabusu(J) / 1000: GoTo 8
If BaiTan = 1000 Then KS = DataKabusu(J) / 1000: GoTo 8
If BaiTan >= 100 Then If BaiTan <= 999 Then KS = DataKabusu(J) / 100: GoTo 8
If BaiTan >= 10 Then If BaiTan <= 99 Then KS = DataKabusu(J) / 10
8:
KS = DataKabusu(J)
FK = 15
KE1 = DataRieki(J)
KE2 = KE1
KE3 = KE1
KE4 = KE1
HP = 1000
LP = 1000
KSH = DataShisan(J)
KSH2 = KSH
Haito0 = DataHaito(J)
Haito1 = Haito0
Haito2 = Haito0
KesanTuki = DataTuki(J)
GSP = DataGyosyu(J)
15:
* ここから、個別銘柄のランダムファイル格納庫コード。
* 銘柄コード別にフォルダを設定している。A$とは、個別銘柄の証券コード。
DBC = Val(A$)
If DBC < 2000 Then DB$ = "DB1000\" + C1$
If DBC > 1999 Then If DBC < 3000 Then DB$ = "DB2000\" + C1$
If DBC > 2999 Then If DBC < 4000 Then DB$ = "DB3000\" + C1$
If DBC > 3999 Then If DBC < 5000 Then DB$ = "DB4000\" + C1$
If DBC > 4999 Then If DBC < 6000 Then DB$ = "DB5000\" + C1$
If DBC > 5999 Then If DBC < 7000 Then DB$ = "DB6000\" + C1$
If DBC > 6999 Then If DBC < 8000 Then DB$ = "DB7000\" + C1$
If DBC > 7999 Then If DBC < 9000 Then DB$ = "DB8000\" + C1$
If DBC > 8999 Then DB$ = "DB9000\" + C1$
* 基本的には、Cドライブに株式データ庫を設定する。\○○○○\は、私のソフトのフォルダー名のため、明記しない。
データ格納可能数。日足データは600件。週足データと月足データは、それぞれ300件。スタートポジションは、日足=1、週足=601、月足=901。個別銘柄の基本データは、ポジション1201から1210に格納。
' 日変換
K = 0
Fnum = FreeFile
Pos = 0
If K > 0 Then DH = 1
For I = 0 To K
Pos = Pos + 1
DHH$ = YY(I) + MM(I) + DD(I)
DH2 = Val(DHH$)
If I > 1 Then If YY(I) = "" Then DH2 = 19991116
Rec.YMD = DH2
Rec.Hajime = D2(I)
Rec.Takane = D3(I)
Rec.Yasune = D4(I)
Rec.Owarine = D5(I)
Rec.Dekidaka = D6(I)
Rec.UpE = UE(I)
Rec.DnE = KE(I)
Rec.UK = UKC$(I)
Rec.KWZ = 0
Rec.UWZ = 0
Length = LenB(Rec)
Open "C:\○○○○\" + DB For Random As #Fnum Len = Length
Put #Fnum, Pos, Rec
Close #Fnum
Next I
DW = Pos
DC = K
週変換・月変換は省略
* ポジション1201から1204は、個別名画の基本情報。銘柄コード以外は可変。
Pos = 1201
Rec.YMD = 0: 'DH
Rec.Hajime = 0: ' DW
Rec.Takane = 600: 'WH
Rec.Yasune = 600: 'WW
Rec.Owarine = 900: 'MH
Rec.Dekidaka = 900: 'MW
Rec.UpE = DC
Rec.DnE = WC
Rec.UK = GyoSyu$
Rec.KWZ = GSP
Rec.UWZ = 0
Length = LenB(Rec)
Fnum = FreeFile
Open "C:\○○○○\" + DB For Random As #Fnum Len = Length
Put #Fnum, Pos, Rec
Close #Fnum
* ポジション1204以降の0領域は、テクニカル算出数値、移動平均算出数値など日足データ変換で可変。
Fnum = FreeFile
Length = LenB(Rec)
Pos = 1204
Rec.YMD = 0
Rec.Hajime = 0
Rec.Takane = 0
Rec.Yasune = 0
Rec.Owarine = 0
Rec.Dekidaka = KesanTuki
Rec.UpE = 0
Rec.DnE = 0
Rec.UK = ""
Rec.KWZ = 0
Rec.UWZ = 0
Open "C:\○○○○\" + DB$ For Random As #Fnum Len = Length
Put #Fnum, Pos, Rec
Close #Fnum
* かなり途中を省略。
End Sub
以上のようなコードで全銘柄の個別銘柄のデータ格納庫をおよそ3分くらいで作成。
これが出来上がれば、全銘柄4000以上の日足変換と同時に週足、月足を2分も掛けずに変換する。サブに各週の区切り数値を設定すると、週に1日しか出来ないような銘柄でも、日足変換と同時に週足・月足も変換することで、変換漏れを防ぐことも可能。
注 *印の行や日本語文は、プログラムコード設定の説明であり、実際のプログラムでは必要ない。注祝設定 ' を前に付記しない限りバグで動かない。サブで変数宣言をしていない変数は、サブやプロシージャを超えてプログラム全体に引き継がれる変数なので、グローバル変数をすでに設定している。
追加し忘れていた銘柄も公開当初からデータを蓄積でき、毎日苦になっていた日足データの格納が昔日になったしだいです。上昇に転じる銘柄選択も日足変換で信頼性の置けるものになりつつあるので、ゴールデンウィークには、醤油と山葵を持って船釣りに出向く計画も立てられそう。
特に、真鰯を海水で洗いそのままあるいは気持ち醤油を付けて飲み込む旨さは、鯛以上の味ですね。そして、冷えたビールがあるならば、船酔いも飛んでしまう。
釣果土産など重たいものは不要。その場その時に食する分だけ釣る。こんな贅沢な釣りはない。何年前のことだったろう・・・あの日よ、もう一度。そのために作った株式ソフトなのかなぁ?
ちなみにこれからの目標は、1売買5パーセント。回転数、1日から3日。4日以降になる場合は、1日持つごとにプラス1パーセント。10日を限度に手仕舞う。誓うは易し守るは難しってなものですかねぇ?