hikyuu2/hikyuu_pywrap/trade_sys/_MultiFactor.cpp
2024-03-17 18:57:14 +08:00

170 lines
6.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2024 hikyuu.org
*
* Created on: 2024-03-13
* Author: fasiondog
*/
#include <hikyuu/trade_sys/factor/build_in.h>
#include "../pybind_utils.h"
namespace py = pybind11;
using namespace hku;
class PyMultiFactor : public MultiFactorBase {
PY_CLONE(PyMultiFactor, MultiFactorBase)
public:
using MultiFactorBase::MultiFactorBase;
IndicatorList _calculate(const vector<IndicatorList>& all_stk_inds) {
PYBIND11_OVERLOAD_PURE_NAME(IndicatorList, MultiFactorBase, "_calculate", _calculate,
all_stk_inds);
}
};
void export_MultiFactor(py::module& m) {
size_t null_size = Null<size_t>();
py::class_<MultiFactorBase, MultiFactorPtr, PyMultiFactor>(m, "MultiFactor",
R"(市场环境判定策略基类
- _calculate :
- _clone :
- _reset : )")
.def(py::init<>())
.def("__str__", to_py_str<MultiFactorBase>)
.def("__repr__", to_py_str<MultiFactorBase>)
.def_property("name", py::overload_cast<>(&MultiFactorBase::name, py::const_),
py::overload_cast<const string&>(&MultiFactorBase::name),
py::return_value_policy::copy, "名称")
.def("get_query", &MultiFactorBase::getQuery, py::return_value_policy::copy)
.def("get_param", &MultiFactorBase::getParam<boost::any>, R"(get_param(self, name)
:param str name:
:return:
:raises out_of_range: )")
.def("set_param", &MultiFactorBase::setParam<boost::any>, R"(set_param(self, name, value)
:param str name:
:param value:
:raises logic_error: Unsupported type! )")
.def("have_param", &MultiFactorBase::haveParam, "是否存在指定参数")
.def("get_ref_stock", &MultiFactorBase::getRefStock, py::return_value_policy::copy)
.def("get_datetime_list", &MultiFactorBase::getDatetimeList, py::return_value_policy::copy)
.def("get_stock_list", &MultiFactorBase::getStockList, py::return_value_policy::copy)
.def("get_stock_list_num", &MultiFactorBase::getStockListNumber)
.def("get_ref_indicators", &MultiFactorBase::getRefIndicators, py::return_value_policy::copy)
.def("get_factor", &MultiFactorBase::getFactor, py::return_value_policy::copy)
.def("get_all_factors", &MultiFactorBase::getAllFactors, py::return_value_policy::copy)
.def("get_ic", &MultiFactorBase::getIC, py::arg("ndays") = 0)
.def("get_icir", &MultiFactorBase::getICIR, py::arg("ir_n"), py::arg("ic_n") = 0)
.def("clone", &MultiFactorBase::clone)
.def(
"get_cross",
[](MultiFactorBase& self, const Datetime& date, size_t start, size_t end) {
py::list ret;
auto cross = self.getCross(date, start, end);
for (const auto& item : cross) {
ret.append(py::make_tuple(item.first, item.second));
}
return ret;
},
py::arg("date"), py::arg("start") = 0, py::arg("end") = null_size)
.def("get_all_cross",
[](MultiFactorBase& self) {
py::list ret;
auto all_cross = self.getAllCross();
for (const auto& one_day : all_cross) {
py::list one;
for (const auto& item : one_day) {
one.append(py::make_tuple(item.first, item.second));
}
ret.append(std::move(one));
}
return ret;
})
DEF_PICKLE(MultiFactorPtr);
m.def(
"MF_EqualWeight",
[](const py::sequence& inds, const py::sequence& stks, const KQuery& query,
const Stock& ref_stk, int ic_n) {
IndicatorList c_inds = python_list_to_vector<Indicator>(inds);
StockList c_stks = python_list_to_vector<Stock>(stks);
return MF_EqualWeight(c_inds, c_stks, query, ref_stk, ic_n);
},
py::arg("inds"), py::arg("stks"), py::arg("query"), py::arg("ref_stk"), py::arg("ic_n") = 5,
R"(MF_EqualWeight(inds, stks, query, ref_stk[, ic_n=5])
:param sequense(Indicator) inds:
:param sequense(stock) stks:
:param Query query:
:param Stock ref_stk:
:param int ic_n: IC N
:rtype: MultiFactorPtr)");
m.def(
"MF_ICWeight",
[](const py::sequence& inds, const py::sequence& stks, const KQuery& query,
const Stock& ref_stk, int ic_n, int ic_rolling_n) {
// MF_EqualWeight
IndicatorList c_inds = python_list_to_vector<Indicator>(inds);
StockList c_stks = python_list_to_vector<Stock>(stks);
return MF_ICWeight(c_inds, c_stks, query, ref_stk, ic_n);
},
py::arg("inds"), py::arg("stks"), py::arg("query"), py::arg("ref_stk"), py::arg("ic_n") = 5,
py::arg("ic_rolling_n") = 120,
R"(MF_EqualWeight(inds, stks, query, ref_stk[, ic_n=5, ic_rolling_n=120])
IC权重合成因子
:param sequense(Indicator) inds:
:param sequense(stock) stks:
:param Query query:
:param Stock ref_stk:
:param int ic_n: IC N
:param int ic_rolling_n: IC
:rtype: MultiFactorPtr)");
m.def(
"MF_ICIRWeight",
[](const py::sequence& inds, const py::sequence& stks, const KQuery& query,
const Stock& ref_stk, int ic_n, int ic_rolling_n) {
// MF_EqualWeight
IndicatorList c_inds = python_list_to_vector<Indicator>(inds);
StockList c_stks = python_list_to_vector<Stock>(stks);
return MF_ICIRWeight(c_inds, c_stks, query, ref_stk, ic_n);
},
py::arg("inds"), py::arg("stks"), py::arg("query"), py::arg("ref_stk"), py::arg("ic_n") = 5,
py::arg("ic_rolling_n") = 120,
R"(MF_EqualWeight(inds, stks, query, ref_stk[, ic_n=5, ic_rolling_n=120])
ICIR权重合成因子
:param sequense(Indicator) inds:
:param sequense(stock) stks:
:param Query query:
:param Stock ref_stk:
:param int ic_n: IC N
:param int ic_rolling_n: IC
:rtype: MultiFactorPtr)");
}