81 lines
2.6 KiB
Python
81 lines
2.6 KiB
Python
from __future__ import print_function
|
|
|
|
import calendar
|
|
import copy
|
|
import datetime
|
|
import os, os.path
|
|
import sys
|
|
|
|
import numpy as np
|
|
import pandas as pd
|
|
|
|
from qsforex import settings
|
|
|
|
|
|
def month_weekdays(year_int, month_int):
|
|
"""
|
|
Produces a list of datetime.date objects representing the
|
|
weekdays in a particular month, given a year.
|
|
"""
|
|
cal = calendar.Calendar()
|
|
return [
|
|
d for d in cal.itermonthdates(year_int, month_int)
|
|
if d.weekday() < 5 and d.year == year_int
|
|
]
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
pair = sys.argv[1]
|
|
except IndexError:
|
|
print("You need to enter a currency pair, e.g. GBPUSD, as a command line parameter.")
|
|
else:
|
|
np.random.seed(42) # Fix the randomness
|
|
|
|
S0 = 1.5000
|
|
spread = 0.002
|
|
mu_dt = 1400 # Milliseconds
|
|
sigma_dt = 100 # Millseconds
|
|
ask = copy.deepcopy(S0) + spread / 2.0
|
|
bid = copy.deepcopy(S0) - spread / 2.0
|
|
days = month_weekdays(2014, 1) # January 2014
|
|
current_time = datetime.datetime(
|
|
days[0].year, days[0].month, days[0].day, 0, 0, 0,
|
|
)
|
|
|
|
# Loop over every day in the month and create a CSV file
|
|
# for each day, e.g. "GBPUSD_20150101.csv"
|
|
for d in days:
|
|
print(d.day)
|
|
current_time = current_time.replace(day=d.day)
|
|
outfile = open(
|
|
os.path.join(
|
|
settings.CSV_DATA_DIR,
|
|
"%s_%s.csv" % (
|
|
pair, d.strftime("%Y%m%d")
|
|
)
|
|
),
|
|
"w")
|
|
outfile.write("Time,Ask,Bid,AskVolume,BidVolume\n")
|
|
|
|
# Create the random walk for the bid/ask prices
|
|
# with fixed spread between them
|
|
while True:
|
|
dt = abs(np.random.normal(mu_dt, sigma_dt))
|
|
current_time += datetime.timedelta(0, 0, 0, dt)
|
|
if current_time.day != d.day:
|
|
outfile.close()
|
|
break
|
|
else:
|
|
W = np.random.standard_normal() * dt / 1000.0 / 86400.0
|
|
ask += W
|
|
bid += W
|
|
ask_volume = 1.0 + np.random.uniform(0.0, 2.0)
|
|
bid_volume = 1.0 + np.random.uniform(0.0, 2.0)
|
|
line = "%s,%s,%s,%s,%s\n" % (
|
|
current_time.strftime("%d.%m.%Y %H:%M:%S.%f")[:-3],
|
|
"%0.5f" % ask, "%0.5f" % bid,
|
|
"%0.2f00" % ask_volume, "%0.2f00" % bid_volume
|
|
)
|
|
outfile.write(line)
|