{ "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
date001180003376100032001469164818
2016-09-28200.00.0700.000.000270.0
2017-10-17100.0300.0225.000.0000.0
2017-12-12-90.0242.0-80.00380.0000.0
2018-01-180.00.0200.05100.0000.0
2018-07-05300.0200.0770.00-100.000210.0
2018-07-260.0-10000.00.00-0.0050.0
`);\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
date001180003376100032001469164818
02016-09-28200.00.0700.000.000270.0
12017-10-17100.0300.0225.000.0000.0
22017-12-12-90.0242.0-80.00380.0000.0
32018-01-180.00.0200.05100.0000.0
42018-07-05300.0200.0770.00-100.000210.0
52018-07-260.0-10000.00.00-0.0050.0
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
基金名称基金代码当日净值单位成本持有份额基金现值基金总申购历史最大占用基金持有成本基金分红与赎回换手率基金收益总额投资收益率
广发医药卫生联接A0011800.99770.831630.39628.94600.0523.86523.8676.140.180222105.0820.0588
`);\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
基金名称基金代码当日净值单位成本持有份额基金现值基金总申购历史最大占用基金持有成本基金分红与赎回换手率基金收益总额投资收益率
0广发医药卫生联接A0011800.99770.831630.39628.94600.0523.86523.8676.140.180222105.0820.0588
\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 }