0%

分栏右侧显示卡

下面是分栏右侧的显示卡部分,使用 tabs 来分别展示“绩效分析”及“交易明细”。

绩效分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
def generate_display_tabs():
"""
:return: A Tab containing display graphs in right column
"""
tabs = html.Div(
[
dbc.Tabs(
[
dbc.Tab(label="绩效分析", tab_id="tab-summary"),
dbc.Tab(label="交易明细", tab_id="tab-details"),
],
id="tabs",
active_tab="tab-summary",
),
html.Div(id="tabs-content", children=generate_tab_summary_content()),
],
)
return tabs

def generate_tab_summary_content():
"""
:return: A Tab containing display graphs in right column
"""
df = pd.DataFrame(
{
"指标": ["alpha", "beta", "夏普比率", "信息比率", "年化收益", "最大回撤", "胜率", "利润", "持续时间"],
"值": ["0.0", "0.11", "-0.04", "0.0", "0.0263", "0.05", "0.56", "2637.7", "190"],
}
)

tab_summary_content = html.Div(
id="tab_summary_content",
children=[
html.Br(),
html.Div(
id="performance",
children=[
dbc.Label("组合表现"),
dcc.Graph(id="performance-chart", figure=initialize_performance_chart(),
)
],
),
html.Br(),
html.Div(
id="indicator",
children=[
dbc.Label("风险分析"),
dbc.Table.from_dataframe(df, striped=True, bordered=True, hover=True)
],
),
],
)
return tab_summary_content
阅读全文 »

阿尔法 (Alpha)
Alpha\(\alpha\),指的是一种投资相对于基准指数或市场基准的超额收益。Alpha 是投资策略成功与否的指标之一,反映了投资经理或投资策略在控制风险的前提下,相比基准市场(如标普 500 指数、沪深 300 等)创造的额外价值。 在金融分析中,Alpha 收益(Alpha Return)指的是一种投资相对于基准指数或市场基准的超额收益。Alpha 是投资策略成功与否的指标之一,反映了投资经理或投资策略在控制风险的前提下,相比基准市场(如标普 500 指数、沪深 300 等)创造的额外价值。

Alpha 的定义

Alpha 的计算公式如下:

\(\large \begin{equation} \alpha = R_p - (R_f + \beta \times (R_m - R_f)) \end{equation}\)

其中: - \(R_p\) 是投资组合的总收益率; - \(R_f\) 是无风险利率; - \(\beta\) 是投资组合对市场波动的敏感度,表示该组合的系统性风险; - \(R_m\) 是基准市场的收益率。

Alpha 代表了在控制了市场波动(即 Beta)的基础上,投资组合还能产生多少超额收益。这个超额收益体现了投资策略的有效性,也可以被视为投资经理增加的附加价值。

Alpha 的意义

α范围 含义
α=0 表明该投资策略准确地反映其内在价值
α>0 表明投资策略在一定的风险水平下跑赢了基准,显示出超额收益。
α<0 表明该投资策略未能跑赢基准指数,收益不理想。

Alpha 的大小:Alpha 越高,说明投资策略的效果越显著,其回报越高,通常是投资经理投资能力的体现。

Alpha 收益在投资策略中的应用

  • 业绩评估:用于衡量投资经理或基金的表现,看其是否能够在控制风险的前提下为投资者带来超额收益。
  • 策略优化:通过分析 Alpha,可以改进投资策略,找出在特定市场条件下的最佳组合。
  • 风险管理:与 Beta 收益不同,Alpha 收益反映的是对特定市场条件的相对表现,帮助管理特定市场风险。

简而言之,Alpha 收益是投资策略的一个关键表现指标,用于衡量相对于市场的主动管理效果,是投资管理中分析和评估超额收益的重要工具。

计算实例

使用 MACD 金叉死叉策略回测,时间段为 2024-01-052024-10-23。基准市场为沪深300。十年期国债收益率为 2.25%。

从数据库载入回测账户数据

1
2
3
4
5
6
7
from sf_account.account import Account

account = 'test'
portfolio = 's-pandas-qfq'
acc = Account(account_cookie=account, portfolio_cookie=portfolio)
df_asset = acc.assets.get('asset').reset_index()
return_asset = df_asset['balance'] / (asset_init_cash * 1.0) - 1

载入基准沪深 300 同时间段行情数据

1
2
3
4
5
from sf_query.query import fetch_index_day

df_hs300 = fetch_index_day(
['000300'], acc.start_date, acc.end_date, dataset_type='pandas').reset_index()
return_hs300 = df_hs300['close'] / df_hs300['close'].iloc[0] - 1

计算β值

Beta 系数计算方式如下:

\(\large \begin{equation} \beta_i = \frac{标的资产 i 的收益与市场收益的协方差}{市场收益的方差} = \frac{Cov (r_i, r_m)}{\sigma_m^2} \end{equation}\)

1
2
3
4
5
6
7
# 计算两者的协方差
covr = return_asset.cov(return_hs300)
# 计算沪深300指数数据的方差, pandas计算的为样本方差
var = return_hs300.var()
# 计算贝塔值
beta = covr / var
print("Covariance:{},Variance:{},Beta:{}".format(covr, var, beta))

输出为:Covariance: 3.996268373876412e-05,Variance: 0.0031905766470259685,Beta: 0.012525222917310114

计算α值

1
2
3
4
5
rp = annual_return_portfolio
rf = 0.0225
rm = annual_return_hs300
alpha = rp - (rf + beta * (rm - rf))
print(f"Alpha:{alpha}")

输出为:Alpha:-0.01486024492682044

参考

【1】 【Python】Pandas与numpy的方差计算 | 橘子树下

【2】 【Python】Pandas之dataframe与series的协方差计算 | 橘子树下

分栏左侧控制卡

下面是分栏左侧的控制卡部分,主要作用是选取回测组合测试,先选择回测账户,然后选择回测策略。然后从数据库中提取数据。用两个下拉框控件及一个按钮控件实现。

首先,我们需要创建 dcc.Store 来存储获取到的数据。在 App 的 layout 中增加以下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
pp.layout = dbc.Container(    
[
dcc.Location(id="url-refresh", refresh=True),
# Header
dbc.Container(
[
generate_header()
],
id="header-container",
fluid=True,
),
dbc.Row(
[
dbc.Col(id="left-column", children=generate_control_card(), md=2),
dbc.Col(id="right-column", children=generate_display_tabs(), md=10),
]

),
# 增加以下四行内容
dcc.Store(id="account-trade-history"),
dcc.Store(id="stock-day"),
dcc.Store(id="benchmark-day"),
dcc.Store(id='asset')


],
id="app-container",
fluid=True,
)
阅读全文 »

现在开始逐步构建页面布局中的元素。先从 Header 开始

1
2
3
4
5
6
7
8
9
10
11
12
13
# Generate Header
def generate_header():
"""
:return: A Header
"""
header = dbc.Row(
[
dbc.Col(html.Img(id="plotly-image", src=app.get_asset_url("sunflower_logo.png"),style={"height": "2rem"}), width="auto"),
dbc.Col(html.H5("回测分析(Back Test analysis)", id="header-title")),
],
id="header",
)
return header

代码详解:

该代码定义了一个 generate_header 函数,用于生成一个 Dash Bootstrap 网页的顶部标题栏 (Header)。此 Header 包含了一个图标和标题,并且它们按行布局排列。

  • 函数定义: generate_header()

    • 定义了一个返回 Header 的函数,不接受任何参数。
  • 创建 Header 内容:

    • header = dbc.Row([...]):

      • 创建了一个 Row 容器,使用 dash-bootstrap-components (简称 dbc) 中的 Row 组件,用于行布局。
    • 第一列 (dbc.Col):

      • dbc.Col(html.Img(...), width="auto"):
        • 这一列包含了一个图像元素 Img,图像的 src 路径由 app.get_asset_url("sunflower_logo.png") 指定,显示了名为 sunflower_logo.png 的图像文件。
        • width="auto":让这一列宽度根据图像大小自适应。
        • style={"height": "2rem"}:设置图像的高度为 2rem。
    • 第二列 (dbc.Col):

      • dbc.Col(html.H5(...)):
        • 包含一个 H5 标题元素,显示文本为 “回测分析(Back Test analysis)”,ID 为 "header-title"
  • Row 样式

    • id="header":给 Row 容器赋予 idheader,方便之后在样式或回调函数中引用。

备注

  • 行列布局:图像和标题文本在同一行中依次排列。

相关的 css 样式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#header {
background-color: #ffffff;
display: flex;
flex-direction: row;
align-items: center;
height: 4rem;
}

#header-title {
font-family: Acumin;
font-size: 1.5rem;
font-weight: bold;
color: #5cb3cc;
margin-left: 1rem;
}

代码解释:

#header: 选择器为 idheader 的元素应用样式。

  • background-color: #ffffff;:设置背景颜色为白色。
  • display: flex;:将 #header 设为 flex 容器,以便其子元素按弹性布局排列。
  • flex-direction: row;:设置主轴为水平方向,使子元素按行排列。
  • align-items: center;:沿着交叉轴(垂直方向)居中对齐 #header 中的子元素。
  • height: 4rem;:设置 #header 的高度为 4rem,保证其在页面中占据适当的垂直空间。

#header-title:选择器为 idheader-title 的元素应用样式。

  • font-family: Acumin;:设置字体为 Acumin
  • font-size: 1.5rem;:字体大小为 1.5rem,相对较大。
  • font-weight: bold;:设置字体粗细为 bold,使文字加粗。
  • color: #5cb3cc;:字体颜色为蓝绿色(#5cb3cc)。
  • margin-left: 1rem;:设置左外边距为 1rem,使其与前面的元素保持适当间距。

Logo 的设计可以用 logodesign 完成。

最终效果如图:

目的

在回测分析系统完成后,需要由原来的文字型输出结果转为 web 应用输出。因为输出中需要含有图,表类型的展示元素。考虑使用 Plotly 来完成。原因是基于 Plotly 同时出品了 Dash 生成 app。以及 [[【Dash】Dash-bootstrap主题|Dash Bootstrap 框架]] 来快速开发 web 应用。

布局设计

应用主要展示两个内容:

  • 绩效分析
  • 交易明细

设计思路分别如下:

|500 |500

阅读全文 »

# QAAccount与MongoDB

在使用QAAccoount类进行回测时,MongoDB数据库quantaxis中,会涉及到的数据表有 5 个, 分别是:

  • portfolio
  • user
  • account
  • risk
  • strategy

回测中的逻辑关系

|1000
阅读全文 »

如何将JupyterLab中的终端设置为Windows CMD,并且具有和Anaconda Prompt相同的效果,启动后直接进入特定的Conda环境?

1.生成配置文件

1
jupyter lab --generate-config
该命令会在用户目录中创建一个名字jupyter_lab_config.py的文件,以Windows系统为例,该文件位于C:\User\<user name>\.jupyter\下。

2.修改配置 编辑jupyter_lab_config.py,查找c.ServerApp.terminado_settings。进行以下设置:

1
2
3
## Supply overrides for terminado. Currently only supports "shell_command".
# Default: {}
c.ServerApp.terminado_settings = {'shell_command':['c:\\Windows\\System32\\cmd.exe', '/k','D:\\anaconda3\\Scripts\\activate_terminal.bat','&title','Conda']}
shell_command是以字典方式表式,值为列表方式。目录分隔符使用"\"。执行时等效于 c:\Windows\System32\cmd.exe /k D:\anaconda3\Scripts\activate_terminal.bat &title Conda

其中active_terminal.bat内容如下:

1
2
3
@echo off
call D:\anaconda3\Scripts\activate.bat D:\anaconda3
call conda activate Python3.10.14
Python3.10.14为创建好的Conda环境名。

3.效果 |600