エンジニアリングとお金の話

都内で働くエンジニアの日記です。

【技術】投資シュミレーションツールが出来た

【SPONSORED LINK】

以前より作成していた投資シュミレーションツールが完成した。思っていたよりも規模が大きくなってしまい時間が掛かってしまった。

作成したモジュールは全部で6つとなったそれぞれの役割は↓な感じである。

  • MoneyManage.py(購入資金管理用)
  • Stock.py(株式購入判定情報取得用)
  • Trade.py(株式購入判定用)
  • dateTools.py(日付取得用)
  • stockCode.py(証券コード取得用)
  • stockPrice.py(証券価格取得用)

https://github.com/hatakazu/financeTools

処理内容はTrade.pyで対象期間分処理を繰り返し、その際に購入判定処理と売却判定処理を実施し条件に合致したら処理を実施するという内容である。今回は初期資金500万円で2015年1月1日〜8月1日までで処理を実施する事とした。なお、売買条件は株価が10日間の標準偏差より下がった場合に購入し、その後株価10%値上がりか、10%値下がりした際に売却を行う。Trade.pyの内容はこんな感じである。

#-*- coding:utf8 -*-
from Stock import Stock
from MoneyManage import MoneyManage
from dateutil.relativedelta import *
from dateutil.rrule import *
from datetime import datetime
import dateTools

class Trade():
    def __init__(self,funds):
        self.money = MoneyManage(funds)
        self.stock = Stock()

    #購入判定処理    
    def buyDecision(self,code,day):
        #始値を取得
        startPrice=self.stock.currentStartPrice(code,day)
        #終値を取得
        endPrice=self.stock.currentEndPrice(code,day)
        #標準偏差(10日間)を取得
        std=self.stock.singleStd(code,day,10)

        #始値から標準偏差を引いた分より終値が下回った場合購入
        if (startPrice-std) > endPrice: 
            buyDay = dateTools.dateNext(day)
            buyCount = 100
            buyPrice = self.stock.currentStartPrice(code,buyDay)
            self.money.buy(buyDay,code,buyPrice,buyCount,1)

    #売却判定処理    
    def sellDecision(self,day):
        #保有銘柄分処理を実施
        for key,value in self.money.stockHold().items():
            #現在株価を取得
            currentStockPrice = self.stock.currentStartPrice(key[1],day)

            #株価が購入時より10%値上がりした際に売却
            if int(value[0])*int(value[1])*1.1 < int(currentStockPrice) * int(value[1]):
                self.money.sell(key[0],key[1],currentStockPrice)
            #株価が購入時より10%値下がりした際に売却
            elif int(value[0])*int(value[1]) * 0.9 > int(currentStockPrice) * int(value[1]):
                self.money.sell(key[0],key[1],currentStockPrice)

def main():
    #初期資金(500万円)を登録
    trade=Trade(5000000)
    #対象期間分処理を実施
    for day in dateTools.dateRangeWeekday(20150101,20150801):
        #トヨタ(7203)にてトレードを実施
        #購入判定処理
        trade.buyDecision(7203,day)
        #売却判定処理
        trade.sellDecision(day)
    print trade.money.show()

if __name__ == '__main__':
    main()

処理結果

***************************
money       :435500      #現金保有額
stockPrice :3970500       #株式保有額
totalPrice  :4406000      #総額
***************************

結果としては、現在の売買条件では60万程マイナスになる事が分かった。簡単に投資シュミレーションが出来るのは凄く便利である。勝てる条件を検討し今後の投資に役立てて行きたい。