initial commit
This commit is contained in:
commit
62fbec9b44
40
.gitignore
vendored
Normal file
40
.gitignore
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
*.csv
|
||||
*.obj
|
||||
*.exe
|
||||
*.lst
|
||||
*.tmp
|
||||
|
||||
# tex
|
||||
*.aux
|
||||
*.lof
|
||||
*.log
|
||||
*.lot
|
||||
*.fls
|
||||
*.out
|
||||
*.toc
|
||||
*.fmt
|
||||
*.fot
|
||||
*.cb
|
||||
*.cb2
|
||||
.*.lb
|
||||
*.pdf
|
||||
|
||||
## Build tool auxiliary files:
|
||||
*.fdb_latexmk
|
||||
*.synctex
|
||||
*.synctex(busy)
|
||||
*.synctex.gz
|
||||
*.synctex.gz(busy)
|
||||
*.pdfsync
|
||||
|
||||
# hyperref
|
||||
*.brf
|
||||
|
||||
# listings
|
||||
*.lol
|
||||
|
||||
# makeidx
|
||||
*.idx
|
||||
*.ilg
|
||||
*.ind
|
||||
*.ist
|
401
argh.h
Normal file
401
argh.h
Normal file
@ -0,0 +1,401 @@
|
||||
#pragma once
|
||||
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include <cassert>
|
||||
|
||||
namespace argh
|
||||
{
|
||||
// Terminology:
|
||||
// A command line is composed of 2 types of args:
|
||||
// 1. Positional args, i.e. free standing values
|
||||
// 2. Options: args beginning with '-'. We identify two kinds:
|
||||
// 2.1: Flags: boolean options => (exist ? true : false)
|
||||
// 2.2: Parameters: a name followed by a non-option value
|
||||
|
||||
#if !defined(__GNUC__) || (__GNUC__ >= 5)
|
||||
using string_stream = std::istringstream;
|
||||
#else
|
||||
// Until GCC 5, istringstream did not have a move constructor.
|
||||
// stringstream_proxy is used instead, as a workaround.
|
||||
class stringstream_proxy
|
||||
{
|
||||
public:
|
||||
stringstream_proxy() = default;
|
||||
|
||||
// Construct with a value.
|
||||
stringstream_proxy(std::string const& value) :
|
||||
stream_(value)
|
||||
{}
|
||||
|
||||
// Copy constructor.
|
||||
stringstream_proxy(const stringstream_proxy& other) :
|
||||
stream_(other.stream_.str())
|
||||
{
|
||||
stream_.setstate(other.stream_.rdstate());
|
||||
}
|
||||
|
||||
void setstate(std::ios_base::iostate state) { stream_.setstate(state); }
|
||||
|
||||
// Stream out the value of the parameter.
|
||||
// If the conversion was not possible, the stream will enter the fail state,
|
||||
// and operator bool will return false.
|
||||
template<typename T>
|
||||
stringstream_proxy& operator >> (T& thing)
|
||||
{
|
||||
stream_ >> thing;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// Get the string value.
|
||||
std::string str() const { return stream_.str(); }
|
||||
|
||||
std::stringbuf* rdbuf() const { return stream_.rdbuf(); }
|
||||
|
||||
// Check the state of the stream.
|
||||
// False when the most recent stream operation failed
|
||||
operator bool() const { return !!stream_; }
|
||||
|
||||
~stringstream_proxy() = default;
|
||||
private:
|
||||
std::istringstream stream_;
|
||||
};
|
||||
using string_stream = stringstream_proxy;
|
||||
#endif
|
||||
|
||||
class parser
|
||||
{
|
||||
public:
|
||||
enum Mode { PREFER_FLAG_FOR_UNREG_OPTION = 1 << 0,
|
||||
PREFER_PARAM_FOR_UNREG_OPTION = 1 << 1,
|
||||
NO_SPLIT_ON_EQUALSIGN = 1 << 2,
|
||||
SINGLE_DASH_IS_MULTIFLAG = 1 << 3,
|
||||
};
|
||||
|
||||
parser() = default;
|
||||
|
||||
parser(std::initializer_list<char const* const> pre_reg_names)
|
||||
{ add_params(pre_reg_names); }
|
||||
|
||||
parser(const char* const argv[], int mode = PREFER_FLAG_FOR_UNREG_OPTION)
|
||||
{ parse(argv, mode); }
|
||||
|
||||
parser(int argc, const char* const argv[], int mode = PREFER_FLAG_FOR_UNREG_OPTION)
|
||||
{ parse(argc, argv, mode); }
|
||||
|
||||
void add_param(std::string const& name);
|
||||
void add_params(std::initializer_list<char const* const> init_list);
|
||||
|
||||
void parse(const char* const argv[], int mode = PREFER_FLAG_FOR_UNREG_OPTION);
|
||||
void parse(int argc, const char* const argv[], int mode = PREFER_FLAG_FOR_UNREG_OPTION);
|
||||
|
||||
std::multiset<std::string> const& flags() const { return flags_; }
|
||||
std::map<std::string, std::string> const& params() const { return params_; }
|
||||
std::vector<std::string> const& pos_args() const { return pos_args_; }
|
||||
|
||||
// begin() and end() for using range-for over positional args.
|
||||
std::vector<std::string>::const_iterator begin() const { return pos_args_.cbegin(); }
|
||||
std::vector<std::string>::const_iterator end() const { return pos_args_.cend(); }
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Accessors
|
||||
|
||||
// flag (boolean) accessors: return true if the flag appeared, otherwise false.
|
||||
bool operator[](std::string const& name) const;
|
||||
|
||||
// multiple flag (boolean) accessors: return true if at least one of the flag appeared, otherwise false.
|
||||
bool operator[](std::initializer_list<char const* const> init_list) const;
|
||||
|
||||
// returns positional arg string by order. Like argv[] but without the options
|
||||
std::string const& operator[](size_t ind) const;
|
||||
|
||||
// returns a std::istream that can be used to convert a positional arg to a typed value.
|
||||
string_stream operator()(size_t ind) const;
|
||||
|
||||
// same as above, but with a default value in case the arg is missing (index out of range).
|
||||
template<typename T>
|
||||
string_stream operator()(size_t ind, T&& def_val) const;
|
||||
|
||||
// parameter accessors, give a name get an std::istream that can be used to convert to a typed value.
|
||||
// call .str() on result to get as string
|
||||
string_stream operator()(std::string const& name) const;
|
||||
|
||||
// accessor for a parameter with multiple names, give a list of names, get an std::istream that can be used to convert to a typed value.
|
||||
// call .str() on result to get as string
|
||||
// returns the first value in the list to be found.
|
||||
string_stream operator()(std::initializer_list<char const* const> init_list) const;
|
||||
|
||||
// same as above, but with a default value in case the param was missing.
|
||||
// Non-string def_val types must have an operator<<() (output stream operator)
|
||||
// If T only has an input stream operator, pass the string version of the type as in "3" instead of 3.
|
||||
template<typename T>
|
||||
string_stream operator()(std::string const& name, T&& def_val) const;
|
||||
|
||||
// same as above but for a list of names. returns the first value to be found.
|
||||
template<typename T>
|
||||
string_stream operator()(std::initializer_list<char const* const> init_list, T&& def_val) const;
|
||||
|
||||
private:
|
||||
string_stream bad_stream() const;
|
||||
std::string trim_leading_dashes(std::string const& name) const;
|
||||
bool is_number(std::string const& arg) const;
|
||||
bool is_option(std::string const& arg) const;
|
||||
bool got_flag(std::string const& name) const;
|
||||
|
||||
private:
|
||||
std::vector<std::string> args_;
|
||||
std::map<std::string, std::string> params_;
|
||||
std::vector<std::string> pos_args_;
|
||||
std::multiset<std::string> flags_;
|
||||
std::set<std::string> registeredParams_;
|
||||
std::string empty_;
|
||||
};
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline void parser::parse(const char * const argv[], int mode)
|
||||
{
|
||||
int argc = 0;
|
||||
for (auto argvp = argv; *argvp; ++argc, ++argvp);
|
||||
parse(argc, argv, mode);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline void parser::parse(int argc, const char* const argv[], int mode /*= PREFER_FLAG_FOR_UNREG_OPTION*/)
|
||||
{
|
||||
// convert to strings
|
||||
args_.resize(argc);
|
||||
std::transform(argv, argv + argc, args_.begin(), [](const char* const arg) { return arg; });
|
||||
|
||||
// parse line
|
||||
for (auto i = 0u; i < args_.size(); ++i)
|
||||
{
|
||||
if (!is_option(args_[i]))
|
||||
{
|
||||
pos_args_.emplace_back(args_[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
auto name = trim_leading_dashes(args_[i]);
|
||||
|
||||
if (!(mode & NO_SPLIT_ON_EQUALSIGN))
|
||||
{
|
||||
auto equalPos = name.find('=');
|
||||
if (equalPos != std::string::npos)
|
||||
{
|
||||
params_.insert({ name.substr(0, equalPos), name.substr(equalPos + 1) });
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// if the option is unregistered and should be a multi-flag
|
||||
if (1 == (args_[i].size() - name.size()) && // single dash
|
||||
argh::parser::SINGLE_DASH_IS_MULTIFLAG & mode && // multi-flag mode
|
||||
registeredParams_.find(name) == registeredParams_.end()) // unregistered
|
||||
{
|
||||
for (auto const& c : name)
|
||||
{
|
||||
flags_.emplace(std::string{ c });
|
||||
}
|
||||
}
|
||||
|
||||
// any potential option will get as its value the next arg, unless that arg is an option too
|
||||
// in that case it will be determined a flag.
|
||||
if (i == args_.size() - 1 || is_option(args_[i + 1]))
|
||||
{
|
||||
flags_.emplace(name);
|
||||
continue;
|
||||
}
|
||||
|
||||
// if 'name' is a pre-registered option, then the next arg cannot be a free parameter to it is skipped
|
||||
// otherwise we have 2 modes:
|
||||
// PREFER_FLAG_FOR_UNREG_OPTION: a non-registered 'name' is determined a flag.
|
||||
// The following value (the next arg) will be a free parameter.
|
||||
//
|
||||
// PREFER_PARAM_FOR_UNREG_OPTION: a non-registered 'name' is determined a parameter, the next arg
|
||||
// will be the value of that option.
|
||||
|
||||
if (registeredParams_.find(name) != registeredParams_.end() ||
|
||||
argh::parser::PREFER_PARAM_FOR_UNREG_OPTION & mode)
|
||||
{
|
||||
params_.insert({ name, args_[i + 1] });
|
||||
++i; // skip next value, it is not a free parameter
|
||||
continue;
|
||||
}
|
||||
|
||||
if (argh::parser::PREFER_FLAG_FOR_UNREG_OPTION & mode)
|
||||
flags_.emplace(name);
|
||||
};
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline string_stream parser::bad_stream() const
|
||||
{
|
||||
string_stream bad;
|
||||
bad.setstate(std::ios_base::failbit);
|
||||
return bad;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline bool parser::is_number(std::string const& arg) const
|
||||
{
|
||||
// inefficient but simple way to determine if a string is a number (which can start with a '-')
|
||||
std::istringstream istr(arg);
|
||||
double number;
|
||||
istr >> number;
|
||||
return !(istr.fail() || istr.bad());
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline bool parser::is_option(std::string const& arg) const
|
||||
{
|
||||
assert(0 != arg.size());
|
||||
if (is_number(arg))
|
||||
return false;
|
||||
return '-' == arg[0];
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline std::string parser::trim_leading_dashes(std::string const& name) const
|
||||
{
|
||||
auto pos = name.find_first_not_of('-');
|
||||
return std::string::npos != pos ? name.substr(pos) : name;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline bool argh::parser::got_flag(std::string const& name) const
|
||||
{
|
||||
return flags_.end() != flags_.find(trim_leading_dashes(name));
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline bool parser::operator[](std::string const& name) const
|
||||
{
|
||||
return got_flag(name);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline bool parser::operator[](std::initializer_list<char const* const> init_list) const
|
||||
{
|
||||
return std::any_of(init_list.begin(), init_list.end(), [&](char const* const name) { return got_flag(name); });
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline std::string const& parser::operator[](size_t ind) const
|
||||
{
|
||||
if (ind < pos_args_.size())
|
||||
return pos_args_[ind];
|
||||
return empty_;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline string_stream parser::operator()(std::string const& name) const
|
||||
{
|
||||
auto optIt = params_.find(trim_leading_dashes(name));
|
||||
if (params_.end() != optIt)
|
||||
return string_stream(optIt->second);
|
||||
return bad_stream();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline string_stream parser::operator()(std::initializer_list<char const* const> init_list) const
|
||||
{
|
||||
for (auto& name : init_list)
|
||||
{
|
||||
auto optIt = params_.find(trim_leading_dashes(name));
|
||||
if (params_.end() != optIt)
|
||||
return string_stream(optIt->second);
|
||||
}
|
||||
return bad_stream();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<typename T>
|
||||
string_stream parser::operator()(std::string const& name, T&& def_val) const
|
||||
{
|
||||
auto optIt = params_.find(trim_leading_dashes(name));
|
||||
if (params_.end() != optIt)
|
||||
return string_stream(optIt->second);
|
||||
|
||||
std::ostringstream ostr;
|
||||
ostr << def_val;
|
||||
return string_stream(ostr.str()); // use default
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// same as above but for a list of names. returns the first value to be found.
|
||||
template<typename T>
|
||||
string_stream parser::operator()(std::initializer_list<char const* const> init_list, T&& def_val) const
|
||||
{
|
||||
for (auto& name : init_list)
|
||||
{
|
||||
auto optIt = params_.find(trim_leading_dashes(name));
|
||||
if (params_.end() != optIt)
|
||||
return string_stream(optIt->second);
|
||||
}
|
||||
std::ostringstream ostr;
|
||||
ostr << def_val;
|
||||
return string_stream(ostr.str()); // use default
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline string_stream parser::operator()(size_t ind) const
|
||||
{
|
||||
if (pos_args_.size() <= ind)
|
||||
return bad_stream();
|
||||
|
||||
return string_stream(pos_args_[ind]);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<typename T>
|
||||
string_stream parser::operator()(size_t ind, T&& def_val) const
|
||||
{
|
||||
if (pos_args_.size() <= ind)
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
ostr << def_val;
|
||||
return string_stream(ostr.str());
|
||||
}
|
||||
|
||||
return string_stream(pos_args_[ind]);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline void parser::add_param(std::string const& name)
|
||||
{
|
||||
registeredParams_.insert(trim_leading_dashes(name));
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline void parser::add_params(std::initializer_list<char const* const> init_list)
|
||||
{
|
||||
for (auto& name : init_list)
|
||||
registeredParams_.insert(trim_leading_dashes(name));
|
||||
}
|
||||
}
|
||||
|
||||
|
684
data/bitcoin.dat
Normal file
684
data/bitcoin.dat
Normal file
@ -0,0 +1,684 @@
|
||||
8752.05
|
||||
8604.21
|
||||
8552.87
|
||||
8287.12
|
||||
8429.06
|
||||
8460.75
|
||||
8658.94
|
||||
8670.89
|
||||
8936.08
|
||||
8875.21
|
||||
8761.93
|
||||
9053.81
|
||||
9046.36
|
||||
9253.07
|
||||
9363.98
|
||||
9205.57
|
||||
9280.09
|
||||
9185.08
|
||||
9378.03
|
||||
9294.35
|
||||
9259.5
|
||||
9156.88
|
||||
9112.25
|
||||
9215.67
|
||||
9091.97
|
||||
8958.45
|
||||
9056.42
|
||||
9188.81
|
||||
9073.29
|
||||
9206.41
|
||||
9242.42
|
||||
9192.92
|
||||
9083.52
|
||||
8820.61
|
||||
8766.82
|
||||
8740.11
|
||||
8703.82
|
||||
8707.45
|
||||
8646.29
|
||||
8383.08
|
||||
8408.7
|
||||
8452.31
|
||||
8311.77
|
||||
8200.97
|
||||
8089.24
|
||||
8094.67
|
||||
8391.64
|
||||
8168.78
|
||||
8253.91
|
||||
8091.14
|
||||
8040.8
|
||||
8132.57
|
||||
8271.91
|
||||
8185.84
|
||||
8083.47
|
||||
7984.02
|
||||
7809.15
|
||||
7876.02
|
||||
7681.9
|
||||
7542.14
|
||||
7743.17
|
||||
7650.2
|
||||
7351.05
|
||||
7353
|
||||
7251.96
|
||||
7063.49
|
||||
6914.37
|
||||
6583.56
|
||||
7243.79
|
||||
7151.55
|
||||
6845.35
|
||||
6914.92
|
||||
6996.93
|
||||
6462.69
|
||||
6380.43
|
||||
6350.54
|
||||
6083.38
|
||||
6512.61
|
||||
6254.18
|
||||
5947.4
|
||||
6100.89
|
||||
6677.37
|
||||
6417.44
|
||||
6433.73
|
||||
6720.37
|
||||
7137.72
|
||||
7158.31
|
||||
7288.55
|
||||
7101.07
|
||||
6954.57
|
||||
7163.84
|
||||
7482.86
|
||||
7495.56
|
||||
7755.07
|
||||
7645.33
|
||||
7692.8
|
||||
7634.2
|
||||
7623.8
|
||||
7364.76
|
||||
7275.74
|
||||
7492.05
|
||||
7448.41
|
||||
7466.59
|
||||
7714.34
|
||||
7665.49
|
||||
7971.36
|
||||
8215.22
|
||||
8265.65
|
||||
8402.1
|
||||
8327.76
|
||||
8238.81
|
||||
8190.94
|
||||
7999.72
|
||||
8323.91
|
||||
8255.46
|
||||
8135.75
|
||||
8152.92
|
||||
8096.21
|
||||
7866.53
|
||||
7548.1
|
||||
7738.78
|
||||
7878.67
|
||||
8034.39
|
||||
8001.35
|
||||
8156.37
|
||||
8017.2
|
||||
8040.44
|
||||
8316.21
|
||||
8235.25
|
||||
8341.85
|
||||
8549.46
|
||||
8483.74
|
||||
8588.01
|
||||
8469.15
|
||||
8434.02
|
||||
8244.13
|
||||
8302.5
|
||||
8186.21
|
||||
8229.89
|
||||
8440.2
|
||||
8297.66
|
||||
8208.28
|
||||
8225.47
|
||||
8248.8
|
||||
7931.53
|
||||
7974.82
|
||||
8094.5
|
||||
8078.89
|
||||
7847.66
|
||||
7877.85
|
||||
7963.99
|
||||
8011.26
|
||||
8091.78
|
||||
8254.5
|
||||
8240.15
|
||||
8257.6
|
||||
8214.96
|
||||
8267.04
|
||||
8407
|
||||
8314.32
|
||||
8370.81
|
||||
8630.7
|
||||
8629
|
||||
8639.75
|
||||
8555.95
|
||||
8555.58
|
||||
8581.48
|
||||
8694.52
|
||||
8887.54
|
||||
8820.21
|
||||
8934.55
|
||||
8918.78
|
||||
8829.27
|
||||
8874
|
||||
9058.8
|
||||
8962.08
|
||||
8678.04
|
||||
8633.4
|
||||
8567.92
|
||||
8658.55
|
||||
8638.51
|
||||
8758.23
|
||||
8649.54
|
||||
8352.93
|
||||
8310.39
|
||||
8449.7
|
||||
8335.38
|
||||
8445.88
|
||||
8173.74
|
||||
8269.13
|
||||
8585.02
|
||||
8550.97
|
||||
8410.99
|
||||
8270.12
|
||||
8254.73
|
||||
8054.9
|
||||
7995.72
|
||||
8131.24
|
||||
8075.99
|
||||
7922.86
|
||||
7920.85
|
||||
8105.58
|
||||
8024.6
|
||||
8194.66
|
||||
8276.27
|
||||
8280.88
|
||||
8441.18
|
||||
8421.3
|
||||
8292.31
|
||||
8185.63
|
||||
8341.25
|
||||
8290.72
|
||||
8244.16
|
||||
8312.85
|
||||
8303.26
|
||||
8073.08
|
||||
8221
|
||||
8332.46
|
||||
8511.7
|
||||
8479.71
|
||||
8488.8
|
||||
8379.01
|
||||
8421.21
|
||||
8471.11
|
||||
8766.42
|
||||
8804.78
|
||||
8827.85
|
||||
8658.38
|
||||
8758.65
|
||||
8678.45
|
||||
8549.87
|
||||
8646.98
|
||||
8699.86
|
||||
8763.38
|
||||
8662.27
|
||||
8780.44
|
||||
8853.86
|
||||
8830.13
|
||||
8877.24
|
||||
8887.78
|
||||
8915.26
|
||||
8753.82
|
||||
8709.14
|
||||
8765.63
|
||||
8578.13
|
||||
8613.21
|
||||
8716.28
|
||||
8666.26
|
||||
8530.21
|
||||
8450.37
|
||||
8505.32
|
||||
8520.16
|
||||
8581.28
|
||||
8597.54
|
||||
8621.56
|
||||
8507.98
|
||||
8552.93
|
||||
8638.78
|
||||
8617.23
|
||||
8614.19
|
||||
8714.73
|
||||
8564.5
|
||||
8539.51
|
||||
8515.59
|
||||
8587.5
|
||||
8648.52
|
||||
8705.14
|
||||
8689.98
|
||||
8804.28
|
||||
8835.9
|
||||
8794.46
|
||||
8888.73
|
||||
8870.09
|
||||
8798.3
|
||||
8767.3
|
||||
8944.43
|
||||
9177.53
|
||||
9241.31
|
||||
9175.41
|
||||
9331.88
|
||||
9278.07
|
||||
9301.83
|
||||
9290.59
|
||||
9230.77
|
||||
9292.33
|
||||
9282.69
|
||||
9437.19
|
||||
9476.28
|
||||
9370.49
|
||||
9397.7
|
||||
9627.51
|
||||
9666.09
|
||||
9736.44
|
||||
9703.04
|
||||
9690.34
|
||||
9828.38
|
||||
9873.79
|
||||
9644.96
|
||||
9674.48
|
||||
9605.89
|
||||
9733.25
|
||||
9677.06
|
||||
9871.39
|
||||
9841.61
|
||||
9909.23
|
||||
10045.73
|
||||
10051.35
|
||||
10109.76
|
||||
10097.32
|
||||
9883.3
|
||||
10074.31
|
||||
10066.99
|
||||
10226.63
|
||||
10274.76
|
||||
10185.64
|
||||
10110.56
|
||||
9997.74
|
||||
10094.74
|
||||
9891.11
|
||||
9792.43
|
||||
9963.97
|
||||
9880.83
|
||||
9812.9
|
||||
9816.47
|
||||
9867.26
|
||||
9844.57
|
||||
10041.89
|
||||
10050.03
|
||||
10092.26
|
||||
10088.73
|
||||
9962.58
|
||||
10038.14
|
||||
9991.9
|
||||
10083.78
|
||||
10211.94
|
||||
10179.32
|
||||
10182.47
|
||||
10328.81
|
||||
10374.78
|
||||
10468.59
|
||||
10575.49
|
||||
10552.41
|
||||
10780.68
|
||||
10740.69
|
||||
10813.46
|
||||
10675.14
|
||||
10664.69
|
||||
10733.66
|
||||
10833
|
||||
10713.73
|
||||
10634.19
|
||||
10745.17
|
||||
10817.43
|
||||
10804.34
|
||||
10798.32
|
||||
10728.17
|
||||
10780.01
|
||||
10845.14
|
||||
10953.88
|
||||
11083.25
|
||||
11121.37
|
||||
11221.73
|
||||
11166.86
|
||||
10812.12
|
||||
10929.64
|
||||
10494.42
|
||||
10454.69
|
||||
10612.05
|
||||
10325.4
|
||||
10161.7
|
||||
10518.07
|
||||
10613.59
|
||||
10585.11
|
||||
10744.08
|
||||
10781.91
|
||||
10661.38
|
||||
10574.05
|
||||
10715.49
|
||||
10759.62
|
||||
10846.77
|
||||
10788.71
|
||||
10763.23
|
||||
10586.93
|
||||
10395.91
|
||||
10441.32
|
||||
10632.99
|
||||
10588.03
|
||||
10536.67
|
||||
10535.45
|
||||
10462.5
|
||||
10482.68
|
||||
10821.99
|
||||
10813.32
|
||||
10934.34
|
||||
10906.89
|
||||
10941.53
|
||||
10894.32
|
||||
10940.84
|
||||
10943.11
|
||||
11177.16
|
||||
11083.52
|
||||
10952.6
|
||||
11116.87
|
||||
11148.11
|
||||
11208.14
|
||||
11078.64
|
||||
11081.1
|
||||
11161.41
|
||||
11426.74
|
||||
11483.32
|
||||
11363.04
|
||||
11409.91
|
||||
11464.18
|
||||
11451.31
|
||||
11566.08
|
||||
11563.86
|
||||
11362.45
|
||||
11350.49
|
||||
11405.37
|
||||
11424.57
|
||||
11447.76
|
||||
11549.22
|
||||
11523.06
|
||||
11523.39
|
||||
11590.57
|
||||
11686.56
|
||||
11670
|
||||
11666.96
|
||||
11714.64
|
||||
11711.63
|
||||
11423.48
|
||||
11199.65
|
||||
11074.69
|
||||
11133.94
|
||||
11024.15
|
||||
10896.45
|
||||
10765.74
|
||||
10853.54
|
||||
11090.87
|
||||
11120.95
|
||||
11034.03
|
||||
11180.56
|
||||
10976.51
|
||||
10956.55
|
||||
11048.38
|
||||
10744.16
|
||||
10680.16
|
||||
10588.86
|
||||
10479.72
|
||||
10535.39
|
||||
10548.2
|
||||
10406.04
|
||||
10367.51
|
||||
10291.12
|
||||
10450.65
|
||||
10454.51
|
||||
10491.84
|
||||
10637.42
|
||||
10743.94
|
||||
10722.48
|
||||
10739.95
|
||||
10798.28
|
||||
10859.7
|
||||
10647.46
|
||||
10470.63
|
||||
10339.43
|
||||
10148.67
|
||||
10237.34
|
||||
9878.72
|
||||
9866.23
|
||||
9901.33
|
||||
10026.6
|
||||
9949.93
|
||||
9832.9
|
||||
9915.92
|
||||
10048.96
|
||||
10090.35
|
||||
9912.17
|
||||
9956.74
|
||||
9833.12
|
||||
9688.68
|
||||
9731.87
|
||||
9737.82
|
||||
9811.28
|
||||
9840.16
|
||||
9864.36
|
||||
9827.55
|
||||
9885.47
|
||||
9917.99
|
||||
10120.54
|
||||
10015.45
|
||||
10217.36
|
||||
10205.48
|
||||
10201.47
|
||||
10317.24
|
||||
10329.65
|
||||
10084.15
|
||||
10117.78
|
||||
10207.27
|
||||
10044.21
|
||||
9993.87
|
||||
9925.09
|
||||
10139.96
|
||||
10161.28
|
||||
10325.76
|
||||
10343.58
|
||||
10438.23
|
||||
10413.34
|
||||
10404.42
|
||||
10457.13
|
||||
10189.18
|
||||
10131.6
|
||||
10033.41
|
||||
10057.04
|
||||
9743.23
|
||||
9809.57
|
||||
9823.97
|
||||
9670.52
|
||||
9797.07
|
||||
9757.2
|
||||
9786.37
|
||||
9642.93
|
||||
9586.52
|
||||
9580.38
|
||||
9401.32
|
||||
9499.17
|
||||
9619.66
|
||||
9678.38
|
||||
9633.55
|
||||
9758.75
|
||||
9626.79
|
||||
9597.24
|
||||
9717.92
|
||||
9723.05
|
||||
9777.93
|
||||
9720.4
|
||||
9618.85
|
||||
9592.86
|
||||
9652.99
|
||||
9656.93
|
||||
9523.2
|
||||
9477.75
|
||||
9405.39
|
||||
9415.63
|
||||
9404.22
|
||||
9367.41
|
||||
9442.93
|
||||
9483.93
|
||||
9588.2
|
||||
9588.37
|
||||
9670.98
|
||||
9570.14
|
||||
9579.05
|
||||
9730.25
|
||||
9733.22
|
||||
9628.67
|
||||
9677.86
|
||||
9637.93
|
||||
9432.63
|
||||
9488.19
|
||||
9446.81
|
||||
9475.47
|
||||
9683.39
|
||||
9740.81
|
||||
9837
|
||||
10118.21
|
||||
10213.28
|
||||
10242.22
|
||||
10201.18
|
||||
10196.02
|
||||
10222.71
|
||||
10242.84
|
||||
10259.75
|
||||
10366.35
|
||||
10352.96
|
||||
10308.15
|
||||
10363.58
|
||||
10193.72
|
||||
10182.28
|
||||
10270.72
|
||||
10311.09
|
||||
10315.32
|
||||
10321.23
|
||||
10627.83
|
||||
10696.2
|
||||
10725.32
|
||||
10645.69
|
||||
10683.84
|
||||
10670.66
|
||||
10840.36
|
||||
10678.5
|
||||
10575.87
|
||||
10623.79
|
||||
10574.43
|
||||
10611.58
|
||||
10678.99
|
||||
10678.91
|
||||
10744.57
|
||||
10738.61
|
||||
10628.72
|
||||
10647.22
|
||||
10692.18
|
||||
10681.68
|
||||
10900.49
|
||||
10899.26
|
||||
10940.25
|
||||
10798.44
|
||||
10743.53
|
||||
10517.09
|
||||
10594.36
|
||||
10575.89
|
||||
10558.32
|
||||
10389.15
|
||||
10480.8
|
||||
10510.08
|
||||
10500.77
|
||||
10407.88
|
||||
10446.83
|
||||
10489.03
|
||||
10531.77
|
||||
10649.08
|
||||
10557.65
|
||||
10425.92
|
||||
10309.81
|
||||
10392.13
|
||||
10370.45
|
||||
10320.69
|
||||
10350.66
|
||||
10428.83
|
||||
10416.56
|
||||
10384.52
|
||||
10522.26
|
||||
10632.81
|
||||
10600.36
|
||||
10715.48
|
||||
10662.01
|
||||
10626.55
|
||||
10766.27
|
||||
10779.06
|
||||
10712.27
|
||||
10737.63
|
||||
10852.77
|
||||
10942.8
|
||||
10904.24
|
||||
11035.56
|
||||
10924.01
|
||||
10964.68
|
||||
10911.55
|
||||
11029.42
|
||||
11141.86
|
||||
11038.72
|
||||
11100.17
|
||||
11000.17
|
||||
10982.89
|
||||
11096.05
|
||||
11081.52
|
||||
11100.3
|
||||
10890.96
|
||||
10916.43
|
||||
10903.09
|
||||
11008.12
|
||||
10966.65
|
||||
10796.32
|
||||
10836.1
|
||||
10852.02
|
||||
10875.33
|
||||
10920.94
|
||||
10901.85
|
||||
11055.84
|
||||
11015.57
|
||||
11099.19
|
||||
11017.6
|
||||
11077.99
|
||||
11209.47
|
||||
11301.59
|
||||
11305.12
|
||||
11359.01
|
||||
11318.66
|
||||
11330.5
|
||||
11297.21
|
||||
11335.16
|
||||
11313.99
|
||||
11306.96
|
||||
11267.59
|
1000
data/cdr.dat
Normal file
1000
data/cdr.dat
Normal file
File diff suppressed because it is too large
Load Diff
365
data/dogecoin.dat
Normal file
365
data/dogecoin.dat
Normal file
@ -0,0 +1,365 @@
|
||||
0.005301
|
||||
0.000205
|
||||
0.000206
|
||||
0.000210
|
||||
0.000209
|
||||
0.000208
|
||||
0.000211
|
||||
0.000204
|
||||
0.000211
|
||||
0.000229
|
||||
0.000247
|
||||
0.000238
|
||||
0.000243
|
||||
0.000235
|
||||
0.000223
|
||||
0.000219
|
||||
0.000235
|
||||
0.000236
|
||||
0.000246
|
||||
0.000243
|
||||
0.000242
|
||||
0.000264
|
||||
0.000298
|
||||
0.000272
|
||||
0.000254
|
||||
0.000273
|
||||
0.000272
|
||||
0.000304
|
||||
0.000328
|
||||
0.000335
|
||||
0.000489
|
||||
0.000427
|
||||
0.000432
|
||||
0.000442
|
||||
0.000450
|
||||
0.000398
|
||||
0.000432
|
||||
0.000381
|
||||
0.000400
|
||||
0.000390
|
||||
0.000414
|
||||
0.000425
|
||||
0.000426
|
||||
0.000418
|
||||
0.000454
|
||||
0.000459
|
||||
0.000459
|
||||
0.000448
|
||||
0.000443
|
||||
0.000451
|
||||
0.000464
|
||||
0.000522
|
||||
0.000515
|
||||
0.000527
|
||||
0.000544
|
||||
0.000632
|
||||
0.000678
|
||||
0.000734
|
||||
0.000746
|
||||
0.000686
|
||||
0.000610
|
||||
0.000678
|
||||
0.000744
|
||||
0.000840
|
||||
0.001169
|
||||
0.001305
|
||||
0.001521
|
||||
0.001239
|
||||
0.001239
|
||||
0.001212
|
||||
0.001183
|
||||
0.001184
|
||||
0.001274
|
||||
0.001128
|
||||
0.001059
|
||||
0.001318
|
||||
0.001508
|
||||
0.001518
|
||||
0.001900
|
||||
0.003062
|
||||
0.003405
|
||||
0.003562
|
||||
0.003659
|
||||
0.002994
|
||||
0.002424
|
||||
0.002541
|
||||
0.002579
|
||||
0.002732
|
||||
0.002623
|
||||
0.002657
|
||||
0.002867
|
||||
0.003026
|
||||
0.003251
|
||||
0.003179
|
||||
0.003873
|
||||
0.003741
|
||||
0.003302
|
||||
0.003575
|
||||
0.003453
|
||||
0.003313
|
||||
0.003601
|
||||
0.003253
|
||||
0.003313
|
||||
0.003092
|
||||
0.003043
|
||||
0.003163
|
||||
0.003322
|
||||
0.003230
|
||||
0.003141
|
||||
0.003218
|
||||
0.003125
|
||||
0.003104
|
||||
0.003143
|
||||
0.003135
|
||||
0.002961
|
||||
0.002750
|
||||
0.002623
|
||||
0.002793
|
||||
0.002656
|
||||
0.002602
|
||||
0.002645
|
||||
0.002481
|
||||
0.002533
|
||||
0.002518
|
||||
0.002714
|
||||
0.002636
|
||||
0.002397
|
||||
0.002440
|
||||
0.002330
|
||||
0.001952
|
||||
0.001779
|
||||
0.001938
|
||||
0.001823
|
||||
0.001681
|
||||
0.001484
|
||||
0.001307
|
||||
0.001520
|
||||
0.001864
|
||||
0.001689
|
||||
0.001935
|
||||
0.001936
|
||||
0.002095
|
||||
0.001972
|
||||
0.001980
|
||||
0.001773
|
||||
0.001810
|
||||
0.001856
|
||||
0.001782
|
||||
0.001768
|
||||
0.001719
|
||||
0.001718
|
||||
0.001792
|
||||
0.001788
|
||||
0.001795
|
||||
0.001820
|
||||
0.002087
|
||||
0.001909
|
||||
0.001949
|
||||
0.001961
|
||||
0.001937
|
||||
0.001896
|
||||
0.001880
|
||||
0.001856
|
||||
0.001807
|
||||
0.001762
|
||||
0.001738
|
||||
0.001774
|
||||
0.001710
|
||||
0.001678
|
||||
0.001678
|
||||
0.001707
|
||||
0.001712
|
||||
0.001716
|
||||
0.001732
|
||||
0.001816
|
||||
0.001790
|
||||
0.001778
|
||||
0.001760
|
||||
0.001825
|
||||
0.001867
|
||||
0.002105
|
||||
0.002064
|
||||
0.002543
|
||||
0.002226
|
||||
0.002153
|
||||
0.001786
|
||||
0.001908
|
||||
0.002019
|
||||
0.001928
|
||||
0.001596
|
||||
0.001568
|
||||
0.001395
|
||||
0.001463
|
||||
0.001440
|
||||
0.001398
|
||||
0.000854
|
||||
0.000865
|
||||
0.000867
|
||||
0.000853
|
||||
0.000947
|
||||
0.000890
|
||||
0.000862
|
||||
0.000755
|
||||
0.000772
|
||||
0.000954
|
||||
0.000892
|
||||
0.001141
|
||||
0.001151
|
||||
0.001173
|
||||
0.001080
|
||||
0.001082
|
||||
0.001145
|
||||
0.001084
|
||||
0.001085
|
||||
0.001108
|
||||
0.001024
|
||||
0.001001
|
||||
0.001056
|
||||
0.001066
|
||||
0.001056
|
||||
0.000991
|
||||
0.001036
|
||||
0.001046
|
||||
0.001062
|
||||
0.001066
|
||||
0.001110
|
||||
0.001106
|
||||
0.001164
|
||||
0.001067
|
||||
0.001047
|
||||
0.001064
|
||||
0.001050
|
||||
0.001007
|
||||
0.001023
|
||||
0.001016
|
||||
0.001092
|
||||
0.001056
|
||||
0.001051
|
||||
0.001052
|
||||
0.001037
|
||||
0.001173
|
||||
0.001151
|
||||
0.001124
|
||||
0.001138
|
||||
0.001151
|
||||
0.001121
|
||||
0.001189
|
||||
0.001182
|
||||
0.001154
|
||||
0.001177
|
||||
0.001222
|
||||
0.001415
|
||||
0.001163
|
||||
0.001201
|
||||
0.001038
|
||||
0.001211
|
||||
0.001184
|
||||
0.001339
|
||||
0.001390
|
||||
0.001313
|
||||
0.001373
|
||||
0.001376
|
||||
0.001394
|
||||
0.001389
|
||||
0.001823
|
||||
0.001891
|
||||
0.001908
|
||||
0.002072
|
||||
0.002026
|
||||
0.001988
|
||||
0.002363
|
||||
0.002080
|
||||
0.002079
|
||||
0.002148
|
||||
0.002149
|
||||
0.002223
|
||||
0.002463
|
||||
0.002479
|
||||
0.002663
|
||||
0.002720
|
||||
0.002779
|
||||
0.002617
|
||||
0.002547
|
||||
0.002798
|
||||
0.003304
|
||||
0.003461
|
||||
0.003709
|
||||
0.003762
|
||||
0.005933
|
||||
0.005984
|
||||
0.006433
|
||||
0.005666
|
||||
0.006661
|
||||
0.007425
|
||||
0.006054
|
||||
0.007259
|
||||
0.008582
|
||||
0.008931
|
||||
0.009411
|
||||
0.008872
|
||||
0.008486
|
||||
0.009391
|
||||
0.007860
|
||||
0.008972
|
||||
0.008909
|
||||
0.009145
|
||||
0.009320
|
||||
0.009644
|
||||
0.012167
|
||||
0.014863
|
||||
0.017088
|
||||
0.015045
|
||||
0.013420
|
||||
0.013102
|
||||
0.011469
|
||||
0.013056
|
||||
0.013023
|
||||
0.011685
|
||||
0.009857
|
||||
0.006822
|
||||
0.007648
|
||||
0.007969
|
||||
0.007871
|
||||
0.008448
|
||||
0.007131
|
||||
0.006734
|
||||
0.006673
|
||||
0.007083
|
||||
0.007667
|
||||
0.007237
|
||||
0.007373
|
||||
0.007465
|
||||
0.006967
|
||||
0.006024
|
||||
0.006010
|
||||
0.005029
|
||||
0.004475
|
||||
0.005164
|
||||
0.004399
|
||||
0.003533
|
||||
0.004361
|
||||
0.004297
|
||||
0.004566
|
||||
0.005000
|
||||
0.004989
|
||||
0.004956
|
||||
0.005472
|
||||
0.005638
|
||||
0.006730
|
||||
0.007347
|
||||
0.007034
|
||||
0.007049
|
||||
0.006424
|
||||
0.006697
|
||||
0.007094
|
||||
0.006581
|
||||
0.006259
|
||||
0.006648
|
||||
0.006324
|
||||
0.006142
|
||||
0.006339
|
||||
0.006291
|
||||
0.006018
|
||||
0.006215
|
||||
0.005482
|
962
data/ltc.dat
Normal file
962
data/ltc.dat
Normal file
@ -0,0 +1,962 @@
|
||||
1.7906
|
||||
1.8019
|
||||
1.75
|
||||
1.7791
|
||||
1.8003
|
||||
1.8498
|
||||
2.002
|
||||
2.01
|
||||
2.8601
|
||||
2.8358
|
||||
3.1018
|
||||
2.74
|
||||
3.0333
|
||||
3
|
||||
2.9975
|
||||
2.959
|
||||
2.7733
|
||||
2.838
|
||||
2.876
|
||||
3.125
|
||||
3.1194
|
||||
3.7707
|
||||
4.092
|
||||
3.9431
|
||||
4.056
|
||||
4.151
|
||||
4.143
|
||||
4.938
|
||||
5.38
|
||||
5.201
|
||||
6.464
|
||||
7.567
|
||||
4.4454
|
||||
4.328
|
||||
5.3081
|
||||
4.7
|
||||
4.601
|
||||
4.122
|
||||
3.71
|
||||
3.7501
|
||||
4.01
|
||||
3.707
|
||||
3.9719
|
||||
3.777
|
||||
3.8696
|
||||
3.7869
|
||||
4.6063
|
||||
4.6779
|
||||
4.7
|
||||
4.69
|
||||
5.087
|
||||
4.807
|
||||
4.6071
|
||||
4.6402
|
||||
4.1488
|
||||
4.187
|
||||
4.195
|
||||
4.41
|
||||
4.37
|
||||
4.0524
|
||||
4.2484
|
||||
3.871
|
||||
3.94
|
||||
3.9732
|
||||
4.161
|
||||
4.0249
|
||||
3.9
|
||||
4.054
|
||||
3.9412
|
||||
3.98
|
||||
4.01
|
||||
3.363
|
||||
3.4982
|
||||
3.6036
|
||||
3.5697
|
||||
3.5383
|
||||
3.3824
|
||||
3.051
|
||||
2.96
|
||||
2.9488
|
||||
2.89
|
||||
2.9
|
||||
2.893
|
||||
2.8565
|
||||
2.848
|
||||
2.84
|
||||
2.8058
|
||||
2.6482
|
||||
2.7098
|
||||
2.951
|
||||
3.0789
|
||||
3.0597
|
||||
3.05
|
||||
2.9424
|
||||
2.955
|
||||
2.965
|
||||
2.8351
|
||||
2.816
|
||||
2.8498
|
||||
2.8198
|
||||
2.8148
|
||||
2.9337
|
||||
2.9653
|
||||
2.884
|
||||
2.851
|
||||
2.8096
|
||||
2.8536
|
||||
2.86
|
||||
2.9202
|
||||
2.902
|
||||
2.8988
|
||||
2.8748
|
||||
3.08
|
||||
2.9839
|
||||
2.99
|
||||
3.0135
|
||||
2.9929
|
||||
3.031
|
||||
3.0082
|
||||
3.0419
|
||||
3.169
|
||||
3.0688
|
||||
3.062
|
||||
3.115
|
||||
3.1141
|
||||
3.1583
|
||||
3.1675
|
||||
3.197
|
||||
3.1649
|
||||
3.0907
|
||||
3.101
|
||||
3.071
|
||||
3.0261
|
||||
3.0402
|
||||
3.0797
|
||||
3.0787
|
||||
3.145
|
||||
3.1318
|
||||
3.144
|
||||
3.1011
|
||||
3.1186
|
||||
3.1055
|
||||
3.0988
|
||||
3.7993
|
||||
3.95
|
||||
3.6891
|
||||
3.89
|
||||
4.1342
|
||||
4.55
|
||||
4
|
||||
3.85
|
||||
3.523
|
||||
3.532
|
||||
3.3792
|
||||
3.4223
|
||||
3.0999
|
||||
2.9854
|
||||
3.3
|
||||
3.2177
|
||||
3.2299
|
||||
3.074
|
||||
3.1974
|
||||
3.226
|
||||
3.182
|
||||
3.14
|
||||
3.131
|
||||
3.156
|
||||
3.1262
|
||||
3.154
|
||||
3.1018
|
||||
3.376
|
||||
3.6444
|
||||
3.605
|
||||
3.546
|
||||
3.7
|
||||
3.6255
|
||||
3.4312
|
||||
3.33
|
||||
3.3798
|
||||
3.335
|
||||
3.528
|
||||
3.4399
|
||||
3.634
|
||||
3.8273
|
||||
3.6906
|
||||
3.653
|
||||
3.89
|
||||
3.6
|
||||
3.58
|
||||
3.5879
|
||||
3.7875
|
||||
3.6807
|
||||
3.695
|
||||
3.7201
|
||||
3.6997
|
||||
3.5
|
||||
3.406
|
||||
3.4085
|
||||
3.5601
|
||||
3.6418
|
||||
3.6011
|
||||
3.445
|
||||
3.4678
|
||||
3.464
|
||||
3.489
|
||||
3.452
|
||||
3.4401
|
||||
3.5189
|
||||
3.499
|
||||
3.4869
|
||||
3.507
|
||||
3.489
|
||||
3.45
|
||||
3.62
|
||||
3.5919
|
||||
3.58
|
||||
3.535
|
||||
3.5517
|
||||
3.4599
|
||||
3.4719
|
||||
3.4334
|
||||
2.95
|
||||
3.1
|
||||
3.001
|
||||
3.055
|
||||
3.0099
|
||||
3.37
|
||||
3.2057
|
||||
3.0411
|
||||
3.1075
|
||||
3.1847
|
||||
3.0947
|
||||
3.4239
|
||||
3.4742
|
||||
3.4728
|
||||
3.384
|
||||
3.3567
|
||||
3.3635
|
||||
3.4334
|
||||
3.4112
|
||||
3.4197
|
||||
3.4489
|
||||
3.435
|
||||
3.346
|
||||
3.304
|
||||
3.2254
|
||||
3.1726
|
||||
3.1778
|
||||
3.241
|
||||
3.2179
|
||||
3.2541
|
||||
3.264
|
||||
3.365
|
||||
3.2569
|
||||
3.2803
|
||||
3.3039
|
||||
3.3114
|
||||
3.313
|
||||
3.2924
|
||||
3.1457
|
||||
3.1582
|
||||
3.1694
|
||||
3.192
|
||||
3.2132
|
||||
3.226
|
||||
3.2187
|
||||
3.2075
|
||||
3.2372
|
||||
3.296
|
||||
3.27
|
||||
3.228
|
||||
3.2096
|
||||
3.254
|
||||
3.2416
|
||||
3.2582
|
||||
3.2443
|
||||
3.245
|
||||
3.2687
|
||||
3.2467
|
||||
3.2305
|
||||
3.2324
|
||||
3.2302
|
||||
3.233
|
||||
3.234
|
||||
3.2625
|
||||
3.2693
|
||||
3.26
|
||||
3.2952
|
||||
3.3104
|
||||
3.2849
|
||||
3.2511
|
||||
3.3199
|
||||
3.3
|
||||
3.375
|
||||
3.356
|
||||
3.3698
|
||||
3.6711
|
||||
3.83
|
||||
4.0837
|
||||
3.8931
|
||||
3.8298
|
||||
3.8207
|
||||
3.67
|
||||
3.6969
|
||||
3.6743
|
||||
3.734
|
||||
3.7333
|
||||
3.7203
|
||||
3.8452
|
||||
3.98
|
||||
3.966
|
||||
4.08
|
||||
3.8398
|
||||
3.8807
|
||||
3.859
|
||||
3.9351
|
||||
4.0181
|
||||
4.0707
|
||||
4.007
|
||||
3.9669
|
||||
4.0212
|
||||
3.7989
|
||||
3.87
|
||||
3.9353
|
||||
3.8383
|
||||
3.958
|
||||
3.95
|
||||
4.0456
|
||||
4.1025
|
||||
4.4453
|
||||
4.487
|
||||
4.7503
|
||||
4.59
|
||||
4.76
|
||||
4.7162
|
||||
4.8967
|
||||
4.82
|
||||
4.8632
|
||||
4.979
|
||||
4.7738
|
||||
4.821
|
||||
4.767
|
||||
4.8969
|
||||
5.0993
|
||||
5.25
|
||||
5.2789
|
||||
5.136
|
||||
5.2588
|
||||
5.695
|
||||
5.6492
|
||||
5.578
|
||||
5.6031
|
||||
5.381
|
||||
4.8546
|
||||
4.0007
|
||||
3.888
|
||||
4.2775
|
||||
4.243
|
||||
4.0731
|
||||
4.175
|
||||
4.1299
|
||||
4.0599
|
||||
4.2091
|
||||
4.2663
|
||||
4.6532
|
||||
4.2809
|
||||
4.5046
|
||||
4.4219
|
||||
4.4799
|
||||
4.102
|
||||
4.25
|
||||
4.1036
|
||||
4.138
|
||||
4.1274
|
||||
4.1843
|
||||
4.1734
|
||||
4.1701
|
||||
4.19
|
||||
4.16
|
||||
4.1928
|
||||
4.1521
|
||||
4.19
|
||||
4.1574
|
||||
4.114
|
||||
4.036
|
||||
4.0596
|
||||
4.0933
|
||||
4.0102
|
||||
3.98
|
||||
3.9536
|
||||
3.993
|
||||
4.0767
|
||||
4.0551
|
||||
3.942
|
||||
3.8534
|
||||
3.7332
|
||||
3.56
|
||||
3.746
|
||||
3.66
|
||||
3.69
|
||||
3.63
|
||||
3.53
|
||||
3.6
|
||||
3.5702
|
||||
3.5907
|
||||
3.6226
|
||||
3.6239
|
||||
3.6257
|
||||
3.672
|
||||
3.95
|
||||
3.8414
|
||||
3.8159
|
||||
3.84
|
||||
3.7586
|
||||
3.7645
|
||||
3.776
|
||||
3.803
|
||||
3.8107
|
||||
3.8262
|
||||
3.8048
|
||||
3.9154
|
||||
4.0101
|
||||
3.9781
|
||||
3.97
|
||||
4.0051
|
||||
4.0289
|
||||
3.9789
|
||||
4.0199
|
||||
3.8977
|
||||
3.8569
|
||||
3.845
|
||||
3.9017
|
||||
3.86
|
||||
3.83
|
||||
3.811
|
||||
3.8334
|
||||
3.837
|
||||
3.7948
|
||||
3.8011
|
||||
3.7506
|
||||
3.808
|
||||
3.8234
|
||||
3.8
|
||||
3.8582
|
||||
3.836
|
||||
3.857
|
||||
3.8529
|
||||
3.8486
|
||||
3.85
|
||||
3.8491
|
||||
3.8165
|
||||
3.8142
|
||||
3.83
|
||||
3.8478
|
||||
3.8649
|
||||
3.8295
|
||||
3.7866
|
||||
3.784
|
||||
3.8304
|
||||
3.81
|
||||
3.9329
|
||||
3.9228
|
||||
3.892
|
||||
3.881
|
||||
3.8365
|
||||
3.8272
|
||||
3.8157
|
||||
3.789
|
||||
3.8569
|
||||
3.918
|
||||
3.8997
|
||||
3.881
|
||||
3.916
|
||||
3.9885
|
||||
3.992
|
||||
3.9947
|
||||
4.0898
|
||||
4.03
|
||||
4
|
||||
4.11
|
||||
4.1449
|
||||
3.8601
|
||||
3.8979
|
||||
3.9138
|
||||
3.9184
|
||||
3.887
|
||||
3.8635
|
||||
3.853
|
||||
3.8192
|
||||
3.8057
|
||||
3.7754
|
||||
3.883
|
||||
3.8997
|
||||
3.9031
|
||||
3.94
|
||||
3.8979
|
||||
3.909
|
||||
3.9569
|
||||
3.89
|
||||
3.9476
|
||||
3.8991
|
||||
3.8609
|
||||
3.8997
|
||||
3.8908
|
||||
3.8231
|
||||
3.873
|
||||
3.8252
|
||||
3.8809
|
||||
3.8777
|
||||
3.9
|
||||
3.91
|
||||
3.9056
|
||||
3.4783
|
||||
3.52
|
||||
3.6601
|
||||
3.68
|
||||
3.6987
|
||||
3.6823
|
||||
3.633
|
||||
3.6386
|
||||
3.653
|
||||
3.6021
|
||||
3.65
|
||||
3.6
|
||||
3.7195
|
||||
3.672
|
||||
3.6493
|
||||
3.656
|
||||
3.632
|
||||
3.6742
|
||||
4.6161
|
||||
4.431
|
||||
4.2991
|
||||
4.257
|
||||
4.3633
|
||||
4.5976
|
||||
4.59
|
||||
4.4135
|
||||
4.3635
|
||||
4.4997
|
||||
4.58
|
||||
4.593
|
||||
4.59
|
||||
4.2127
|
||||
3.84
|
||||
3.963
|
||||
4.02
|
||||
4.34
|
||||
4.574
|
||||
3.9443
|
||||
4.0001
|
||||
3.9262
|
||||
3.9466
|
||||
3.9135
|
||||
3.8927
|
||||
3.95
|
||||
3.8949
|
||||
3.907
|
||||
3.9098
|
||||
3.9208
|
||||
3.85
|
||||
3.8246
|
||||
3.733
|
||||
3.711
|
||||
3.7425
|
||||
4.0382
|
||||
4.0649
|
||||
4.0352
|
||||
4.0283
|
||||
3.9701
|
||||
3.9403
|
||||
3.958
|
||||
3.9208
|
||||
3.737
|
||||
3.8296
|
||||
3.8153
|
||||
3.7394
|
||||
3.7698
|
||||
3.83
|
||||
3.8933
|
||||
3.8831
|
||||
3.8961
|
||||
3.8139
|
||||
3.8
|
||||
3.8086
|
||||
3.8566
|
||||
3.9009
|
||||
3.9057
|
||||
3.9488
|
||||
3.8801
|
||||
3.8747
|
||||
3.8728
|
||||
3.8061
|
||||
3.851
|
||||
4.0601
|
||||
4.1105
|
||||
4
|
||||
4.0137
|
||||
4.1003
|
||||
4.0063
|
||||
3.8669
|
||||
3.8734
|
||||
3.8109
|
||||
3.806
|
||||
3.8701
|
||||
4.3739
|
||||
4.1707
|
||||
4.3061
|
||||
4.2982
|
||||
4.1
|
||||
4.0049
|
||||
3.9371
|
||||
4.0584
|
||||
4.0173
|
||||
3.9546
|
||||
4.0076
|
||||
4.1403
|
||||
4.0817
|
||||
4.0862
|
||||
4.1263
|
||||
4.1837
|
||||
4.306
|
||||
7.78
|
||||
7.13
|
||||
7.5874
|
||||
8.333
|
||||
8.6
|
||||
9.095
|
||||
12.4
|
||||
10.854
|
||||
10.014
|
||||
10.732
|
||||
9.35
|
||||
9.9251
|
||||
9.7771
|
||||
11.79
|
||||
11.234
|
||||
11.915
|
||||
11.848
|
||||
12.05
|
||||
11.66
|
||||
11.521
|
||||
10.608
|
||||
11.592
|
||||
12.851
|
||||
15.411
|
||||
16.689
|
||||
16.2
|
||||
16.642
|
||||
16.242
|
||||
16.022
|
||||
15.498
|
||||
16.988
|
||||
16.84
|
||||
17.298
|
||||
17.2
|
||||
23.001
|
||||
24.941
|
||||
26.213
|
||||
28.674
|
||||
30.696
|
||||
28.706
|
||||
34
|
||||
32.335
|
||||
31
|
||||
27.801
|
||||
29.399
|
||||
29.395
|
||||
25.791
|
||||
23.72
|
||||
26.011
|
||||
29.134
|
||||
27.373
|
||||
27.202
|
||||
25.61
|
||||
23.931
|
||||
30.692
|
||||
33.579
|
||||
27.211
|
||||
24.21
|
||||
22.095
|
||||
22.817
|
||||
24.789
|
||||
23.667
|
||||
24.777
|
||||
26.5
|
||||
26.967
|
||||
26.413
|
||||
27.415
|
||||
29.999
|
||||
29.762
|
||||
28.1
|
||||
29.847
|
||||
29.506
|
||||
28.72
|
||||
33.95
|
||||
28
|
||||
30.08
|
||||
28.266
|
||||
28.565
|
||||
33.248
|
||||
45.358
|
||||
43.112
|
||||
47.197
|
||||
45.77
|
||||
43.76
|
||||
45.85
|
||||
45.23
|
||||
41.311
|
||||
40.158
|
||||
37.78
|
||||
39.547
|
||||
41.192
|
||||
39.269
|
||||
38.83
|
||||
37.01
|
||||
40.4
|
||||
45.298
|
||||
54.59
|
||||
52.75
|
||||
50.831
|
||||
45.686
|
||||
50.924
|
||||
48.2
|
||||
44.315
|
||||
43.435
|
||||
46.84
|
||||
45.165
|
||||
42.35
|
||||
38.379
|
||||
40.935
|
||||
42.129
|
||||
43.469
|
||||
40
|
||||
44.85
|
||||
45.45
|
||||
47.01
|
||||
45.107
|
||||
45.1
|
||||
42.081
|
||||
42.101
|
||||
41.8
|
||||
40.439
|
||||
41.052
|
||||
40.001
|
||||
42.107
|
||||
43.12
|
||||
41.812
|
||||
42.579
|
||||
43.018
|
||||
46.255
|
||||
45.486
|
||||
46
|
||||
49
|
||||
47.56
|
||||
46.5
|
||||
46.964
|
||||
45.879
|
||||
45.276
|
||||
45.497
|
||||
42.967
|
||||
43.911
|
||||
43.618
|
||||
46.52
|
||||
44.976
|
||||
45.685
|
||||
47.971
|
||||
46.25
|
||||
53.004
|
||||
49.663
|
||||
50.916
|
||||
51.529
|
||||
60.5
|
||||
62.14
|
||||
63.534
|
||||
65.448
|
||||
72.691
|
||||
87.137
|
||||
78.494
|
||||
78.527
|
||||
66.8
|
||||
73.28
|
||||
81.111
|
||||
80.1
|
||||
72.91
|
||||
70.75
|
||||
67.205
|
||||
68.121
|
||||
65.945
|
||||
61.652
|
||||
45.001
|
||||
51.821
|
||||
51.824
|
||||
50.718
|
||||
56.289
|
||||
52.58
|
||||
51.502
|
||||
46.399
|
||||
47.5
|
||||
49.28
|
||||
47.3
|
||||
52.397
|
||||
52.203
|
||||
56.83
|
||||
54.919
|
||||
52.876
|
||||
55.56
|
||||
54.872
|
||||
53.261
|
||||
52.083
|
||||
51.235
|
||||
51.665
|
||||
52.056
|
||||
52.571
|
||||
53.31
|
||||
50.068
|
||||
50.698
|
||||
50.804
|
||||
60.503
|
||||
59.306
|
||||
63.939
|
||||
65.86
|
||||
64.782
|
||||
59.172
|
||||
60.499
|
||||
59.55
|
||||
59.996
|
||||
58.014
|
||||
56.422
|
||||
54.533
|
||||
55.635
|
||||
56.039
|
||||
55.5
|
||||
54.958
|
||||
54.01
|
||||
56.838
|
||||
56.18
|
||||
55.552
|
||||
52.849
|
||||
53.989
|
||||
55.83
|
||||
54.636
|
||||
54.441
|
||||
54.375
|
||||
60.34
|
||||
62.409
|
||||
64.31
|
||||
58.626
|
||||
61.686
|
||||
58.261
|
||||
61
|
||||
61.99
|
||||
63.03
|
||||
70.654
|
||||
67.132
|
||||
69.591
|
||||
71.72
|
||||
72.331
|
||||
69.99
|
||||
71.735
|
||||
72.37
|
||||
77.886
|
||||
88.443
|
||||
85.456
|
||||
90.761
|
||||
94.003
|
||||
83.675
|
||||
85.768
|
||||
97.841
|
||||
98.83
|
||||
99.865
|
||||
103.42
|
||||
99.487
|
||||
96.503
|
||||
93.56
|
||||
120.9
|
||||
149
|
||||
144.6
|
||||
210.11
|
||||
292.12
|
||||
295.35
|
||||
276.31
|
||||
295.55
|
||||
295.67
|
||||
313.5
|
||||
355.5
|
||||
340.8
|
||||
304.31
|
||||
306.99
|
||||
248.38
|
||||
269
|
||||
261.99
|
||||
261.14
|
||||
278.78
|
||||
263.53
|
||||
247.45
|
||||
239.51
|
||||
206.99
|
||||
225.4
|
||||
223.51
|
||||
250.11
|
||||
244.21
|
||||
237.76
|
||||
242.9
|
||||
278
|
||||
271.05
|
||||
252.77
|
||||
245
|
||||
249.24
|
||||
225.52
|
||||
234.96
|
||||
257.7
|
||||
235.24
|
||||
231.05
|
||||
181.8
|
||||
186.71
|
||||
187.66
|
||||
191.68
|
||||
209.85
|
||||
189.96
|
||||
179.54
|
||||
177.64
|
||||
180.36
|
||||
178.8
|
||||
175.37
|
||||
181.49
|
||||
196.08
|
||||
181.51
|
||||
167.35
|
||||
164.5
|
||||
143.2
|
||||
132
|
||||
161.35
|
||||
147.47
|
||||
125.32
|
||||
141.81
|
||||
137.93
|
||||
149.86
|
||||
163.61
|
||||
154.82
|
||||
148.92
|
||||
161.39
|
||||
159.19
|
||||
211.97
|
||||
220.47
|
||||
228.5
|
||||
228.9
|
||||
213.57
|
||||
221.63
|
||||
228.98
|
||||
210.05
|
||||
192.47
|
||||
206.21
|
||||
206.33
|
||||
218.13
|
||||
218.36
|
||||
214.96
|
||||
202.02
|
||||
209.26
|
||||
213.32
|
||||
209.92
|
||||
208.32
|
1260
data/msft.dat
Normal file
1260
data/msft.dat
Normal file
File diff suppressed because it is too large
Load Diff
19
decider.cpp
Normal file
19
decider.cpp
Normal file
@ -0,0 +1,19 @@
|
||||
#include <iterator>
|
||||
#include "decider.h"
|
||||
|
||||
macd_decider::macd_decider(std::size_t limit)
|
||||
: prices(limit, .0), macd(limit, .0), signal(limit, .0), limit(limit) {}
|
||||
|
||||
void macd_decider::process(double price)
|
||||
{
|
||||
prices.add(price);
|
||||
macd.add(ema<double>(prices.begin(), prices.begin() + 12) - ema<double>(prices.begin(), prices.begin() + 26));
|
||||
signal.add(ema<double>(macd.begin(), macd.begin() + 9));
|
||||
}
|
||||
|
||||
void macd_decider::reset()
|
||||
{
|
||||
prices = buffer<double>(limit, .0);
|
||||
signal = buffer<double>(limit, .0);
|
||||
macd = buffer<double>(limit, .0);
|
||||
}
|
106
decider.h
Normal file
106
decider.h
Normal file
@ -0,0 +1,106 @@
|
||||
#ifndef DECIDER_H_
|
||||
#define DECIDER_H_
|
||||
|
||||
#include "helpers.h"
|
||||
#include "network.h"
|
||||
#include <iterator>
|
||||
#include <iostream>
|
||||
|
||||
class decider {
|
||||
public:
|
||||
double start_money;
|
||||
unsigned start_stock;
|
||||
|
||||
virtual int decide(double price, double money, unsigned stock) = 0;
|
||||
virtual void reset() = 0;
|
||||
|
||||
virtual ~decider() { }
|
||||
};
|
||||
|
||||
class macd_decider {
|
||||
private:
|
||||
std::size_t limit;
|
||||
|
||||
protected:
|
||||
buffer<double> prices;
|
||||
buffer<double> macd;
|
||||
buffer<double> signal;
|
||||
|
||||
public:
|
||||
macd_decider(std::size_t limit = 1000);
|
||||
|
||||
virtual void process(double price);
|
||||
virtual void reset();
|
||||
};
|
||||
|
||||
template <int p, int m, int s, int ...layers>
|
||||
class neural_decider : public decider, macd_decider {
|
||||
public:
|
||||
using network_t = network<double, p+m+s+2, layers..., 2>;
|
||||
network_t network;
|
||||
|
||||
double start_money;
|
||||
unsigned start_stock;
|
||||
|
||||
neural_decider() : network(), macd_decider() { }
|
||||
neural_decider(typename network_t::normalizer_t normalizer)
|
||||
: network(normalizer), macd_decider() { }
|
||||
|
||||
virtual int decide(double price, double money, unsigned stock)
|
||||
{
|
||||
process(price);
|
||||
|
||||
auto input = prepare(money, stock);
|
||||
auto result = network.evaluate(input);
|
||||
|
||||
double buy = result.get(0, 0);
|
||||
double sell = result.get(1, 0);
|
||||
|
||||
double amount = (buy - sell - .5)/1.5;
|
||||
|
||||
return abs(buy - sell) <= .5 ? 0 : amount * start_stock / 10;
|
||||
}
|
||||
|
||||
virtual void reset()
|
||||
{
|
||||
this->reset();
|
||||
}
|
||||
|
||||
virtual ~neural_decider() { }
|
||||
|
||||
private:
|
||||
typename network_t::input prepare(double money, unsigned stock)
|
||||
{
|
||||
vector<double, 2> state = {
|
||||
{ (money - start_money) / start_money },
|
||||
{ (double)stock / this->start_stock }
|
||||
};
|
||||
|
||||
vector<double, p> prices;
|
||||
vector<double, m+s> tech;
|
||||
|
||||
for (int j = 0; j < p; j++) {
|
||||
prices.set(j, 0, this->prices[j]);
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for (int j = 0; j < m; j++, i++) {
|
||||
tech.set(i, 0, macd[j]);
|
||||
}
|
||||
|
||||
for (int j = 0; j < s; j++, i++) {
|
||||
tech.set(i, 0, signal[j]);
|
||||
}
|
||||
|
||||
// prices are normalized in their domain
|
||||
prices = normalize(prices);
|
||||
// analytic data is normalized in its own domain
|
||||
tech = normalize(tech);
|
||||
|
||||
auto concated = concat(prices, tech);
|
||||
|
||||
return concat(concated, state);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
48
helpers.h
Normal file
48
helpers.h
Normal file
@ -0,0 +1,48 @@
|
||||
#ifndef HELPERS_H_
|
||||
#define HELPERS_H_
|
||||
|
||||
#include <deque>
|
||||
#include <iterator>
|
||||
|
||||
using std::deque;
|
||||
|
||||
template <typename T, class iter>
|
||||
T ema(iter begin, iter end)
|
||||
{
|
||||
const std::size_t N = std::distance(begin, end);
|
||||
const T a = T(1) - T(2) / T(N + 1);
|
||||
T b = T(1);
|
||||
|
||||
T nominator = 0, denominator = 0;
|
||||
for(iter it = begin; it < end; it++) {
|
||||
nominator += *it * b;
|
||||
denominator += b;
|
||||
|
||||
b *= a;
|
||||
}
|
||||
|
||||
return nominator / denominator;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
class buffer : public deque<T>
|
||||
{
|
||||
using deque<T>::deque;
|
||||
|
||||
std::size_t limit;
|
||||
|
||||
public:
|
||||
buffer(std::size_t limit) : limit(limit), deque<T>(limit) {};
|
||||
buffer(std::size_t limit, const T& value) : limit(limit), deque<T>(limit, value) {};
|
||||
|
||||
void add(const T& value)
|
||||
{
|
||||
if (this->size() >= limit) {
|
||||
this->pop_back();
|
||||
}
|
||||
|
||||
push_front(value);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
57
main.cpp
Normal file
57
main.cpp
Normal file
@ -0,0 +1,57 @@
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
|
||||
double expavg(const std::vector<double> &values, int start, int n)
|
||||
{
|
||||
double a = 1 - 2./(n + 1);
|
||||
|
||||
double nominator = 0., denominator = 0.;
|
||||
double b = 1.;
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
nominator += b*values[start - i];
|
||||
denominator += b;
|
||||
|
||||
b *= a;
|
||||
}
|
||||
|
||||
return nominator / denominator;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int low = 12, high = 26, s = 9;
|
||||
|
||||
if (argc >= 2)
|
||||
low = std::atoi(argv[2]);
|
||||
|
||||
if (argc >= 3)
|
||||
high = std::atoi(argv[4]);
|
||||
|
||||
if (argc >= 4)
|
||||
s = std::atoi(argv[3]);
|
||||
|
||||
std::vector<double> prices;
|
||||
double price;
|
||||
|
||||
while (std::cin >> price) {
|
||||
prices.push_back(price);
|
||||
}
|
||||
|
||||
std::vector<double> macd(prices.size());
|
||||
std::vector<double> signal(prices.size());
|
||||
|
||||
for (int i = 0; i < prices.size(); ++i) {
|
||||
macd[i] = expavg(prices, i, std::min(i, low)) - expavg(prices, i, std::min(i, high));
|
||||
signal[i] = expavg(macd, i, std::min(i, s));
|
||||
}
|
||||
|
||||
std::cout << "price,macd,signal,delta" << std::endl;
|
||||
for (int i = 1; i < prices.size(); ++i) {
|
||||
std::cout << prices[i] << "," << macd[i] << "," << signal[i] << "," << prices[i] - prices[i-1] << std::endl;
|
||||
}
|
||||
}
|
235
matrix.h
Normal file
235
matrix.h
Normal file
@ -0,0 +1,235 @@
|
||||
#ifndef MATRIX_H_
|
||||
#define MATRIX_H_
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
|
||||
template <typename T, int m, int n>
|
||||
class matrix
|
||||
{
|
||||
T values[m*n];
|
||||
|
||||
public:
|
||||
typedef matrix<T, 1, n> row_t;
|
||||
typedef matrix<T, m, 1> column_t;
|
||||
|
||||
matrix()
|
||||
{
|
||||
for (int i = 0; i < m; ++i)
|
||||
for (int j = 0; j < n; j++)
|
||||
values[i*n + j] = T();
|
||||
}
|
||||
|
||||
matrix(std::initializer_list<std::initializer_list<T>> list)
|
||||
{
|
||||
int i = 0, j = 0;
|
||||
for (const auto& row : list) {
|
||||
j = 0;
|
||||
for (const auto& cell : row) {
|
||||
set(i, j++, cell);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
T get(int i, int j) const
|
||||
{
|
||||
return values[i*n + j];
|
||||
}
|
||||
|
||||
void set(int i, int j, T value)
|
||||
{
|
||||
values[i*n + j] = value;
|
||||
}
|
||||
|
||||
template <int p> matrix<T, m, p> operator* (const matrix<T, n, p>& rhs) const
|
||||
{
|
||||
matrix<T, m, p> result;
|
||||
|
||||
for (int i = 0; i < m; ++i) {
|
||||
for(int j = 0; j < p; j++) {
|
||||
T accumulator = 0;
|
||||
for(int k = 0; k < n; k++)
|
||||
accumulator += this->get(i, k) * rhs.get(k, j);
|
||||
|
||||
result.set(i, j, accumulator);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
matrix<T, m, n> operator* (const T& rhs) const
|
||||
{
|
||||
matrix <T, m, n> result;
|
||||
|
||||
for (int i = 0; i < m; ++i)
|
||||
for (int j = 0; j < m; ++j)
|
||||
result.set(i, j, rhs * get(i, j));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
matrix<T, n, m> transpose() const
|
||||
{
|
||||
matrix<T, n, m> result;
|
||||
|
||||
for (int i = 0; i < m; ++i)
|
||||
for (int j = 0; j < m; ++j)
|
||||
result.set(j, i, get(i, j));
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
matrix<T, m, n> operator- () const
|
||||
{
|
||||
matrix<T, m, n> result;
|
||||
|
||||
for (int i = 0; i < m; ++i)
|
||||
for (int j = 0; j < n; ++j)
|
||||
result.set(i, j, -get(i, j));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
matrix<T, m, n> operator- (const matrix<T, m, n>& rhs) const
|
||||
{
|
||||
return *this + (-rhs);
|
||||
}
|
||||
|
||||
matrix<T, m, n> operator- (const T& value) const
|
||||
{
|
||||
return *this + (-value);
|
||||
}
|
||||
|
||||
matrix<T, m, n> operator+ (const matrix<T, m, n>& rhs) const
|
||||
{
|
||||
matrix<T, m, n> result;
|
||||
|
||||
for (int i = 0; i < m; ++i)
|
||||
for (int j = 0; j < n; ++j)
|
||||
result.set(i, j, this->get(i, j) + rhs.get(i, j));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
matrix<T, m, n> operator+ (const T& value) const
|
||||
{
|
||||
matrix <T, m, n> result;
|
||||
|
||||
for (int i = 0; i < m; ++i)
|
||||
for (int j = 0; j < n; ++j)
|
||||
result.set(this->get(i, j) + value);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
column_t column(std::size_t j)
|
||||
{
|
||||
column_t result;
|
||||
|
||||
for (int i = 0; i < m; ++i) {
|
||||
result.set(i, 0, get(i, j));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
row_t row(std::size_t i)
|
||||
{
|
||||
row_t result;
|
||||
|
||||
for (int j = 0; j < n; ++j) {
|
||||
result.set(0, j, get(i, j));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
friend std::ostream& operator<< (std::ostream& stream, const matrix<T, m, n>& matrix)
|
||||
{
|
||||
for (int i = 0; i < m; ++i) {
|
||||
for (int j = 0; j < n; j++) {
|
||||
stream << matrix.get(i, j) << " ";
|
||||
}
|
||||
stream << std::endl;
|
||||
}
|
||||
|
||||
return stream;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, int m, int n> matrix<T, m, n> operator*(const T& lhs, const matrix<T, m, n>& rhs) {
|
||||
return rhs * lhs;
|
||||
}
|
||||
|
||||
template <typename T, int n> using vector = matrix<T, n, 1>;
|
||||
|
||||
template <typename T, int m, int n> void fill(matrix<T, m, n> &mat, std::function<T(const int&, const int&)> filler)
|
||||
{
|
||||
for (int i = 0; i < m; i++)
|
||||
for (int j = 0; j < n; j++)
|
||||
mat.set(i, j, filler(i, j));
|
||||
}
|
||||
|
||||
template <typename T, int n, int m>
|
||||
vector<T, m+n> concat(const vector<T, n> &a, const vector<T, m> &b)
|
||||
{
|
||||
vector<T, m+n> result;
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
result.set(i, 0, a.get(i, 0));
|
||||
for (int i = 0; i < m; i++)
|
||||
result.set(i+n, 0, a.get(i, 0));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T, int n>
|
||||
vector<T, n> normalize(const vector<T, n> &vec)
|
||||
{
|
||||
T accumulator = T();
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
T temp = vec.get(i, 0);
|
||||
accumulator += temp * temp;
|
||||
}
|
||||
|
||||
accumulator = sqrt(accumulator);
|
||||
std::function<T(const T&)> normalizer = [accumulator](const T& item) { return item / accumulator; };
|
||||
return map(vec, normalizer);
|
||||
}
|
||||
|
||||
template <typename T, int m, int n>
|
||||
matrix<T, m, n> map(const matrix<T, m, n>& matrix, std::function<T(const T&)> func)
|
||||
{
|
||||
::matrix<T, m, n> result;
|
||||
|
||||
for (int i = 0; i < m; i++)
|
||||
for (int j = 0; j < n; j++)
|
||||
result.set(i, j, func(matrix.get(i, j)));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T, int m, int n>
|
||||
matrix<T, m, n> combine(const matrix<T, m, n>& a, const matrix<T, m, n>& b, std::function<T(const T&, const T&)> func)
|
||||
{
|
||||
::matrix<T, m, n> result;
|
||||
|
||||
for (int i = 0; i < m; i++)
|
||||
for (int j = 0; j < n; j++)
|
||||
result.set(i, j, func(a.get(i, j), b.get(i, j)));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T, int m, int n>
|
||||
matrix<T, m, n> combine(const matrix<T, m, n>& a, const matrix<T, m, n>& b, T c, T d)
|
||||
{
|
||||
return a*c + d*b;
|
||||
}
|
||||
|
||||
#endif
|
171
network.h
Normal file
171
network.h
Normal file
@ -0,0 +1,171 @@
|
||||
#ifndef NETWORK_H_
|
||||
#define NETWORK_H_
|
||||
|
||||
#include "matrix.h"
|
||||
#include <functional>
|
||||
|
||||
template <typename T, int in, int out>
|
||||
struct layer {
|
||||
using filler_t = std::function<T(const int&, const int&)>;
|
||||
using combiner_t = std::function<T(const T&, const T&)>;
|
||||
|
||||
matrix<T, out, in> weights;
|
||||
vector<T, out> bias;
|
||||
|
||||
vector<T, out> evaluate(vector<T, in> input)
|
||||
{
|
||||
return weights * input - bias;
|
||||
}
|
||||
|
||||
void fill(filler_t weight_filler, filler_t bias_filler)
|
||||
{
|
||||
::fill(weights, weight_filler);
|
||||
::fill(bias, bias_filler);
|
||||
}
|
||||
|
||||
void fill(filler_t filler)
|
||||
{
|
||||
// use same filler for both
|
||||
fill(filler, filler);
|
||||
}
|
||||
|
||||
layer<T, in, out> combine(const layer<T, in, out> &rhs, combiner_t weight_combiner, combiner_t bias_combiner)
|
||||
{
|
||||
layer<T, in, out> result;
|
||||
|
||||
result.weights = ::combine(weights, rhs.weights, weight_combiner);
|
||||
result.bias = ::combine(bias, rhs.bias, bias_combiner);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
layer<T, in, out> combine(const layer<T, in, out> &rhs, combiner_t combiner)
|
||||
{
|
||||
return combine(rhs, combiner, combiner);
|
||||
}
|
||||
};
|
||||
|
||||
template <std::size_t N, typename T, int ...inputs> struct layer_types;
|
||||
template <std::size_t N, typename T, int in, int out, int ...rest>
|
||||
struct layer_types<N, T, in, out, rest...> : layer_types<N-1, T, out, rest...> { };
|
||||
|
||||
template<typename T, int in, int out, int ...rest>
|
||||
struct layer_types<0, T, in, out, rest...> {
|
||||
using type = layer<T, in, out>;
|
||||
};
|
||||
|
||||
template <typename T, int ...layers> class network;
|
||||
|
||||
template <typename T, int in, int out>
|
||||
class network<T, in, out> {
|
||||
protected:
|
||||
layer<T, in, out> current;
|
||||
|
||||
public:
|
||||
static const std::size_t layer_count = 1;
|
||||
|
||||
using self = network<T, in, out>;
|
||||
|
||||
using output = vector<T, out>;
|
||||
using input = vector<T, in>;
|
||||
|
||||
using filler_t = typename layer<T, in, out>::filler_t;
|
||||
using combiner_t = typename layer<T, in, out>::combiner_t;
|
||||
using normalizer_t = std::function<T(const T&)>;
|
||||
|
||||
template <std::size_t N> using layer_type = typename layer_types<N, T, in, out>::type;
|
||||
|
||||
normalizer_t normalizer;
|
||||
|
||||
network(normalizer_t normalizer) : normalizer(normalizer) { }
|
||||
network() : network([](const T& value) { return value; }) { };
|
||||
|
||||
output evaluate(input inp)
|
||||
{
|
||||
return map(current.evaluate(inp), normalizer);
|
||||
}
|
||||
|
||||
template <std::size_t N> layer_type<N>& get()
|
||||
{
|
||||
return current;
|
||||
}
|
||||
|
||||
void fill(filler_t weights, filler_t bias)
|
||||
{
|
||||
current.fill(weights, bias);
|
||||
}
|
||||
|
||||
void fill(filler_t filler)
|
||||
{
|
||||
current.fill(filler);
|
||||
}
|
||||
|
||||
self combine(self& rhs, combiner_t weight_combiner, combiner_t bias_combiner) {
|
||||
self result;
|
||||
result.template get<0>() = get<0>().combine(rhs.template get<0>(), weight_combiner, bias_combiner);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
self combine(self& rhs, combiner_t combiner)
|
||||
{
|
||||
return combine(rhs, combiner, combiner);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, int in, int out, int ...layers>
|
||||
class network<T, in, out, layers...> : public network<T, in, out> {
|
||||
using base = network<T, in, out>;
|
||||
using self = network<T, in, out, layers...>;
|
||||
|
||||
network<T, out, layers...> subnetwork;
|
||||
|
||||
public:
|
||||
network(typename base::normalizer_t normalizer) : base(normalizer), subnetwork(normalizer) {}
|
||||
network() : network([](const T& value) { return value; }) { };
|
||||
|
||||
|
||||
using output = typename network<T, out, layers...>::output;
|
||||
static const std::size_t layer_count = sizeof...(layers) + 1;
|
||||
|
||||
template <std::size_t N> using layer_type = typename layer_types<N, T, in, out, layers...>::type;
|
||||
|
||||
template <std::size_t N> layer_type<N>& get()
|
||||
{
|
||||
return subnetwork.template get<N-1>();
|
||||
}
|
||||
|
||||
template<> layer_type<0>& get<0>()
|
||||
{
|
||||
return base::template get<0>();
|
||||
}
|
||||
|
||||
output evaluate(typename base::input inp)
|
||||
{
|
||||
auto result = base::evaluate(inp);
|
||||
return subnetwork.evaluate(result);
|
||||
}
|
||||
|
||||
void fill(typename base::filler_t filler)
|
||||
{
|
||||
base::fill(filler);
|
||||
subnetwork.fill(filler);
|
||||
}
|
||||
|
||||
void fill(typename base::filler_t weights, typename base::filler_t bias)
|
||||
{
|
||||
base::fill(weights, bias);
|
||||
subnetwork.fill(weights, bias);
|
||||
}
|
||||
|
||||
self combine(self& rhs, typename base::combiner_t weight_combiner, typename base::combiner_t bias_combiner) {
|
||||
self result;
|
||||
|
||||
result.template get<0>() = get<0>().combine(rhs.template get<0>(), weight_combiner, bias_combiner);
|
||||
result.subnetwork = subnetwork.combine(rhs.subnetwork);
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
16
sprawozdanie/macd.tex
Normal file
16
sprawozdanie/macd.tex
Normal file
@ -0,0 +1,16 @@
|
||||
\begin{axis}[
|
||||
axis lines=center, no marks,
|
||||
width=\linewidth, height=.66\linewidth,
|
||||
]
|
||||
\addplot table [x expr=\coordindex, y=price, col sep=comma] {\file};
|
||||
\end{axis}
|
||||
|
||||
\begin{axis}[
|
||||
axis lines=center, no marks,
|
||||
width=\linewidth, height=3cm,
|
||||
hide y axis,
|
||||
]
|
||||
\addplot table [x expr=\coordindex, y=macd, col sep=comma] {\file};
|
||||
\addplot table [x expr=\coordindex, y=signal, col sep=comma] {\file};
|
||||
\addplot table [x expr=\coordindex, y=delta, col sep=comma] {\file};
|
||||
\end{axis}
|
61
sprawozdanie/sprawozdanie.tex
Normal file
61
sprawozdanie/sprawozdanie.tex
Normal file
@ -0,0 +1,61 @@
|
||||
\documentclass[]{article}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{polski}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[margin=1.25in]{geometry}
|
||||
\usepackage{alltt}
|
||||
\usepackage{titling}
|
||||
\usepackage{pdfpages}
|
||||
\usepackage{float}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{booktabs}
|
||||
\usepackage{tabularx}
|
||||
\usepackage{amstext}
|
||||
\usepackage{pgfplots}
|
||||
\usepackage{tikz}
|
||||
\usepackage{xspace}
|
||||
\usepackage{enumerate}
|
||||
\usepackage{lmodern}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{mathtools}
|
||||
\usepackage{alphalph}
|
||||
\usepackage{algorithm}
|
||||
\usepackage{algpseudocode}
|
||||
\usepackage{wrapfig}
|
||||
\usepackage[polish]{babel}
|
||||
\usepackage{braket}
|
||||
\usepackage{subcaption}
|
||||
|
||||
\pgfplotsset{compat=1.15}
|
||||
|
||||
\DeclarePairedDelimiter\ceil{\lceil}{\rceil}
|
||||
\DeclarePairedDelimiter\floor{\lfloor}{\rfloor}
|
||||
|
||||
\usetikzlibrary{decorations.pathmorphing, arrows.meta, positioning}
|
||||
\usetikzlibrary{shapes.geometric, arrows}
|
||||
|
||||
\pgfdeclarelayer{background}
|
||||
\pgfdeclarelayer{foreground}
|
||||
\pgfsetlayers{background,main,foreground}
|
||||
|
||||
% opening
|
||||
\title{Analiza Techniczna - MACD \\ \normalsize Projekt \#1 z \texttt{MN}}
|
||||
\author{Kacper Donat}
|
||||
\newenvironment{column}[1]{\noindent\begin{minipage}{#1\linewidth}}{\end{minipage}\vspace{.5\baselineskip}}
|
||||
|
||||
\floatname{algorithm}{Program}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\newcommand{\macd}[1]{\def\file{#1}\input{macd.tex}}
|
||||
|
||||
\maketitle
|
||||
|
||||
\begin{figure}[H]
|
||||
\begin{tikzpicture}
|
||||
\macd{msft.csv}
|
||||
\end{tikzpicture}
|
||||
\caption{XD}
|
||||
\end{figure}
|
||||
|
||||
\end{document}
|
99
trainer.h
Normal file
99
trainer.h
Normal file
@ -0,0 +1,99 @@
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
template<class T>
|
||||
struct trained {
|
||||
unsigned int id;
|
||||
T decider;
|
||||
|
||||
double monies;
|
||||
unsigned stock;
|
||||
|
||||
double result;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class trainer {
|
||||
std::vector< trained<T>* > trainees;
|
||||
std::function<T()> factory;
|
||||
|
||||
unsigned int id;
|
||||
|
||||
public:
|
||||
double money;
|
||||
unsigned stock;
|
||||
|
||||
trainer(double money, unsigned stock, std::size_t n, std::function<T()> factory)
|
||||
: factory(factory), id(0), money(money), stock(stock)
|
||||
{
|
||||
add(n);
|
||||
}
|
||||
|
||||
void add(std::size_t n, std::function<T()> factory)
|
||||
{
|
||||
for(std::size_t i = 0; i < n; i++) {
|
||||
trained<T> *trainee = new trained<T>();
|
||||
trainee->id = ++id;
|
||||
trainee->result = 0.0;
|
||||
trainee->decider = factory();
|
||||
|
||||
trainees.push_back(trainee);
|
||||
}
|
||||
}
|
||||
|
||||
void add(std::size_t n)
|
||||
{
|
||||
add(n, factory);
|
||||
}
|
||||
|
||||
void test(std::istream& input)
|
||||
{
|
||||
for (auto trainee : trainees) {
|
||||
trainee->monies = money;
|
||||
trainee->stock = stock;
|
||||
|
||||
trainee->decider.start_money = money;
|
||||
trainee->decider.start_stock = stock;
|
||||
}
|
||||
|
||||
double price, start;
|
||||
input >> price;
|
||||
start = price*stock + money;
|
||||
|
||||
do {
|
||||
for (auto trainee : trainees) {
|
||||
auto decision = trainee->decider.decide(price, trainee->monies, trainee->stock);
|
||||
auto current = price*trainee->stock + trainee->monies;
|
||||
auto max_credit = std::max(current * 0.05, -1e4);
|
||||
|
||||
/* std::cout << "D: " << decision << " C: " << current << " P: " << price << " MC: " << max_credit << std::endl; */
|
||||
if (decision > 0 && trainee->monies - decision*price < -max_credit) {
|
||||
decision = floor((trainee->monies + max_credit) / price);
|
||||
}
|
||||
|
||||
if (decision < 0 && -decision > trainee->stock) {
|
||||
decision = -trainee->stock;
|
||||
}
|
||||
|
||||
trainee->stock += decision;
|
||||
trainee->monies -= price*decision;
|
||||
}
|
||||
} while (input >> price);
|
||||
|
||||
auto hodl = price * stock + money;
|
||||
std::cout << "Zakonczono testy " << trainees.size() << " przypadkow." << std::endl;
|
||||
std::cout << "HODL: " << hodl << " START: " << start << std::endl;
|
||||
std::cout << "-----------------------" << std::endl;
|
||||
|
||||
std::sort(trainees.begin(), trainees.end(), [=](trained<T> *a, trained<T> *b){
|
||||
return (a->monies + a->stock * price) > (b->monies + b->stock * price);
|
||||
});
|
||||
|
||||
for (auto trainee : trainees) {
|
||||
auto earned = trainee->monies + trainee->stock * price;
|
||||
std::cout << "#" << trainee->id << ": " << earned << " [" << earned - hodl << "] " << trainee->stock << " akcji, " << trainee->monies << " gelda w banku. " << std::endl;
|
||||
}
|
||||
}
|
||||
};
|
52
wtf.cpp
Normal file
52
wtf.cpp
Normal file
@ -0,0 +1,52 @@
|
||||
#include <iostream>
|
||||
#include <functional>
|
||||
#include <math.h>
|
||||
#include <typeinfo>
|
||||
#include <random>
|
||||
#include <ctime>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
#include "argh.h"
|
||||
#include "matrix.h"
|
||||
#include "network.h"
|
||||
#include "decider.h"
|
||||
#include "trainer.h"
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
argh::parser args;
|
||||
args.add_params({"-m", "--money"});
|
||||
args.add_params({"-s", "--stock"});
|
||||
args.add_params({"-p", "--population"});
|
||||
args.parse(argc, argv);
|
||||
|
||||
double money;
|
||||
unsigned stock, population;
|
||||
|
||||
args({ "m", "money" }, 1000.) >> money;
|
||||
args({ "s", "stock" }, 1000) >> stock;
|
||||
args({ "p", "population" }, 25) >> population;
|
||||
|
||||
std::uniform_real_distribution<double> distribution(-1.0, 1.0);
|
||||
std::default_random_engine random_engine;
|
||||
random_engine.seed(std::time(0));
|
||||
|
||||
std::function<double(const int&, const int&)> randomizer = [&](const int& i, const int& j) -> double {
|
||||
return distribution(random_engine);
|
||||
};
|
||||
|
||||
std::function<double(const double&)> normalizer = [](const double& result) -> double { return erf(result); };
|
||||
|
||||
using current_decider = neural_decider<24, 12, 12, 32, 16>;
|
||||
|
||||
std::function<current_decider()> factory = [&]() -> current_decider {
|
||||
current_decider decider(normalizer);
|
||||
decider.network.fill(randomizer);
|
||||
|
||||
return decider;
|
||||
};
|
||||
|
||||
trainer<current_decider> train(money, stock, population, factory);
|
||||
train.test(std::cin);
|
||||
}
|
Loading…
Reference in New Issue
Block a user