Posts on this page


December 19, 2014

ランダムウォークは決定論なのか?をExcelで調べる。

ランダムウォークでは、初めの数回の試行でおおよそ、上昇トレンドになるか下降トレンドになるかが、決まってしまうと言われているわけですが、実際に試してみます。



50回の試行により、各系列の値の分散は徐々に大きくなっていくわけですが、一度大きくなると、その後はトレンドを保っているようにみえなくもないです。そこで、n回目の状況(上昇か下降か)が最終的な結果とどのような関係があるのか、をグラフにすると以下のようになります。



このグラフを単純に解釈するならば、5回挑戦して、上昇トレンドなら、その後50回まで続けても6割以上の確率で上昇トレンドだ、といえ、最初に述べた定理が成立するわけです。

ならば、上昇トレンドのある勝ち馬に投資すれば、必ずリターンがあるのか、というと、別の記事でも述べたように、我々は原点である0回目の値を(少なくとも短期的な値動きでは)知らないということが問題になります。そのため、そもそも、上昇トレンドなのか、下降トレンドなのかを判断する基準がないのです。そして、何も情報を与えられていないランダムウォークでは現時点からの勝ち負けは50:50なので、結局のところ、トレンドに基づいて予想する、という考えは成り立ちません(ランダムウォークを前提にすると)。

一方で、過去を見返すと、あたかもトレンドによって将来が決まっているように見えてしまう、という一見矛盾した結果が得られるのは大変興味深いことですね。運命論、決定論というものも、ランダムウォークの観点から見ると、当然のことかもしれません。人間は考える動物ですから、過去を見返すと、(例え偶然の積み重ねであっても)運命的なものを感じても不思議ではないです。

December 12, 2014

ランダムウォークで遊ぶ

ランダムウォークとは、乱数を足していって生み出される数列のことですが、ファイナンスの分野では、証券価格の(短期的な)変動はランダムウォークだとも言われます。実際にランダムウォークを計算してみることにします。

December 10, 2014

複数選択セレクトボックスをシンプルなJavascriptで使いやすくする

multiple属性を設定し複数選択を許可したセレクトボックスでは、長いリストから複数の選択をさせることができます。ユーザーはCTRLキーを押しながらクリックすることで選択が可能です。しかし、選択対象のリストが長くなると、既に選択した項目が何なのかを把握することが難しくなってしまいます。
そこで、選択中の選択肢を分かりやすく表示してやることで使いやすく出来ます。


オーダー:

複数選択のセレクトボックスとdivを用意し、以下のようにJavascriptを使って接続してやれば、選択中の状況を表示させることができます。

document.getElementById("menulist").onclick = function() {
  var sel = document.getElementById("menulist");
  var arr = [];
  for (var i = 0; i < sel.length; i++) {if (sel[i].selected) { arr.push(sel[i].text);}}
  document.getElementById("orderlist").innerHTML = "オーダー:<br />" + arr.join("<br />");
}
document.getElementById("resetbutton").onclick = function() {
  var sel = document.getElementById("menulist");
  for (var i = 0; i < sel.length; i++) {sel[i].selected = false}
  document.getElementById("orderlist").innerHTML = "オーダー:"
}

September 6, 2014

エクセルの数式を理解しやすくするには

エクセルは自由度が高く様々な使い方ができるのでとても便利なツールです。その反面、人によって使い方が違ってくるため、他人の作った数式がたくさん入ったエクセルシートになると、その意味を理解するのが困難になることがあります。
数式を分かりやすくするいくつかのTipsをメモします。


July 23, 2014

マウスとタッチパッドを併用する

ノートパソコンのポインティングディバイスはタッチパッドだったり、トラックポイントだったりするわけですが、操作によってはやはり、ハードウェアとしてのマウスの方が効率よく作業できるときもあります。

そこで、以下のマウスを購入したのですが、マウスをインストールした後は、タッチパッドに触れるとマウスカーソルが大暴走。タッチパッドに指を置いてフリックするとカーソルが、自然と上下に暴れだし、しばらくすると右クリック、クリックが多発というとんでもないことに。さらに困ったのは、マウスの電源を切っている場合やマウスのワイヤレスアダプタを外している場合であってもカーソルが暴走してしまうこと。

使用環境は以下の通り。

システムをリカバリするしかないのだろうか…と若干絶望もしつつ、”タッチパッド マウス 両方"などと検索してみます。すると、色々と事例がありますね。

問題ないです、という事例

今使ってるPCのマウスとタッチパッド両方同時に 使えるようにしたいのですが ど... - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1083040345
パソコン初心者です。マウスとタッチパッドの両方を一緒に使用したいのですがどこ... - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1272179617

カーソル暴走の事例

[Q&A] マウスポインタが異常なほど暴走します。相当困っています 【OKWave】
http://okwave.jp/qa/q1522584.html
カーソルが勝手に下に暴走し、制御不能です - ウィルス対策 - 教えて!goo
http://oshiete.goo.ne.jp/qa/2925370.html

対処方法

根本的な原因はカーソルの動きを、マウスとタッチパッドという二つの入力で動かそうということ、それ自体にある様子。カーソル暴走問題は以下のような場合に起きるようです。
  • タッチパッドとマウスを併用した場合
  • メーカー製のマウス関連ソフトウェアが悪さをする場合
  • マウスあるいはタッチパッドが物理的に壊れている場合
マウスとカーソルが正常であり、組み合わせの相性が良ければ、併用しても問題なく動くようです(上記の問題ない事例)。

では、動かない場合ですが、マウスとタッチパッドの同時使用はしないというのが最も簡単な答えになりそうです。環境によるけれども、タッチパッドドライバの設定で、USBマウス使用時はタッチパッドを無効にする、に設定します。

マウスのワイヤレスアダプタを外した後にカーソルが暴走してしまう問題については、再起動すれば治る様子。マウスの電源を切ってもマウス側のワイヤレスコネクタを挿したままだと、OSの動作に何か影響を与えているのでしょうか。この問題の原因はよく分からないですが、取り急ぎは問題が解決したので、良しとすることにします。

May 14, 2014

IEに表示されているPDFをVBScriptでダウンロードして保存する



webにあるpdfファイルがプラグインでブラウザウィンドウ内に直接表示されている場合に、VBScriptを使ってローカルに保存する方法を示します。

なお、ここではpdfファイルを例に説明していますが、別にどんなファイル形式であっても同じ考え方を適用できます。例えば、画像ファイル(png, tiff, jpgファイルなど)や音声ファイル(mp3)であってもほとんど同じコードで処理できます。

May 13, 2014

IEのボタンクリックなどのイベントをWSH/VBScriptから監視する

VBScriptでOnclick = …何と書くか

VBScriptを使ってIEに読み込ませたページ上で、ボタンがクリックされた場合に、それを検知するためのコードを示します。 GetRef関数で得られたOnClickSubプロシージャへのポインタをonclickに設定しています。これにより、ボタンがクリックされるとメッセージボックスが表示されます。

設定されたイベントフックはこのスクリプトが動作している間しか機能しませんので、無限ループを回しておき、IEが終了するとともにスクリプトを終了させています。そのため、CreateObject関数では"IE_"としてイベントプレフィックスを設定しており、IEが終了するときに発生するOnQuitイベントを捕捉し、その時にスクリプト自体も終了させています。
MoniteringIEEvent

Sub MoniteringIEEvent
    Set ie = WScript.CreateObject("InternetExplorer.Application", "IE_")

    ie.Navigate "http://www.google.co.jp"
    ie.Visible = True
    waitIE ie

    ie.Document.getElementById("gbqfq").Value = "vbscript DOM event hooking"
    ie.Document.getElementById("gbqfb").onclick = GetRef("OnClickSub")

    Do While True
        Wscript.sleep 1000
    Loop
End Sub

Sub IE_OnQuit
 WScript.Quit
End Sub

Sub OnClickSub()
    MsgBox  "Search button clicked!"
End Sub

Sub waitIE(ie)
    Do While ie.Busy = True Or ie.readystate <> 4
        WScript.Sleep 100
    Loop
    WScript.Sleep 100
End Sub

応用できそうな事例

特定のページで特定のボタンを押すと、本来の動作に加えて独自機能が動く。例えば、検索したときに検索ワードをローカルファイルに記録していくスクリプトが書けるでしょう。これを実現するには、立ち上がっているIEのすべてのプロセスを監視するスクリプトも必要になりますが。

あるいは、スクリプトで起動したwebアプリケーションに対して、人の入力を待ってから次の動作を行う、ということもできるでしょう。例えば、結果を表示して人に選択させるような場面が考えられます。

広い意味でのアドオンを作ることもできるでしょう。あえてWSH/VBScriptで作るべきか、という議論はありますが、インストール不要でダウンロードも実行も容易という点では、環境に依存せず配布しやすいかもしれません。

参考

WScript.CreateObjectはVisual BsssicのCreateObjectと第2引数の意味がまったく違うことに注意です。
GetRef Function
http://msdn.microsoft.com/en-us/library/ekabbe10(v=vs.84).aspx
CreateObject Method
http://msdn.microsoft.com/en-us/library/xzysf6hc(v=vs.84).aspx
Scripting Events
http://msdn.microsoft.com/en-us/library/ms974564.aspx

May 11, 2014

IEをVBScriptから自動操作する

いろんなウェブサイトのログインや毎回PCを立ち上げる度に行っているInternet Explorerの操作があるならば、今すぐバッチファイルを作るといいでしょう。
テキストファイルを直打ちするだけで簡単に作ることができるし、一度作ってしまえば、次からそのファイルを実行するだけで作業が済んでしまいます。

以下では、WSH/VBScriptを用いたIEの自動化についてまとめます。


April 28, 2014

Excelのワークシートで入力したセル自体を指定する

エクセルを使っているときに、式を入力したセル自体を選択するには、通常はセルの番地を入力すれば、それで足ります。

ところが、条件付き書式を使う場合など、複数のセルに対して、入力されているセル自体を指定するようなワークシート関数はないようです。
そこで、以下のような指定方法を使うと、Thiscellに当たるようなセル指定が出来ます。

OFFSET($A$1, ROW() - 1, COLUMN() - 1)
INDIRECT(ADDRESS(ROW(), COLUMN()))

条件付き書式での活用例を示します。
通常、条件付き書式は、そのセルの値の正負や大小で書式を設定するものですが、
以下の例では隣のセルの値が正の時にセルの書式を設定することが出来るようになります。
= OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN()), , 1) >0

April 18, 2014

Excel VBA にはThisworksheetがない?でもActiveSheetとMeがある!

ThisWorkbook、ActiveWorkbook、ActiveSheetはあるのですが、ThisWorksheetはありません。
実際には、標準モジュールでコーディングする場合は、Activesheetで必要な処理ができてしまいます。
以下のコードを実行すると、ActiveSheetの中身を確認できます。
どうしてもThisWorksheetと書きたい場合や、他のシートをアクティブにするVBAの場合はSetステートメントでThisWorksheetにActiveSheetを保存しておきます。

次のサンプルでは、別のシートをアクティブにした場合の結果を示します。
Sub testActiveSheet
   Set ThisWorksheet = ActiveSheet
   Msgbox "ActiveSheet is " & ActiveSheet.Name
   Msgbox "ThisWorksheet is " & ThisWorksheet.Name

   ActiveSheet.Next.Activate

   Msgbox "ActiveSheet is " & ActiveSheet.Name
   Msgbox "ThisWorksheet is " & ThisWorksheet.Name
End Sub
シートにコードを書く場合は、Meキーワードを使うこともできます。Meキーワードはコードが実行されているモジュールそのものを示しているので、以下のコードをSheet2から呼び出した場合でもMe.NameはSheet1のままです(コードがSheet1に書いてあるとすれば)。

 なお、Meキーワードはクラスモジュールでしか使えないので、標準モジュールで使うとエラーとなります。
Sub testMe
   Set ThisWorksheet = ActiveSheet
   Msgbox "ActiveSheet is " & ActiveSheet.Name
   Msgbox "ThisWorksheet is " & ThisWorksheet.Name

   Msgbox "Me is " & Me.Name

   ActiveSheet.Next.Activate

   Msgbox "ActiveSheet is " & ActiveSheet.Name
   Msgbox "ThisWorksheet is " & ThisWorksheet.Name

   Msgbox "Me is " & Me.Name
End Sub 

選んだcsvファイルをエクセルに取り込むマクロ

VBAを使って、選んだcsvファイルをエクセルに取り込んでくれるマクロです。

April 13, 2014

Excel TopLeftCell プロパティをSelection.ShapeRangeに対して適用するには

以下の記事で示したように、Selectionに対して、TopLeftCellを求められませんでした。
found, known and done.: Excel VBAのTopLeftCellプロパティが分からない
http://foundknownanddone.blogspot.jp/2014/04/excel-vba-topleftcell-runtime-error-selection-does-not-support-this-property.html
もう少し調べて理解した範囲でなぜなのか、どうすればよいのかを以下に解説します。

April 12, 2014

Excelで画像ファイルを切り抜き、並べるマクロ

Excelのセルを表のセルとして利用し、そこに適当なマージンを設定した大きさになるように画像をトリミングするツールを作成しました。

使用方法

  1. 切り抜きたい画像を選びます。
  2. setCropBoxWithMarginで切り抜き範囲を指定する枠を生成します。
  3. 画像の上で切り抜き範囲を動かして切り抜きたい範囲を指定します。
  4. cropPictureToBoxでで図形を切り抜きます。
  5. 前項で画像を自動配置しなかった場合は、画像をおおよそセルの中央に移動させた後、以下のマクロを使って場所を調整します。
found, known and done.: Excelの図の位置をセルの中心に
http://foundknownanddone.blogspot.jp/2014/04/excel-centering-object-to-cell.html#more

April 10, 2014

Excel VBAのTopLeftCellプロパティが分からない

Excel VBAには、オブジェクトの左上にあるセルを求めてくれるTopLeftCellというプロパティがあるのですが、いまいち使い方が分からないのでメモ。

Selectionに対して機能しない

選んだ図形のそれぞれのTopLeftCellを得ようとして、以下のようなコードを書くと、「実行時エラー '438' オブジェクトはこのプロパティまたはメソッドをサポートしていません。」というエラーが発生します。

Sub testTopLeftCell()
    For Each target In Selection.ShapeRange
        MsgBox target.TopLeftCell.Address
    Next
End Sub

以下の記事にもあるように昔から知られている問題のようですが、あまりこの機能を使う人がいないのか、それとも、もっと簡単な解決法があるからなのか、ネット上を検索してもまともな解答が見つかりません。
VB Macro problem using TopLeftCell
http://www.mrexcel.com/forum/excel-questions/432495-vbulletin-macro-problem-using-topleftcell.html#

対処療法しかないのか?

まともな対応方法が分からず、今のところ以下のようなコードでお茶を濁しています。
どうやるのが正解なのでしょう…。

Sub testTopLeftCell2()
    For Each target In Selection.ShapeRange
        MsgBox ActiveSheet.Shapes(target.Name).TopLeftCell.Address
    Next
End Sub

2014/4/12追記 .Nameは一意でないので.IDを使う方がよさそう…か?
Sub testTopLeftCell3()
    For Each target In Selection.ShapeRange
        MsgBox ActiveSheet.Shapes(target.id).TopLeftCell.Address
    Next
End Sub

April 8, 2014

google spreadsheetからtableタグを抜き出す

google spreadsheetは、ブラウザだけで表計算が可能で便利ですが、他のページに埋め込む場合、標準ではテーブルのみをコンパクトに埋め込むことができないようです。そこで、jqueryを使って簡単に埋め込む方法をメモします。

コード中のKEY_OF_YOUR_SPREADSHEETにはスプレッドシートを公開するときに得られるキーを使います。また、結果を入れたいdivタグのidをコード中で指定しておきます(サンプルコードではspreadsheetresultとしています。)

<div class="spreadsheetresult">Loading google spreadsheet...</div>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
$(function(){
   $.get("https://docs.google.com/spreadsheet/pub?key=KEY_OF_YOUR_SPREADSHEET",function(data){
      var output=$(data).find("#tblMain")
      $(output).find(".hd").remove()
      $(output).find(".rShim").remove()

      $(".spreadsheetresult").contents().replaceWith(output)
   })
})
</script>

実行結果

Loading google spreadsheet...


もっと高度なことをしたいときは…

JSONもサポートしているのでスクリプトをきちっと組んでやってもいいのですがjqueryを使ってやれば、XHRとDOM操作のわずかなコードでtableタグを抜き出すことが出来ます。
抜き出したタグはstyleを使って味付けすればお好みの表になりますね。

Simple example of retrieving JSON feeds from Spreadsheets Data API - Google Data APIs — Google Developers
https://developers.google.com/gdata/samples/spreadsheet_sample?hl=ja