{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"holdings.py is found and loaded within xalpha dir\n"
]
},
{
"data": {
"application/javascript": [
"\n",
" require.config({\n",
" paths: {\n",
" DT: '//cdn.datatables.net/1.10.20/js/jquery.dataTables.min',\n",
" }\n",
" });\n",
" $('head').append('');\n",
" $('head').append('')\n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import xalpha as xa\n",
"import pandas as pd\n",
"\n",
"xa.set_display(\"notebook\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 指定标的的交易分析"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* 想要进行交易分析首先需要交易单"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"path = \"../../tests/demo.csv\""
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"read = xa.record(path)\n",
"# record 类用来从指定位置读取 csv 文件,并将交易单数据存储在 self.status 中\n",
"# 该类可直接接受 pd.read_csv() 的多样的关键字参数,比如 skiprows=1, 这样就可以在真实的记账单首行标注基金名称,而不影响程序处理"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"$(element).html(`\n",
" \n",
" \n",
" date | \n",
" 001180 | \n",
" 003376 | \n",
" 100032 | \n",
" 001469 | \n",
" 164818 | \n",
"
\n",
" \n",
" \n",
" \n",
" 2016-09-28 | \n",
" 200.0 | \n",
" 0.0 | \n",
" 700.00 | \n",
" 0.000 | \n",
" 270.0 | \n",
"
\n",
" \n",
" 2017-10-17 | \n",
" 100.0 | \n",
" 300.0 | \n",
" 225.00 | \n",
" 0.000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2017-12-12 | \n",
" -90.0 | \n",
" 242.0 | \n",
" -80.00 | \n",
" 380.000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2018-01-18 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 200.05 | \n",
" 100.000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2018-07-05 | \n",
" 300.0 | \n",
" 200.0 | \n",
" 770.00 | \n",
" -100.000 | \n",
" 210.0 | \n",
"
\n",
" \n",
" 2018-07-26 | \n",
" 0.0 | \n",
" -10000.0 | \n",
" 0.00 | \n",
" -0.005 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
`);\n",
"\n",
" require([\"DT\"], function(DT) {$(document).ready( () => {\n",
" // Turn existing table into datatable\n",
" $(element).find(\"table.dataframe\").DataTable({'scrollX': '100%'});\n",
" })\n",
" });\n",
" "
],
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" date | \n",
" 001180 | \n",
" 003376 | \n",
" 100032 | \n",
" 001469 | \n",
" 164818 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2016-09-28 | \n",
" 200.0 | \n",
" 0.0 | \n",
" 700.00 | \n",
" 0.000 | \n",
" 270.0 | \n",
"
\n",
" \n",
" 1 | \n",
" 2017-10-17 | \n",
" 100.0 | \n",
" 300.0 | \n",
" 225.00 | \n",
" 0.000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2 | \n",
" 2017-12-12 | \n",
" -90.0 | \n",
" 242.0 | \n",
" -80.00 | \n",
" 380.000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 3 | \n",
" 2018-01-18 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 200.05 | \n",
" 100.000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 4 | \n",
" 2018-07-05 | \n",
" 300.0 | \n",
" 200.0 | \n",
" 770.00 | \n",
" -100.000 | \n",
" 210.0 | \n",
"
\n",
" \n",
" 5 | \n",
" 2018-07-26 | \n",
" 0.0 | \n",
" -10000.0 | \n",
" 0.00 | \n",
" -0.005 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" date 001180 003376 100032 001469 164818\n",
"0 2016-09-28 200.0 0.0 700.00 0.000 270.0\n",
"1 2017-10-17 100.0 300.0 225.00 0.000 0.0\n",
"2 2017-12-12 -90.0 242.0 -80.00 380.000 0.0\n",
"3 2018-01-18 0.0 0.0 200.05 100.000 0.0\n",
"4 2018-07-05 300.0 200.0 770.00 -100.000 210.0\n",
"5 2018-07-26 0.0 -10000.0 0.00 -0.005 0.0"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"read.status\n",
"# 一个示例的交易单演示\n",
"## 特别注意由于基金申购是按照金额,赎回是按照份额,因此交易单采用此惯例,正数代表申购金额,负数代表赎回份额\n",
"## 数据理论上小数点后两位有效,不过从第二位小数开始,数字起到了一些特殊标记的作用,因此仅完美支持一位小数,对于绝大多数人完全够用\n",
"## 金额是不需要考虑申购和赎回费的,简单记录您申购的总金额或赎回的份额,程序将完全充分的考虑所有申购赎回折算分红等情况,确保和真实持仓波动完全一致\n",
"## 在原始的 csv 形式中,0 不必要显式写出,直接空过去就好\n",
"## 小数点第二位的5,如果当天恰为该基金的登记分红日,则视为选择了分红再投入,否则默认分红拿现金\n",
"## 若负数绝对值小于 0.005,则视为赎回的份额比例而非份额数目, -0.005 表示清仓,依此线性缩放\n",
"## 更进一步的,非交易交易记录或是赎回份额超过持有总数, 程序都将作出协调自洽的处理\n",
"## 账单还可额外增加 property 行,控制金额赎回,分红默认再投入等更多细节,具体请参考文档"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* 现在分析一下 001180 基金的交易情形"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"f = xa.fundinfo(\"001180\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"广发医药卫生联接A"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"f_t = xa.trade(f, read.status) # 给定标的和账单,交易就生成了"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"广发医药卫生联接A"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f_t.aim # 查看该交易的标的"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"$(element).html(`\n",
" \n",
" \n",
" 基金名称 | \n",
" 基金代码 | \n",
" 当日净值 | \n",
" 单位成本 | \n",
" 持有份额 | \n",
" 基金现值 | \n",
" 基金总申购 | \n",
" 历史最大占用 | \n",
" 基金持有成本 | \n",
" 基金分红与赎回 | \n",
" 换手率 | \n",
" 基金收益总额 | \n",
" 投资收益率 | \n",
"
\n",
" \n",
" \n",
" \n",
" 广发医药卫生联接A | \n",
" 001180 | \n",
" 0.9977 | \n",
" 0.831 | \n",
" 630.39 | \n",
" 628.94 | \n",
" 600.0 | \n",
" 523.86 | \n",
" 523.86 | \n",
" 76.14 | \n",
" 0.180222 | \n",
" 105.08 | \n",
" 20.0588 | \n",
"
\n",
" \n",
"
`);\n",
"\n",
" require([\"DT\"], function(DT) {$(document).ready( () => {\n",
" // Turn existing table into datatable\n",
" $(element).find(\"table.dataframe\").DataTable({'scrollX': '100%'});\n",
" })\n",
" });\n",
" "
],
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 基金名称 | \n",
" 基金代码 | \n",
" 当日净值 | \n",
" 单位成本 | \n",
" 持有份额 | \n",
" 基金现值 | \n",
" 基金总申购 | \n",
" 历史最大占用 | \n",
" 基金持有成本 | \n",
" 基金分红与赎回 | \n",
" 换手率 | \n",
" 基金收益总额 | \n",
" 投资收益率 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 广发医药卫生联接A | \n",
" 001180 | \n",
" 0.9977 | \n",
" 0.831 | \n",
" 630.39 | \n",
" 628.94 | \n",
" 600.0 | \n",
" 523.86 | \n",
" 523.86 | \n",
" 76.14 | \n",
" 0.180222 | \n",
" 105.08 | \n",
" 20.0588 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 基金名称 基金代码 当日净值 单位成本 持有份额 基金现值 基金总申购 历史最大占用 基金持有成本 \\\n",
"0 广发医药卫生联接A 001180 0.9977 0.831 630.39 628.94 600.0 523.86 523.86 \n",
"\n",
" 基金分红与赎回 换手率 基金收益总额 投资收益率 \n",
"0 76.14 0.180222 105.08 20.0588 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f_t.dailyreport() # 该交易截止昨天的信息总结,也可以给定'2018-01-01'形式的时间参数,来了解任意一天的基金持有概况"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.04879311024975706"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f_t.xirrrate(\"2018-07-01\") # 计算截止7.1的 xirr 收益率,最客观的年化收益指标"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
" \n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f_t.v_totvalue() # 基金持有金额的变动可视化"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
" \n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f_t.v_tradecost() # 同时比较基金净值和自己交易的单位成本的变动\n",
"# 上面橙色点代表买入,蓝色点代表卖出,点的大小代表买卖数量"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
" \n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f_t.v_tradevolume(freq=\"W\") # 基金交易量的可视化"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"其他基金的交易分析同理。除了基金,指数类和货币基金类也可以作为交易标的进行交易和分析"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}