乱数に基づいた株価データ¶
個別銘柄の4本値データとmarket indexのデータをランダムに生成するデータセットである。
データの生成にはNysolをインストールしておく必要がある。
個別銘柄のデータイメージは 表 2 に示される通りで。
銘柄ID( id
)、日付( date
)、 始値( o
)、 高値( h
)、 安値( l
)、 終値( c
)
の6項目から構成されるデータセットである。
marketインデックスは個別銘柄の日別単純平均で計算したもので、
そのデータイメージを 表 3 に示している。
それぞれの項目は基本的には乱数に基づいて生成されており、その概要を 表 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 |
: |
: |
: |
: |
: |
: |
date |
i |
---|---|
19861118 |
316 |
19861119 |
314 |
19861120 |
321 |
19861121 |
325 |
: |
: |
項目名 |
生成方法 |
---|---|
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 |
全個別銘柄の終値 |
データ生成のスクリプトを リスト 12 に示す。 このスクリプトを実行すると、 リスト 13 に示されるように、 6000の個別銘柄のデータが順番に生成されていき、10分程で全データが生成される。 そして、カレントディレクトリの下に、 表 5 に示されるディレクトリ/ファイルが生成される。
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()1$ ./mkdata.py 2id 1000 period 3902 3id 1001 period 6941 4id 1002 period 5896 5 : 6id 6999 period ....
ファイル名 |
行数(ヘッダ含む) |
サイズ |
内容 |
---|---|---|---|
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を日別ファイルにしたもの |