日経225先物のシステムトレードを動かす基盤を、MacBook Pro 上の Parallels(Windows) から さくらのVPS for Windows Server に載せ替えた。この記事はその構築編。VPS を契約してから、開発環境を整え、外部公開できるようにするまでの 汎用部分 をまとめる。
kabuステーション や自作システム「Logical225」の載せ方は、続きの アプリ運用編 に分けた。
なぜ移したか — 持ち歩く構成の限界
これまで、自動売買システムは MacBook Pro の中の Parallels(Windows) で動かしていた。kabuステーションは Windows 専用アプリなので、Mac の中に Windows を立てて運用する形だ。
ただ、この構成には弱点が積み重なっていた。
- Mac をスリープできない: 中の Windows と kabuステーションを動かし続けるため、母艦の Mac を眠らせられない
- Windows もスリープ・再起動が制御しきれない: クライアント版 Windows なので Update 等で再起動が絡みやすく、24時間の連続稼働に向かない
- 再起動後にアプリの立て直しを忘れると成績に響く: Windows が再起動すると kabuステーションや自作システムを起動し直す必要があるが、それを忘れると売買が止まる。気づかないうちに発注できていない時間が生まれ、運用成績にも影響が出た
- 持ち出すとバッテリーが溶ける: MacBook を外に持ち出すと、Windows + アプリを回しっぱなしで電池の消耗が激しい
- ネット切断で kabuステーションがログアウト: 移動中に回線が切れるとセッションが落ち、API も止まる
- Mac の再起動に巻き込まれる: 母艦が再起動すれば当然すべて道連れ
つまり「持ち歩く端末」と「24時間止めたくない売買基盤」は、そもそも相性が悪い。このブログは「移動しながら働く」検証がテーマだが、トレード基盤については逆に 手元から切り離してクラウドに常駐させる のが正解だった。
そこで さくらのVPS for Windows Server に丸ごと移すことにした。端末の電源・回線・再起動から完全に独立して、サーバーが黙々と動き続ける状態を目指す。
事前準備
契約・Windows起動・初回ログイン
さくらのVPS for Windows Server を契約し、コントロールパネルから Windows を起動。最初は VNCコンソール から Windows にログインする(初期ユーザーは Administrator + 申込時の初期パスワード)。
Administratorのユーザー名を変更する
RDP はインターネットに公開され、Administrator という既定名は総当たりで狙われやすい。ユーザー名を変更しておくと、攻撃のハードルが一段上がる(さくら公式推奨)。
手順はさくら公式マニュアル: Administratorのアカウント名変更
Windows App(リモートデスクトップ)で接続する
以降の作業は VNC ではなく、手元の Mac から Windows App(リモートデスクトップ=RDP) で繋ぐと快適。サーバーのIPアドレスと、変更後のユーザー名・パスワードで接続する。
RDP は「遠隔で相手の Windows デスクトップを操作する仕組み」。作業を終えるときは サインアウトせず「切断」 で抜ける(サインアウトすると中で動かしているアプリが終了してしまう)。
初期設定
スリープ・画面オフを無効化する
サーバーが勝手に省電力で止まらないよう、各タイムアウトを無効化する。
powercfg /change standby-timeout-ac 0
powercfg /change monitor-timeout-ac 0
powercfg /change hibernate-timeout-ac 0
powercfg /change disk-timeout-ac 0
0= 無効(タイムアウトなし)
Windows Updateを「通知のみ」にする
勝手にダウンロード・再起動されると稼働が途切れるので、通知だけに変更する。
$au = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU"
New-Item -Path $au -Force | Out-Null
New-ItemProperty -Path $au -Name "NoAutoUpdate" -PropertyType DWord -Value 0 -Force | Out-Null
New-ItemProperty -Path $au -Name "AUOptions" -PropertyType DWord -Value 2 -Force | Out-Null
New-ItemProperty -Path $au -Name "NoAutoRebootWithLoggedOnUsers" -PropertyType DWord -Value 1 -Force | Out-Null
gpupdate /force
AUOptions=2… 更新を検出しても「ダウンロード前に通知」だけNoAutoRebootWithLoggedOnUsers=1… ログオン中は自動再起動しない(保険)
これらは設定変更なので、適用に 再起動は不要(gpupdate /force で反映済み)。
セキュリティ
公開サーバーなので、最低限の守りを入れておく。
総当たり対策(アカウントロックアウト)
固定IPがなくアクセス元を絞れない運用では、ログイン失敗回数で締めるのが現実的。
# 10回失敗で30分ロック、失敗カウンタは30分でリセット
net accounts /lockoutthreshold:10 /lockoutduration:30 /lockoutwindow:30
net accounts # 確認
注意: 「さくらのVPS for Windows Server」では、Linux版にある さくらのパケットフィルタが使えない。つまり Windows ファイアウォールが唯一の防壁 になる。だからこそ、ユーザー名変更・ロックアウト・強固なパスワード、そして「不要なポートは開けない」ことがより重要になる。
開発・実行環境の準備
Node.js
winget install OpenJS.NodeJS.LTS --source winget
node -v # 確認
npm -v
--source wingetは、msstore ソースが証明書エラー(0x8a15005e)で失敗するときの回避策- インストール後に
nodeが「認識されません」と出たら、PATH が現在のセッションに未反映なだけ。PowerShellを開き直すと通る - うまくいかなければ公式インストーラ: https://nodejs.org/ja/download
Git
winget install Git.Git --source winget
git --version # 確認
- 同じく
node同様、認識されない時は PowerShell を開き直す - 公式インストーラ: https://git-scm.com/download/win
これで「開発できる Windows サーバー」が一通り整った。
外部公開(ngrok)
作ったアプリ(このあとのアプリ運用編で動かす Logical225)を、外部のブラウザから使えるようにする。ここでは ngrok を使う。
ngrok は「サーバーから外向きにトンネルを張る」方式で、ポート開放不要・HTTPS付きで公開できる。localhost:3000 を、ngrok の固定ドメインに HTTPS で晒すイメージだ。
インストール
winget install ngrok.ngrok --source winget
ngrok version # 確認
- winget が古い版を入れることがある。
ERR_NGROK_121(agent version too old)が出たら更新する:
ngrok update # 自己更新。失敗するなら公式zipのngrok.exeで差し替え
認証トークンを設定
ngrok のダッシュボードで取得したトークンを登録する。
ngrok config add-authtoken <あなたのトークン>
固定ドメインで公開する
ngrok は 無料プランでも固定ドメインが1つ 割り当てられる(ダッシュボードの Domains で確認。例 xxxx.ngrok-free.app)。--domain を付ければ毎回同じURLになる。
ngrok http --domain=xxxx.ngrok-free.app 3000
https://xxxx.ngrok-free.appで常に同じURLでアクセスできる(HTTPSは ngrok が自動付与)- 固定ドメインは永久に自分のもの。ただし 名前は自動割り当てで変更不可(カスタム名・独自ドメインは有料)
--domainなしのngrok http 3000だと、起動ごとにURLが変わるランダム版になる
無料プランの主な制限:
- HTTPリクエスト 20,000回/月 / 帯域 1GB/月 / 同時エンドポイント 3つ
- アクセス時に 警告ページ(interstitial)が挟まる
(参考)ポート開放で直接公開する
ngrok を使わず、素早く疎通だけ確認したいとき限定の方法。本番では使わない。
New-NetFirewallRule -DisplayName "Logical225" -Direction Inbound -Protocol TCP -LocalPort 3000 -Action Allow
http://<VPSのIPアドレス>:3000でアクセス。平文HTTPなので動作確認専用- 確認が終わったら閉じる:
Remove-NetFirewallRule -DisplayName "Logical225"
次にやること
これで、VPS 上に「開発できて、外部公開もできる」土台ができた。
- 続き → アプリ運用編: kabuステーションAPI と自作システム Logical225 を載せて動かす
- HTTPS化(独自ドメイン / Cloudflare Tunnel) と 常駐化(再起動後の自動起動) は別の機会にまとめる