SSブログ

エクセルのちょっといい話(9) [システムトレード]

エクセルにおいて、何らかの条件に応じて処理を分岐させたいことは多々あります。そのような場合には、IF関数を使うのが常套手段ですが、IF関数を使うにしても、ネストを深くしてしまうと、その後の処理が複雑になってしまいます。もっと簡単な方法はないのでしょうか?

今、条件分岐を行なうに当り、条件Aのみの時に処理①、条件Bのみの時に処理②、条件AかつBの時に処理③、いずれでもない時に処理④を行なうものとします。
通常であれば、それは次式のように表されます。

  =IF(AND(条件A,条件B),③,IF(条件A,①,IF(条件B,②,④))) ・・・(1)

最初に条件AとBが共に成り立つ場合を持ってきたのは、それが最上位の条件だからです。もしも、次式のようにしてしまうと、最初の分岐で条件AかつBの場合も①として処理されてしまいます。

  =IF(条件A,①,IF(条件B,②,IF(AND(条件A,条件B),③,④))) ・・・(2)

IF関数を用いてネスト構造にすると、(2)式のように意図しない結果を招いてしまう場合が生じます。しかも、このような数式は、数式そのものにエラーがないため、後から問題点を見つけ出すことが非常に困難となってしまいます。

このような問題を防ぐためには、先回ご紹介しましたように、線形結合を用いれば良いわけです。その結果は次式のようになります。

  =IF(AND(条件A,NOT条件B),①,0)+IF(AND(NOT条件A,条件B),②,0)
   +IF(AND(条件A,条件B),③,0)+IF(AND(NOT条件A,NOT条件B),④,0) ・・・(3)

何か、かえって面倒になりましたね。全ての条件を厳密に表記するのであれば、別にネストを用いても良いように思えます。
ちなみに、NOTはその条件が成立しないことを表します。

もっとすっきりした方法はないのでしょうか?

例えば、条件Aが成立した場合はA1セルを"1"に、成立しない場合は"0"にするものとします。同様に、条件Bが成立した場合はB1セルを"1"に、成立しない場合は"0"にするものとします。
そうすると、(3)式は次のように書き換えることができます。

  =IF(AND(A1=1,B1=0),①,0)+IF(AND(A1=0,B1=1),②,0)
   +IF(AND(A1=1,B1=1),③,0)+IF(AND(A1=0,B1=0),④,0) ・・・(4)

これは、条件式を書き換えただけですので、実質的な複雑さは(3)式と変わりません。しかし、条件を(1,0)で表すことにより、次のような表現を取ることが可能となります。

  =A1*(1-B1)*①+(1-A1)*B1*②+A1*B1*③+(1-A1)*(1-B1)*④ ・・・(5)

(A1=1,B1=0)の時は①のみが残り、(A1=0,B1=1)の時は②、(A1=1,B1=1)の時は③、(A1=0,B1=0)の時は④が残ることが分かります。
このように、条件の真偽を(1,0)で表すことにより、IF関数すら使わずに(ただし条件を(1,0)に振り分けるところで使う場合があります)条件分岐を行なうことができるわけです。

トレーディングシステムにおいても、様々な条件を(1,0)で表すことで、数式を簡略化することが可能となります。
それは、処理速度を向上させると共に、(2)式のようなミスを事前に防止することにもつながります。

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

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

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