いろんな情報を仕入れていると、テクニカル分析に果たして意味があるのか日々疑わしくなってきました。
この本を読んで判断すべきでしょうけどね。→Amazon.co.jp: A Random Walk Down Wall Street: The Time-Tested Strategy for Successful Investing: Burton G. Malkiel: 洋書まだ数か月後になるだろうなぁ。本当に役に立つのかどうかは自分で証明するべきなので、解析用ソフトウェアの開発は続けます。
情報を仕入れはじめて1か月しか経っていませんが、上の書籍で進められているインデックスファンド運用は、日本では通用しないでしょうね。だってアメリカのダウはリーマンショックをあっという間に超えて伸び続けているけど、日経平均は危ういアベノミクスに支えられてすらバブル時代の半額です。っていうかダウに2倍レバレッジかけるだけで大儲けなんだぜーずるいよアメリカ。大体インデックスファンドって手数料取るんでしょ?なんか悔しくない?他人に仕事投げて手数料取られるのって。
未分類
The Rough Guide to Reggae (1997)
★★★★☆
レゲエはジャマイカ発祥のポピュラー音楽。ロックの影響をかなり受けているように感じました。暑くて気怠い感じを混ぜて、なんとなくこなれてない英語をラップのように混ぜる。このアルバムには洋楽的なポピュラー寄りの曲から、スカっぽい古臭い曲、ヒップホップに非常に近いCockney Translation(これが一番好きです)のような曲まで非常に幅広く収録されています。初代beatmaniaで最も簡単な曲だったのがJam Jam Reggaeというレゲエだったので、やや感慨深いですが、あのような陽気な曲は数曲しかありませんでした。フラメンコのときと同じで、先入観を持って聞くといい意味で裏切られます。
トレダビ
株取引シミュレーションサイト、トレダビというものが存在することを知り、一か月ほど前に登録しました。
kickzone さんのマイページ | 株初心者でも学べるバーチャル株投資ゲームならトレダビ
もちろん企業分析などロクにできていないので、買った銘柄はどれも直観です。安値なのかどうか判断する知識はないし、高値で掴んだ可能性も高いでしょう。今は好景気に沸いてるので勝ってますが、ここ1か月の状況なら10人が投資して10人が勝てるでしょう。ITバブルもすでに遠く、日本中あまりにもイケイケすぎるので、いずれ大幅な調整、下手すると暴落が来るはずです。いま本物のお金で参入したら天井を超えたときに絶対に痛い目を見ます。原資も10万ちょいしかないので、好景気の上澄みを掬うことしかできず、仕方がありません。ここで数年間修行してから、参入することになるでしょう。
まずは基本的なことから。目を付けた企業の決算書を少しずつ読んでいます。面白い!
n日移動平均
意外と簡単だった。
/** n日移動平均を求める */ public static CalcSMA(hiashiArr: Array<Hiashi>, days: number): Array<DateVal> { var retArr: Array<DateVal> = []; var currentSum: number = 0; for (var i in hiashiArr) { var hiashi: Hiashi = hiashiArr[i]; var dv: DateVal = new DateVal; dv.date = new Date(hiashi.ymd); currentSum += Number(hiashi.close); if (i >= days) { var nPrevHiashi = hiashiArr[i - days]; currentSum -= Number(nPrevHiashi.close); dv.val = currentSum / days; } else { dv.val = currentSum / (i + 1); } retArr[i] = dv; } return retArr; }
日足グラフが書けた + VS2013とGitHubの連携
kickzone/SHChart · GitHub
Visual Studio 2013 GitHubの使い方 : Exceedone Technical Knowledgeを参考に、VS2013とGitHubを連携することができた。これでソース管理も楽々だ。
小田急電鉄2014年後半の日足グラフ
次は折れ線グラフと移動平均線を試しに書いてみて、それができたら縦軸・横軸を追加し、さらにマウス連携の画面表示とスクロール・倍率操作を実装して、見栄えをよくした後最後にインターフェースを整えたら一通り終了だ。ここまで来たら、あとはすぐ実装できるだろう。
当面、シストレ・スイングトレードで参入することは不可能
1か月ほどいろんなサイト、書籍でチマチマと知識を入れてきた結果、今の段階でシストレで参入することは不可能、という結論に達した。
シストレは、取引回数をなるべく多くして期待値に近づける必要があるという性格上、スイングトレードのスタイルをとることが多い。トレード回数は、1日1回〜数回程度になるだろう。ところが資金が少ない現状では、単元株に届かないために変えない銘柄が多数あり、そもそも取引不能である。
単元未満株を買うことはできる。しかし手数料が高い。片道0.5%、往復1%かかる。通常売買の手数料が0.05%〜0.1%なので、約10倍もかかる。これは資金が少ないうちは痛い。さらに、リアルタイムの売買もできない。午前または午後の始値のみの取り引きであるので指値も使えない。したがって、現状可能なのは、単元未満株によるバリュー投資しかないだろう。もちろん単元株に達していればそれで取引するべきだが。今後原資が溜まるまで数年間は、バリュー投資に関する知識を蓄える必要がある。
Enrico Pieranunzi Trio & Ada Montellanico – Ma L’amore No (1997)
Wes Montgomery – Full House(1962)
PHP, jQuery + ajax 連携練習
最寄駅の時刻表を見て、いちいちNaviTimeやらを使って新宿駅に到着する時間を調べるのが面倒。
そんなニーズに応えるため、この時刻表(最寄駅は変えてあります)のページに細工をして、マウスカーソルを合わせると新宿駅到着時刻が出てくるようにした。
クライアント側ではページロード後に、時刻表から発時刻をサーバーにajaxで送って、新宿駅到着時間を返してもらう。サーバー側では、発駅発時刻を入力すると新宿駅までの経路を判定して文字列を返すPHPスクリプトを書く(実はこっちの方が面倒)。TrainNaviで作ったデータベースをそのまんま使用した。
さて、すべての時間を一気にajaxで問い合わせると、リクエストが200はあるから貧弱な自宅PCが悲鳴を上げそうだ。しかし、asyncをやめて順次問い合わせにすると、ページが表示されるまでとても時間がかかってしまう。というわけで、asyncにしつつ、1つ処理が終わったら次の処理を実行するようなチェーンの仕組みが必要だ。
概念図
処理開始→ajax処理 →ajax処理 →ajax処理・・・ ↓ ↑ ↓ ↑ 処理終了→↑処理終了→↑ ↓ ↓ コールバック コールバック
出来上がったコード(開始駅を変えてあります)
//ajax処理をするメイン関数 function ktmain(start, end, time, service, cbObj, nextObj){ $.ajax({ async: true, type: "POST", url: "ktajax.php", data: { start : start, end : end, time : time, service : service } }).done(function( msg ) { //コールバック(DOMの要素にmsgをセット) cbObj.callback(msg); //次なるktmainをコール あらかじめnextObjに引数などを保存してある if(nextObj) nextObj.next(); }); } //コールバック用オブジェクト var KTCallBackObject = (function (){ function KTCallBackObject(dom) { this.dom = dom; }; KTCallBackObject.prototype.callback = function(msg){ //title属性をmsgに変更 this.dom.title = msg; } return KTCallBackObject; })(); //メソッド実行用オブジェクト var KTNextObject = (function (){ function KTNextObject(start, end, time, service, cbObj) { this.start = start; this.end = end; this.time = time; this.service = service; this.cbObj = cbObj; this.nextObj = null; }; KTNextObject.prototype.next = function(){ //次の関数をコール ktmain(this.start, this.end, this.time, this.service, this.cbObj, this.nextObj); } return KTNextObject; })(); //メソッドチェーンを作成する function MakeMethodChain(base, start, end, service){ var nextObjFirst, nextObjBefore; for(var i=1; i<=21; i++){ var snum = ("0" + i).slice(-2); var selector = "." + base + snum; var root = $(selector); if(root.size()){ //時刻 var hour = root.find(".diaHour").html(); var items = root.find("a"); for(var j=0; j<items.size(); j++){ //分 var minute = items[j].innerHTML.replace(/\s| /g,"").substr(0, 2); var time = hour + ":" + minute; //コールバック用オブジェクト var cbObj = new KTCallBackObject(items[j]); //次のメソッド実行用オブジェクト var nextObj = new KTNextObject(start, end, time, service, cbObj); //関連付けてチェーン作成 if(nextObjBefore) nextObjBefore.nextObj = nextObj; if(!nextObjFirst) nextObjFirst = nextObj; nextObjBefore = nextObj; } } } //先頭のメソッド実行用オブジェクトを返す return nextObjFirst; } function DOMManupilation(){ var start = $("#station-name").find("a").html(); var end = (start == "足柄") ? "新宿" : "足柄"; //メソッドチェーンを作って、順次実行 //平日 var mcWeekday = MakeMethodChain("t1-time", start, end, 1); //休日 var mcHoliday = MakeMethodChain("t3-time", start, end, 2); //fire //平日・休日 2列並列順次実行 mcWeekday.next(); mcHoliday.next(); } $(document).ready(DOMManupilation);
これで、処理終了ごとにktmainがコールされることになり、しかもページの表示を妨げない。実行すると、4時台、5時台、・・・と処理が進んでいって、終電のtitle属性の表示が変わったのは30秒ほど後。やっぱりasyncなしじゃきついね。
サーバー側(開始駅を変えてあります)やっつけ
<?php require_once 'funcs.php'; $start = $_POST["start"]; $end = $_POST["end"]; $service = $_POST["service"]; $time = $_POST["time"]; if(strlen($time) == 4) $time = "0" . $time; if($start == "足柄"){ AshigaraShinjuku($service, $time); } function AshigaraShinjuku($service, $time){ $mysqli = OpenDb(); //足柄発の電車 $query = "SELECT * FROM tnroute WHERE linename = '小田急小田原線' AND startstation = '足柄' AND endstation='螢田' AND starttime='$time' AND service=$service"; $result = ExecQuery($mysqli, $query); if($result->num_rows == 0) return; $row = $result->fetch_assoc(); $trainname = $row['trainname']; $trainkind = TrainKind($mysqli, $service, $trainname); $train = Train($mysqli, $service, $trainname); $dest = $train[count($train)-1]['endstation']; echo "$trainkind $dest"."行\n"; echo "螢田 $time"."発\n↓\n"; if($dest == "新松田" || $dest == "相模大野"){ //終点で乗り換える $endtime = TimeTrim($train[count($train)-1]['endtime']); echo "$dest $endtime"."着\n\n"; $trainname = SearchNorikae($mysqli, $endtime, $dest, $service, true); $trainkind = TrainKind($mysqli, $service, $trainname); $train = Train($mysqli, $service, $trainname); $current = $dest; $dest = $train[count($train)-1]['endstation']; $loc = StartStation($train, $current); $starttime = TimeTrim($train[$loc]['starttime']); echo "$trainkind $dest"."行\n"; echo "$current $starttime"."発\n↓\n"; if(strpos($trainkind, "はこね") !== FALSE) { $endtime = TimeTrim($train[count($train)-1]['endtime']); echo "$dest $endtime"."着\n\n"; //ロマンスカーを使った場合は、もう一度検索 echo "(ロマンスカーを使わない場合)\n\n"; $trainname = SearchNorikae($mysqli, $starttime, $current, $service, true); $trainkind = TrainKind($mysqli, $service, $trainname); $train = Train($mysqli, $service, $trainname); $dest = $train[count($train)-1]['endstation']; $loc = StartStation($train, $current); $starttime = TimeTrim($train[$loc]['starttime']); echo "$trainkind $dest"."行\n"; echo "$current $starttime"."発\n↓\n"; } } else if($dest == "町田"){ //相模大野で乗り換える $loc = StartStation($train, "小田急相模原"); if($loc == -1) $loc = StartStation($train, "海老名"); $endtime = TimeTrim($train[$loc]['endtime']); $new_trainname = SearchNorikae($mysqli, $endtime, "相模大野", $service, true); if($new_trainname != $trainname) { echo "相模大野 $endtime"."着\n\n"; $trainname = $new_trainname; $trainkind = TrainKind($mysqli, $service, $trainname); $train = Train($mysqli, $service, $trainname); $current = "相模大野"; $dest = $train[count($train)-1]['endstation']; $loc = StartStation($train, $current); $starttime = TimeTrim($train[$loc]['starttime']); echo "$trainkind $dest"."行\n"; echo "$current $starttime"."発\n↓\n"; } else { //乗り換えないでよかった //$endtime = TimeTrim($train[count($train)-1]['endtime']); //echo "$dest $endtime"."着\n\n"; } } else if(ExistStation($train, "新松田") && $dest != "成城学園前" && $time != "00:12"){ //新松田で乗り換える $loc = StartStation($train, "新松田"); $endtime = TimeTrim($train[$loc]['starttime']); echo "新松田 $endtime"."着\n\n"; $trainname = SearchNorikae($mysqli, $endtime, "新松田", $service, true); $trainkind = TrainKind($mysqli, $service, $trainname); $train = Train($mysqli, $service, $trainname); $current = "新松田"; $dest = $train[count($train)-1]['endstation']; $loc = StartStation($train, $current); $starttime = TimeTrim($train[$loc]['starttime']); echo "$trainkind $dest"."行\n"; echo "$current $starttime"."発\n↓\n"; } $endtime = TimeTrim($train[count($train)-1]['endtime']); echo "$dest $endtime"."着\n\n"; if($dest == "経堂" || $dest == "成城学園前" || ($dest == "町田" && $time == "00:12")){ echo "新宿に着けません"; } else if($dest != "新宿"){ //新宿につかなかったのでもう一本 $trainname = SearchNorikae($mysqli, $endtime, $dest, $service, true); $trainkind = TrainKind($mysqli, $service, $trainname); $train = Train($mysqli, $service, $trainname); $current = $dest; $dest = $train[count($train)-1]['endstation']; $loc = StartStation($train, $current); $starttime = TimeTrim($train[$loc]['starttime']); echo "$trainkind $dest"."行\n"; echo "$current $starttime"."発\n↓\n"; $endtime = TimeTrim($train[count($train)-1]['endtime']); echo "$dest $endtime"."着\n\n"; } } function TrainKind($mysqli, $service, $trainname){ $query = "SELECT * FROM tntrain WHERE linename = '小田急小田原線' AND trainname = '$trainname' AND service=$service"; $result = ExecQuery($mysqli, $query); $row = $result->fetch_assoc(); return $row['trainkind']; } function Train($mysqli, $service, $trainname){ $query = "SELECT * FROM tnroute WHERE linename = '小田急小田原線' AND trainname = '$trainname' AND service=$service"; $result = ExecQuery($mysqli, $query); $train = array(); while($row = $result->fetch_assoc()){ $train[] = $row; } return $train; } function ExistStation($train, $station){ for($i=0; $i<count($train); $i++){ if($train[$i]['endstation'] == $station) return $i; } return false; } function StartStation($train, $station){ for($i=0; $i<count($train); $i++){ if($train[$i]['startstation'] == $station) return $i; } return -1; } function TimeTrim($time){ return substr($time, 0, 5); } function SearchNorikae($mysqli, $time, $station, $service, $up){ $query = "SELECT * FROM tnroute WHERE linename = '小田急小田原線' AND startstation = '$station' AND starttime>'$time' AND service=$service"; if($up){ if($station == "新松田"){ $query .= " AND (endstation = '渋沢' OR endstation = '本厚木')"; }else if($station == "相模大野"){ $query .= " AND endstation = '町田'"; }else if($station == "町田"){ $query .= " AND endstation = '新百合ヶ丘'"; } } $query .= " ORDER BY starttime ASC"; $result = ExecQuery($mysqli, $query); $row = $result->fetch_assoc(); return $row['trainname']; } ?>