SSブログ
システム作成講座 ブログトップ
前の5件 | -

明日のために~その6~ [システム作成講座]

前回までで、システムシートから株価データファイルを参照する方法を考えました。
システムシートの参照元である株価データファイルを自由に変更できれば、同一のシステムを様々な銘柄で利用することができます。

それを行なうためには、いくつかの方法があるのですが、今回はそれらについて考えてみることにしましょう。
まず最初に、前回作成したシステムシートを開いてください。

さて、ご使用中のエクセルのバージョンが2003の場合は、最も簡単な方法で参照元を変更することができます。
そのためには、リンクの編集機能を用います。

システムシートにおいて、上部の編集メニューから「リンクの設定」を実行してください。すると、「リンクの編集」というポップアップメニューが現れます。
その中にある「リンク元の変更」をクリックし、現れたエクスプローラで、新たに参照したい株価データファイルを選択します。

操作方法は通常のエクスプローラと同様です。開いた箇所に目的にファイルが見つからない場合は、左側の「マイコンピュータ」を実行して、ドライブ選択から順に目的のフォルダを開いていって下さい。
そして、目的のファイルを選択したら、OKボタンを押します。

エクスプローラが消え、しばらく画面が固まったような状態になりますが、数秒~数10秒ほど(パソコン能力等に依存します)でリンク元(参照元)の変更が完了します。
「リンクの編集」メニューに変更後のリンク元が表示されたら、「閉じる」ボタンを押してください。

エクセルシートには、変更後の株価データが表示されていることと思います。
このように、「リンク元の変更」を行なうことで、システムシートに取り込む株価データファイルを、自由に変更できるようになります。

ただし、これは最初にお断りしましたように、エクセル2003の場合です。エクセル2007やエクセル97では、やり方がちょっと違ってきます。
ちなみに、エクセル2000やエクセル2010に関しましては、残念ながら手元にアプリケーションがありませんので、確認できておりません。

エクセル2007の場合は、「データ」タブを開き、その中にある「接続」メニュー(リボンというのでしょうか)中の「リンクの編集」を実行します。
それ以降は、エクセル2003の場合と同様です。「リンク元の変更」を実行して、変更したい株価データファイルを選択してください。

なお、最近は改善されているかもしれませんが、リンク元を変更するのに非常に時間が掛かったり、場合によってはハングアップすることがありました。
そのような場合には、先に変更したいリンク元を開いておき、その後「リンク元の変更」を実行すれば、短時間で変更することができます。

さて、エクセル97ですが、「リンク元の変更」を行なうと、非常に時間が掛かってしまいます。その場合は、エクセル2007の場合と同様に、リンク元をあらかじめ開いておけば、比較的短時間で変更が可能です。

ただし、大規模なブックから「リンク元の変更」を行なうと、「・・・・・・開いているワークシートを参照してください。」というエラーメッセージが出ることがあります。
そこで、リンク元を開いてから実行すると、今度は「数式に不正な外部参照が含まれています。・・・・・・」というエラーが表示されます。

そのような場合は、A1セルを選択した状態で、編集メニューの「置換」を実行し、「検索する文字列」に現在のリンク元のファイル名を、「置換後の文字列」に変更したいリンク元のファイル名を入力して、「すべて置換」を実行すれば、比較的短時間でリンク元を変更することができます。

しかし、上記のエラー表示が出ない場合(「リンク元の変更」が機能する場合)は、置換を完了するまでに、非常に長い時間が掛かってしまう場合があります。
結局のところ、使っているエクセルのバージョンや、パソコンの処理能力、作成したシステムの規模に応じて、リンク元の変更方法を使い分けてやる必要があります。

「データ部」につきましては、とりあえず今回で終了となります。次回からは、「ロジック部」について考えていきたいと思います。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:

明日のために~その5~ [システム作成講座]

これまで4回に渡って、ワークシート(ブック)から他のブックのセルを参照する方法について述べてきました。
しかし、参照先を変更したい場合、いちいちセルの内容を書き換えていたのでは面倒です。そこで、参照先を簡単に変更する方法について、考えたいと思います。

その前に、前回までのおさらいとして、もう一度、株価データシートを参照するブックを作成してみましょう。
ただし、今回は株価データシートの一部をそのまま反映させるのではなく、シートの全体を、列や行をちょっとずらして参照することにします。

具体的には、日付や始値などと表示されているラベル行を16行に設定します。そして、18行目から実際のデータを参照するようにします。
また、データ日数は別途計算可能ですので、参照対象から除外し、C列以降を左に一つずつずらします。

と言いましても、いきなりそのようにブックを作成するのは難しいかもしれませんので、先ずは前回までに作成した40行までしか参照していないブックを用いましょう。
ブックを保存していない方は、これまでのコラムを参考に、もう一度作成してみてください。

ブックを用意しましたら、ファイル名は何でも構いませんが、とりあえず「システムシート01.xls」とでもして保存してください。
準備ができましたら、それを上述したフォーマットに加工していきましょう。

まずは、全ての行に渡って株価データを参照する必要があります。システムシートのG3セルを見てください。そこには、株価データシートの直近行の値が記されています。
そこで、40行全体を選択し、それを直近行までコピーすることにします。そうすれば、株価データシート全体を参照することができるはずです。

システムシート左端の"40"という数字をクリックしてください。すると、行全体が反転表示されるかと思います。
そのまま、上部の編集メニューから「コピー」を実行します。すると、行全体が点線で囲まれるかと思います。

続いて、編集メニューから「ジャンプ」を選択し、参照先欄に"Axxxx"(xxxxは直近行の値)と入力して、OKボタンを押します。
すると、Axxxxセルが選択された状態になります。

その状態で右端のスクロールバーを一番上に持っていき、ワークシートの最上部を表示します。その後、Shiftキーを押しながらA41セルを選択すると、A41セルからAxxxxセルまでが選択された状態になります。

そこで、編集メニューから「貼り付け」を実行すると、株価データシート全体がシステムシートから参照されます。
実際にスクロールバーを移動させて、全てのデータが表示されているかどうか確認してみましょう。なお、選択範囲をクリアするために、例えばA1セルを選択してください。

次に、データ開始行を18行に変更します。システムシートの4行全体(シート左端の"4")を選択し、その後、Shiftキーを押しながら16行全体(シート左端の"16")を選択します。
すると、4行から16行までが反転表示されますので、その状態で挿入メニューから「行」を実行してください。

4~16行に空白行が挿入され、17行目にラベル、18行目以降に株価データが表示されたことと思います。それらを確認すると、株価データシートの5行目以降が、システムシートの18行目以降に、そのままシフトしていることが分かります。

まだこれで完了ではありません。続いて、ラベル行(17行)の移動を行ないましょう。これを16行に移動します。
慣れてくればドラッグするだけで良いのですが、ここではきちんとした手順でやってみましょう。

まず、17行全体を選択します。方法は今までと同じです。続いて編集メニューから「切り取り」を実行します。コピーの時と同じように、選択範囲が点線で囲まれます。
そして、A16セルを選択した後、編集メニューから「貼り付け」を実行します。すると、ラベル行が16行に移動したかと思います。

同様に、F1~G3セルおよびB2~C2セルの内容も移動させましょう。
まず、F1~G3セル全体を選択します。やり方はこれまでと同じです。F1セルを選択した状態で、Shiftキーを押しながらG3セルを選択します。すると、選択範囲が反転表示されます。

続いて、編集メニューから「切り取り」を実行し、その後、F5セルを選択してください。そして、編集メニューから「貼り付け」を実行すれば、F1~G3セルの内容が、F5~G7セルに移動します。
同様に、B2~C2セルの内容を、C5~D5セルに移動してみてください。

最後に、データ日数(B列)を削除します。まず、B列全体を選択します。シート上端の"B"をクリックしてください。
続いて、編集メニューから「削除」を実行します。すると、B列全体が削除され、C列以降が1列ずつ左にシフトします。見やすいように、A1セルを選択しましょう。

冒頭で述べたようなフォーマットになっているかどうか、確認してみてください。もしもおかしなところがありましたら、もう一度最初から順番に作成してみてください。
内容に問題なければ、この状態でシステムシートを一旦保存しておいてください。

これでようやく、トレーディングシステムを作成するための下準備が整いました。
今回は思いの外、内容が多くなったため、参照先を変更するところまでは辿りつけませんでした。それについては、次回以降で考えていきたいと思います。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:

明日のために~その4~ [システム作成講座]

株価データファイル(参照元)へのセル参照を行なうことで、任意のブック(参照先)上に株価データを反映させることができます。
しかし、参照元のセルが空欄の場合、参照先のセルでは"0"と表示されてしまうことが分かりました。これでは、何かと不便です。

エクセルでトレーディングシステムを作成するに当たって、空欄にも意味を持たせる場合が多々あります。
例えば、システムの起点日を全ての銘柄で統一した場合、比較的最近上場した銘柄では、共通の起点日における株価データが存在しない可能性があります。

そのような時に、株価データ欄が空欄であれば、データが存在しないことを示せますが、それが"0"であったとすると、0円という株価データが存在することになってしまいます。
これは、システムを構築する上で、非常に厄介な問題です。もちろん、銘柄毎に起点日を変えてもいいのですが、そうした場合でも次のような問題が生じます。

例えば、株価の移動平均をインジケータとするシステムを考えた場合、最初に移動平均が算出されるまでには、(移動平均期間-1期間)分の空白期間が生じます。
これを、空欄で表現するのか、"0"で表現するのかでは、その後のシステム構築に大きな違いが生じてきます。

そのように考えると、データが存在しない場合は全て空欄とした方が、システム全体の整合性が取りやすくなります。
すなわち、参照元にデータが存在しない(空欄)場合は、参照先も空欄にするべきです。

そこで、参照先に表示された"0"を、空欄として表す方法を考えます。

ここで、参照先の書式を変更すれば、"0"を空欄にできそうに思えますが、実はその方法は上手くいきません。
参照元の空欄を参照した時点で、参照先には数値としての"0"が設定されてしまうからです。"0"はどのように書式をいじっても、"0"以外にはなりません。

ではどうすればいいかと言いますと、参照元が空欄の場合は参照先も空欄にし、参照元が空欄ではない場合は、参照先が参照元と同じになるようにしてやれば良いのです。
そんなこと言われても、具体的にどうすればいいか分からない、と思われる方がいらっしゃるかもしれませんが、実は上記の内容が答えそのものなんです。

もう一度繰り返して記しますと、「もし参照元が空欄の場合は参照先を空欄にし、そうでない場合は参照先を参照元と同じにする」ということになります。
これは、エクセルのif関数で表現できることと、全く同じことを言っているに過ぎません。

if関数は、エクセルでトレーディングシステムを作成するに当たって、恐らく最も使用頻度の高い命令です。
基本的には、if関数とoffset関数、そして四則演算を使いこなせるようになれば、大抵のシステムは作成することができるようになります。

今、参照先のA2セルから、参照元のA2セルを参照することを考えます。先回作成した参照先のブックを開くと、A2セルには"01/00/00"と表示されていることと思います。
これを空欄にしてみましょう。そのためには、A2セルに入力された数式をもう一度確認する必要があります。

そこには例えば、「='D:¥株式¥株価データ2¥[1301極洋01.xls]Sheet1'!A2」と入力されているものとします。なお、''内の表記は、皆さんのファイル環境によって異なります。
ここで、上記の数式の「=」以降が参照元を表しているわけです。

したがって、参照元が空欄ということは、「'D:¥株式¥株価データ2¥[1301極洋01.xls]Sheet1'!A2」が空欄ということです。
エクセルで空欄を表すには、""を用います。そうすると、上記の「」内が空欄である、というのは、次のように表されます。

 'D:¥株式¥株価データ2¥[1301極洋01.xls]Sheet1'!A2="" ・・・条件

そして、参照先のA2セルが空欄ということは、同様に次のようになります。

 A2="" ・・・分岐1:条件が正しい場合

更に、参照先のA2セルが参照元と同じ、というのは、次のようになるわけです。

 A2='D:¥株式¥株価データ2¥[1301極洋01.xls]Sheet1'!A2
                        ・・・分岐2:条件が正しくない場合

これらを、if関数でつなぎ合わせてみましょう。if関数の使い方については、今更述べるまでもないでしょうが、次のようになります。

 =if(条件, 分岐1, 分岐2)

したがって、上式にそれぞれの数式を当て嵌めてやれば、参照先のA2セルに記述する数式は、次式のようになるわけです。
ただし、通常、自分のセルを表す「A2=」は省略します(入力すると循環参照エラーになるのでご注意ください)。

 =if('D:¥株式¥株価データ2¥[1301極洋01.xls]Sheet1'!A2="",""
      ,'D:¥株式¥株価データ2¥[1301極洋01.xls]Sheet1'!A2)

非常に長ったらしくなりましたが、このように表記することで、参照元が空欄ならば、参照先も空欄にすることができるようになります。
あとは、この数式をA1~G40の全てのセルにコピーしましょう。

最初にA2セルを選択した状態で、編集メニューの「コピー」を実行し、続いてA1~G40セルを選択した状態で、編集メニューから「形式を選択して貼り付け」をクリックし、「数式」にチェックを入れて「OK」ボタンを押します。

これで、選択した全てのセルに、対応した数式(if関数)が設定され、参照元にデータがあるセルではその内容が、参照元が空欄のセルには空欄が表示されたことと思います。
これで、ようやく株価データファイルを、そのまま参照することができるようになりました。

しかし、銘柄を変更する度に、コピーを繰り返していたのでは面倒です。そこで、次回は、エクセルの機能を用いて、簡単に参照元を変更する方法について考えてみます。

nice!(0)  コメント(4)  トラックバック(0) 
共通テーマ:

明日のために~その3~ [システム作成講座]

先回、ブックやワークシートのセルを参照する方法について考え、その具体例として、株価データファイルのA1~G40セルを実際に参照してみましたが、その結果、いくつかの疑問点が生じたことかと思います。

一つは、日付欄の数値です。株価データファイルでは日付として表示されていましたが、それを参照すると、何やら得体のしれない数字になっています。
実は、これはシリアル値というもので、エクセル内部で日付や時刻を管理するために用いられている数値です。

1900年1月1日0時0分0秒を1とし、そこから1日進む毎に1ずつ増えていきます。日付のみを表す場合はシリアル値は整数になり、時刻を表す場合は小数になります。
すなわち、日付欄の最初に表示されている34274は1993年11月1日を表し、1900年1月1日から数えて34273日目に当たるわけです。

でも、元の株価データファイルでは最初から日付として表示されていたのに、それを参照するとシリアル値になってしまうのは、何だか納得できませんね。
でも、それがエクセルの仕様なので、そういうものだと割り切るしかありません。要するに、セルを参照した場合、書式までは参照できない、ということです。

では、どうすれば良いのかと言いますと、別途書式を設定する、ということになります。今回の事例ですと、参照先のA列全体を選択し(シート最上部の"A"と表示されている箇所をクリックします)、書式メニューの「セル」をクリックして、表示形式の「日付」から参照元と同じ形式を選びます。

でも、よく見ると他の列の書式も違っていますし、そもそも列幅まで違っていたりします。これらを一つ一つ設定するのは大変ですね。
そこで、ちょっと"ズル"をしてみましょう。

参照元の株価データファイルを開いていない方は、それをもう一度開いてみてください。参照元を開く際には、現在参照先を開いているエクセル上から、開くようにしてください。
エクスプローラなどから、参照元のファイルをダブルクリックするなどして直接開くと、別のエクセルが起動して、その上で実行されてしまいますのでご注意ください。

参照元を開いたら、そのワークシートの一番左上の部分(行番号と列番号が交わる部分)をクリックしてみてください。
すると、ワークシート全体が反転表示されることと思います。

その状態で、編集メニューから「コピー」を選択します。すると、反転表示した部分が点線で囲まれます。これで、その部分がクリップボードに取り込まれたことになります。
続いて、参照先ブックに移動してください(ウィンドウメニュー内の参照先ファイル名をクリックします)。

そこでA1セルを選択し、編集メニューから「形式を選択して貼り付け」を実行します。表示されるポップアップメニューで「書式」にチェックを入れ、「OK」をクリックします。
すると、参照元の書式のみがコピーされ、日付などが正しく表示されたと思います。

これでめでたしめでたし、と言いたいところですが、参照元ではセルをスクロールしても、最初の4行とA列は常に表示された状態であるのに対し、参照先はそれらもスクロールされてしまいます。
これでは、データ数が増えると、日付やラベル(項目名)などが見えなくなってしまい、不便です。

書式はきちんとコピーされているのに、何故なんでしょう?
実はこの設定は書式ではないんです。これは、ウィンドウメニューから「ウィンドウ枠の固定」を実行することで、設定することができます。

最初に、参照先ブックにおいて、B5セルを選択してみてください。その状態で、ウィンドウメニューから「ウィンドウ枠の固定」を実行します。
すると、参照元の株価データファイルと同じように、最初の4行とA列が常に表示された状態になります。

「ウィンドウ枠の固定」を実行すると、直前に選択したセルを一番左上としたセル範囲のみが、スクロールできるようになります。
それ以外の部分はスクロールできずに、常に表示された状態にあるわけです。

ちなみに、行のみをスクロールしたい場合はどうすればいいのでしょう?
その場合は、例えばA5セルを選択した状態で、「ウィンドウ枠の固定」を実行すればいいのです。A列にあるセルを選択すれば、行のみのスクロールにすることができるわけです。

これで、ようやくセル参照ができるようになりました・・・。
と思いきや、何か参照先の最初の3行の様子が、参照元のそれと違って見えますね。参照元で空欄だったところが、"0"になっているようです。

これは困りました。何でこんなことになるのでしょう?
また、それを解消する手段はあるのでしょうか?
次回は、この問題について考えてみたいと思います。


PS.うっかり書き忘れましたが、本日、日産順張り正逆合成システムに買いシグナルが点灯しました。明日の寄付きで買い建てとなります。
北アフリカ・中東情勢不安が再び拡大する中、はたしてどうなることでしょう。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:

明日のために~その2~ [システム作成講座]

前回は、異なるブックやワークシートのセルを、参照する方法について考えましたが、参照したいセルがたくさんある場合はどうしたらいいでしょう?
例えば、株価データファイルの内容を全て、別途作成したブックから参照するような場合です。

そこで、前回作成したブックをもう一度利用してみます。既に削除してしまった方は、もう一度作成してみてください(簡単ですよね)。
Sheet1のA1セルに、株価データファイルのSheet1のA1セルを参照する数式が入力された状態から始めます。

さて、株価データファイルの全領域を参照してもいいのですが、いろいろと大変なので、A1セルからG40セルまでを参照することにしましょう。
これら全てのセルに一つ一つ数式を入力していくのは、どう考えても非効率ですよね。

こんな時のために、エクセルには「コピー」という便利な機能があります。A1セルの内容をA1~G40セルの範囲にコピーすれば、株価データファイルの同じ範囲の内容を参照できるはずです。
では、早速やってみましょう。

コピーのやり方は、ご存知ですよね。最初にA1セルを選択した状態で、編集メニューから「コピー」をクリックします。これで、A1セルの内容がメモリ(クリップボード)に保管されます。
続いて、キーボードの「Shift」キーを押しながら、G40セルを選択します。すると、A1~G40セルが反転表示されますので、その状態で編集メニューから「貼り付け」をクリックします。

すると、A1~G40セルに株価データファイルの同一セルの内容が表示されるはずです・・・・・・
???・・・表示されませんね・・・???
A1~G40セル全てに、銘柄名がびっしりと表示されてしまいました。これはいったいどうしたことでしょう?

試しに、各セルの内容を見ると、全て同じ数式が入力されていることと思います。そしてそれらは、株価データファイルのSheet1のA1セルを参照しているはずです。
一旦、元の状態に戻してみましょう。編集メニューから、「元に戻す」をクリックしてください。貼り付け前の状態に戻ったことと思います。

そこでもう一度、A1セルの数式を見てみることにします。A1セルを選択してください。上部の関数窓に数式が表示されましたね。
数式で参照しているセル名をよく見てみると、「A1」ではなく「$A$1」となっていることが分かります。

実は、このような参照方法を「絶対参照」と言います。それに対して、「A1」のように「$」が付いていないものは、「相対参照」と呼ばれます。

絶対参照にすると、参照先のセルをどこにどれだけコピーしようが、参照元のセルは変わりません。株価データファイルのA1セル(参照元)を参照しているセル(参照先)を、どこにどれだけコピーしても、それらのセルでは全て参照元の内容を表示するわけです。

一方、相対参照の場合は話が違ってきます。相対参照にすると、参照先のセルが移動した分だけ、参照元のセルも移動します。
例えば、参照先のA1セルをG40セルにコピーした場合、参照元のセルもA1セルからG40セルに替わります。これは参照先の数式が変わるだけで、参照元のセルそのものが移動するわけではありません。

なお、これはあくまで移動量が同じになる、ということです。必ずしもセル番地が同じになるわけではありませんので、注意する必要があります。
参照先が行方向に39行、列方向に6列だけ移動すれば、参照元も行方向に39行、列方向に6列だけ移動することになります。

そうすると、最初に参照先のA1セルをA1~G40セルにコピーした際、銘柄名だけがずらっと表示された理由がお分かりになるかと思います。
エクセルでは、前回行なったような方法でセルを参照すると、必ず絶対参照になってしまうということです。

では、それを相対参照にするにはどうしたらいいのでしょう?
そのためには、数式から「$」のみを削除すればいいのです。具体的には、数式を表示している関数窓のセル番地部分をクリックし、「$」のみを削除します。

あるいは、セル番地部分をクリックしてカーソルを表示させた状態で、キーボードの「F4」キーを押しても、相対参照に変更することができます。
ただし、この場合「F4」キーを1回押すごとに「A$1」⇒「$A1」⇒「A1」と変化しますので、「A1」にするためには、「F4」キーを3回押す必要があります。もう一度押せば、「$A$1」に戻ります。

ここで、「A$1」や「$A1」などという表記が出現しましたが、あまり難しく考える必要はありません。要するに、「$」が付いた部分だけが絶対参照になる、ということです。
すなわち、「A$1」であれば、行方向のみが絶対参照で、列方向は相対参照ということになります。これをコピーすれば、列だけが変化して、行は変わらないわけです。

さて、それでは最初に戻って、A1セルの数式を相対参照に修正した上で、もう一度そのセルをA1~G40セルにコピーしてみましょう。
今度は、株価データファイルのA1~G40セルの内容が表示されたことと思います(一部変な表示になりますが、それについては次回以降で説明いたします)。

これで、任意のブックやワークシートから、自由にセルの内容を持ってくることができるようになりました。
参照先のブックをシステムファイルに設定する場合、この参照元を変更するだけで、自由に銘柄の入れ替えができるようになるわけです。

でも、銘柄を変更する度に、いちいち参照先(システムファイル)のセルの内容を書き換えていたんでは、結構大変ですよね。
エクセルには、そんな時のための便利な機能があるんです。それについては、次回以降で考えてみましょう。


PS.今朝買建てた日産ですが、早くも手仕舞いシグナル点灯です。明日の寄付きで手仕舞い売りとなります。利益か損失かは、明日の寄付き次第です。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:
前の5件 | - システム作成講座 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。