乱数に基づいた株価データ

個別銘柄の4本値データとmarket indexのデータをランダムに生成するデータセットである。 データの生成にはNysolをインストールしておく必要がある。 個別銘柄のデータイメージは 表 2 に示される通りで。 銘柄ID( id )、日付( date )、 始値( o )、 高値( h )、 安値( l )、 終値( c ) の6項目から構成されるデータセットである。 marketインデックスは個別銘柄の日別単純平均で計算したもので、 そのデータイメージを 表 3 に示している。 それぞれの項目は基本的には乱数に基づいて生成されており、その概要を 表 4 に示している。

表 2 個別銘柄の4本値データ

id

date

o

h

l

c

1000

20180628

63427

63492

58474

61979

1000

20180627

61341

65684

61341

63604

1000

20180626

64200

66672

62960

64267

1000

20180625

65361

66354

63189

65268

:

:

:

:

:

:

表 3 marketインデックスデータ

date

i

19861118

316

19861119

314

19861120

321

19861121

325

:

:

表 4 データの生成方法

項目名

生成方法

id

1000〜6999の6000の銘柄を生成している。

date

\(N(m=4600,s=2000)\) の正規乱数(整数)で存続日数を生成し、
2018年6月29日からその日数分過去に遡った日まで生成している。
期間が1000日に満たなければ1000日に修正している。

o

ベース価格を \(N(m=4600,s=2000)\) の正規乱数(整数)で決め、
\(N(m=1.0,s=0.02)\) の正規乱数を掛けたもの。

h

ベース価格に \(N(m=1.04,s=0.02)\) の正規乱数を掛けたものをpとすると、
h=max(o,c,p) により設定している。

l

ベース価格に \(N(m=0.96,s=0.02)\) の正規乱数を掛けたものをpとすると、
l=max(o,c,p) により設定している。

c

oと同じ方法で生成。

i

全個別銘柄の終値 c を日別に単純平均して整数化したもの。

データ生成のスクリプトを リスト 12 に示す。 このスクリプトを実行すると、 リスト 13 に示されるように、 6000の個別銘柄のデータが順番に生成されていき、10分程で全データが生成される。 そして、カレントディレクトリの下に、 表 5 に示されるディレクトリ/ファイルが生成される。

リスト 12 株価をランダムに生成するスクリプト
 1#!/usr/bin/env python
 2# -*- coding: utf-8 -*-/
 3from datetime import datetime,timedelta
 4import os
 5import numpy as np
 6import nysol.mcmd as nm
 7
 8def mkData(oFile):
 9  np.random.seed(seed=32)
10  startDate=datetime(2018, 6, 29)
11  delta=timedelta(days=1)
12
13  with open(oFile,"w") as fpw:
14    fpw.write("id,date,o,h,l,c\n")
15    for id in range(1000,7000):
16    #for id in range(1000,1002):
17      period=int(np.random.normal(4600,2000))
18      if period<1000:
19        period=1000
20      print("id",id,"period",period)
21      date=startDate
22      c=np.random.randint(500,100000)
23      for days in range(period):
24        if c<10:
25          break
26        c=np.random.normal(1.00,0.02)*c
27        o=np.random.normal(1.00,0.02)*c
28        h=np.random.normal(1.04,0.02)*c
29        l=np.random.normal(0.96,0.02)*c
30        hh=max(c,o,h,l)
31        ll=min(c,o,h,l)
32        h=hh
33        l=ll
34        date=date-delta
35        fpw.write("%d,%s,%d,%d,%d,%d\n"%(id,date.strftime("%Y%m%d"),o,h,l,c))
36
37def mkIndex(oFile,iFile):
38  f=None
39  f <<= nm.mcat(i=iFile)
40  f <<= nm.mcut(f="date,c")
41  f <<= nm.mavg(k="date",f="c")
42  f <<= nm.mcal(c="round(${c},1)", a="i")
43  f <<= nm.mcut(f="date,i", o="%s"%oFile)
44  f.run()
45
46os.system("mkdir -p DATA")
47mkData("./DATA/price_large.csv")
48mkIndex("./DATA/index.csv","./DATA/price_large.csv")
49
50nm.mselnum(f="date",c="[20171225,]",i="./DATA/price_large.csv",o="./DATA/price_middle.csv").run()
51nm.mselnum(f="date",c="[20180610,]",i="./DATA/price_middle.csv",o="./DATA/price_small.csv").run()
52nm.msep(d="./DATA/sep/${date}", p=True, i="./DATA/price_large.csv").run()
リスト 13 株価生成スクリプトの実行
1$ ./mkdata.py
2id 1000 period 3902
3id 1001 period 6941
4id 1002 period 5896
5         :
6id 6999 period ....
表 5 生成されるデータ一覧

ファイル名

行数(ヘッダ含む)

サイズ

内容

price_large.csv

27,707,820

1,032,785,399

個別銘柄別4本値データ

price_middle.csv

1,116,001

42,182,505

price_large.csvから2017年12月25日以降のデータを選択したもの

price_small.csv

114,001

4,297,064

price_large.csvから2018年6月10日以降のデータを選択したもの

index.csv

11,547

172,763

marketインデックスデータ

sep

11,546(ファイル数)

price_large.csvを日別ファイルにしたもの