Skip to content

Commit

Permalink
[Add] initial
Browse files Browse the repository at this point in the history
  • Loading branch information
bug-or-feature committed Jan 23, 2024
1 parent 1c31a8c commit 7f57be6
Show file tree
Hide file tree
Showing 21 changed files with 1,198 additions and 164 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ coverage.xml

# Translations
*.mo
*.pot

# Django stuff:
*.log
Expand Down
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
recursive-include vnpy_ctastrategy *.ico *.ini *.dll *.so *.pyd *.h *.hpp *.cpp, *.mo
3 changes: 2 additions & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,12 @@ classifiers =

[options]
packages = find:
include_package_data = True
zip_safe = False
python_requires = >=3.8
install_requires =
pandas
plotly

[options.package_data]
* = *.ico
* = *.ico, *.mo
4 changes: 2 additions & 2 deletions vnpy_ctastrategy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
from .engine import CtaEngine
from .template import CtaTemplate, CtaSignal, TargetPosTemplate


try:
__version__ = importlib_metadata.version("vnpy_ctastrategy")
except importlib_metadata.PackageNotFoundError:
Expand All @@ -43,11 +42,12 @@

class CtaStrategyApp(BaseApp):
""""""
from .locale import _

app_name: str = APP_NAME
app_module: str = __module__
app_path: Path = Path(__file__).parent
display_name: str = "CTA策略"
display_name: str = _("CTA策略")
engine_class: Type[CtaEngine] = CtaEngine
widget_name: str = "CtaManager"
icon_name: str = str(app_path.joinpath("ui", "cta.ico"))
96 changes: 48 additions & 48 deletions vnpy_ctastrategy/backtesting.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
INTERVAL_DELTA_MAP
)
from .template import CtaTemplate

from .locale import _

class BacktestingEngine:
""""""
Expand Down Expand Up @@ -156,13 +156,13 @@ def add_strategy(self, strategy_class: Type[CtaTemplate], setting: dict) -> None

def load_data(self) -> None:
""""""
self.output("开始加载历史数据")
self.output(_("开始加载历史数据"))

if not self.end:
self.end = datetime.now()

if self.start >= self.end:
self.output("起始日期必须小于结束日期")
self.output(_("起始日期必须小于结束日期"))
return

self.history_data.clear() # Clear previously loaded history data
Expand All @@ -179,7 +179,7 @@ def load_data(self) -> None:

while start < self.end:
progress_bar: str = "#" * int(progress * 10 + 1)
self.output(f"加载进度:{progress_bar} [{progress:.0%}]")
self.output(_("加载进度:{} [{:.0%}]").format(progress_bar, progress))

end: datetime = min(end, self.end) # Make sure end time stays within set range

Expand Down Expand Up @@ -207,7 +207,7 @@ def load_data(self) -> None:
start = end + interval_delta
end += progress_delta

self.output(f"历史数据加载完成,数据量:{len(self.history_data)}")
self.output(_("历史数据加载完成,数据量:{}").format(len(self.history_data)))

def run_backtesting(self) -> None:
""""""
Expand All @@ -218,11 +218,11 @@ def run_backtesting(self) -> None:

self.strategy.on_init()
self.strategy.inited = True
self.output("策略初始化完成")
self.output(_("策略初始化完成"))

self.strategy.on_start()
self.strategy.trading = True
self.output("开始回放历史数据")
self.output(_("开始回放历史数据"))

total_size: int = len(self.history_data)
batch_size: int = max(int(total_size / 10), 1)
Expand All @@ -233,23 +233,23 @@ def run_backtesting(self) -> None:
try:
func(data)
except Exception:
self.output("触发异常,回测终止")
self.output(_("触发异常,回测终止"))
self.output(traceback.format_exc())
return

progress = min(ix / 10, 1)
progress_bar: str = "=" * (ix + 1)
self.output(f"回放进度:{progress_bar} [{progress:.0%}]")
self.output(_("回放进度:{} [{:.0%}]").format(progress_bar, progress))

self.strategy.on_stop()
self.output("历史数据回放结束")
self.output(_("历史数据回放结束"))

def calculate_result(self) -> DataFrame:
""""""
self.output("开始计算逐日盯市盈亏")
self.output(_("开始计算逐日盯市盈亏"))

if not self.trades:
self.output("回测成交记录为空")
self.output(_("回测成交记录为空"))

# Add trade data into daily reuslt.
for trade in self.trades.values():
Expand Down Expand Up @@ -282,12 +282,12 @@ def calculate_result(self) -> DataFrame:

self.daily_df = DataFrame.from_dict(results).set_index("date")

self.output("逐日盯市盈亏计算完成")
self.output(_("逐日盯市盈亏计算完成"))
return self.daily_df

def calculate_statistics(self, df: DataFrame = None, output=True) -> dict:
""""""
self.output("开始计算策略统计指标")
self.output(_("开始计算策略统计指标"))

# Check DataFrame input exterior
if df is None:
Expand Down Expand Up @@ -344,7 +344,7 @@ def calculate_statistics(self, df: DataFrame = None, output=True) -> dict:
# All balance value needs to be positive
positive_balance = (df["balance"] > 0).all()
if not positive_balance:
self.output("回测中出现爆仓(资金小于等于0),无法计算策略统计指标")
self.output(_("回测中出现爆仓(资金小于等于0),无法计算策略统计指标"))

# Calculate statistics value
if positive_balance:
Expand Down Expand Up @@ -401,38 +401,38 @@ def calculate_statistics(self, df: DataFrame = None, output=True) -> dict:
# Output
if output:
self.output("-" * 30)
self.output(f"首个交易日:\t{start_date}")
self.output(f"最后交易日:\t{end_date}")

self.output(f"总交易日:\t{total_days}")
self.output(f"盈利交易日:\t{profit_days}")
self.output(f"亏损交易日:\t{loss_days}")

self.output(f"起始资金:\t{self.capital:,.2f}")
self.output(f"结束资金:\t{end_balance:,.2f}")

self.output(f"总收益率:\t{total_return:,.2f}%")
self.output(f"年化收益:\t{annual_return:,.2f}%")
self.output(f"最大回撤: \t{max_drawdown:,.2f}")
self.output(f"百分比最大回撤: {max_ddpercent:,.2f}%")
self.output(f"最长回撤天数: \t{max_drawdown_duration}")

self.output(f"总盈亏:\t{total_net_pnl:,.2f}")
self.output(f"总手续费:\t{total_commission:,.2f}")
self.output(f"总滑点:\t{total_slippage:,.2f}")
self.output(f"总成交金额:\t{total_turnover:,.2f}")
self.output(f"总成交笔数:\t{total_trade_count}")

self.output(f"日均盈亏:\t{daily_net_pnl:,.2f}")
self.output(f"日均手续费:\t{daily_commission:,.2f}")
self.output(f"日均滑点:\t{daily_slippage:,.2f}")
self.output(f"日均成交金额:\t{daily_turnover:,.2f}")
self.output(f"日均成交笔数:\t{daily_trade_count}")

self.output(f"日均收益率:\t{daily_return:,.2f}%")
self.output(f"收益标准差:\t{return_std:,.2f}%")
self.output(_("首个交易日:\t{}").format(start_date))
self.output(_("最后交易日:\t{}").format(end_date))

self.output(_("总交易日:\t{}").format(total_days))
self.output(_("盈利交易日:\t{}").format(profit_days))
self.output(_("亏损交易日:\t{}").format(loss_days))

self.output(_("起始资金:\t{:,.2f}").format(self.capital))
self.output(_("结束资金:\t{:,.2f}").format(end_balance))

self.output(_("总收益率:\t{:,.2f}%").format(total_return))
self.output(_("年化收益:\t{:,.2f}%").format(annual_return))
self.output(_("最大回撤: \t{:,.2f}").format(max_drawdown))
self.output(_("百分比最大回撤: {:,.2f}%").format(max_ddpercent))
self.output(_("最长回撤天数: \t{}").format(max_drawdown_duration))

self.output(_("总盈亏:\t{:,.2f}").format(total_net_pnl))
self.output(_("总手续费:\t{:,.2f}").format(total_commission))
self.output(_("总滑点:\t{:,.2f}").format(total_slippage))
self.output(_("总成交金额:\t{:,.2f}").format(total_turnover))
self.output(_("总成交笔数:\t{}").format(total_trade_count))

self.output(_("日均盈亏:\t{:,.2f}").format(daily_net_pnl))
self.output(_("日均手续费:\t{:,.2f}").format(daily_commission))
self.output(_("日均滑点:\t{:,.2f}").format(daily_slippage))
self.output(_("日均成交金额:\t{:,.2f}").format(daily_turnover))
self.output(_("日均成交笔数:\t{}").format(daily_trade_count))

self.output(_("日均收益率:\t{:,.2f}%").format(daily_return))
self.output(_("收益标准差:\t{:,.2f}%").format(return_std))
self.output(f"Sharpe Ratio:\t{sharpe_ratio:,.2f}")
self.output(f"收益回撤比:\t{return_drawdown_ratio:,.2f}")
self.output(_("收益回撤比:\t{:,.2f}").format(return_drawdown_ratio))

statistics: dict = {
"start_date": start_date,
Expand Down Expand Up @@ -469,7 +469,7 @@ def calculate_statistics(self, df: DataFrame = None, output=True) -> dict:
value = 0
statistics[key] = np.nan_to_num(value)

self.output("策略统计指标计算完成")
self.output(_("策略统计指标计算完成"))
return statistics

def show_chart(self, df: DataFrame = None) -> None:
Expand Down Expand Up @@ -536,7 +536,7 @@ def run_bf_optimization(

if output:
for result in results:
msg: str = f"参数:{result[0]}, 目标:{result[1]}"
msg: str = _("参数:{}, 目标:{}").format(result[0], result[1])
self.output(msg)

return results
Expand Down
11 changes: 6 additions & 5 deletions vnpy_ctastrategy/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,21 @@
from typing import Dict

from vnpy.trader.constant import Direction, Offset, Interval
from .locale import _

APP_NAME = "CtaStrategy"
STOPORDER_PREFIX = "STOP"


class StopOrderStatus(Enum):
WAITING = "等待中"
CANCELLED = "已撤销"
TRIGGERED = "已触发"
WAITING = _("等待中")
CANCELLED = _("已撤销")
TRIGGERED = _("已触发")


class EngineType(Enum):
LIVE = "实盘"
BACKTESTING = "回测"
LIVE = _("实盘")
BACKTESTING = _("回测")


class BacktestingMode(Enum):
Expand Down
Loading

0 comments on commit 7f57be6

Please sign in to comment.