# tgtrader天工量化投研分析客户端
- 提供开箱即用的分析工具
- 对于小白,可以直接使用可视化分析工具,零代码开启量化分析
- 对于有一定经验的开发者,结合使用sdk开发,更加灵活
## 源码地址
- github: https://github.com/smartian1/tgtrader
- gitee: https://gitee.com/smartian123/tgtrader
## 安装
```bash
pip install tgtrader
如果网络不通,可以使用国内镜像源
pip install tgtrader -i https://mirrors.aliyun.com/pypi/simple/
```
## 更新日志
v1.0.1
- 增加数据初始化、数据查询页面
- 增加知识库页面,显示jupyter notebook
v1.0.0
可视化策略回测
- 支持在**本地运行可视化页面**, 仅需两行代码
- 已支持的**内置策略**: 目标权重策略, 风险平价策略 (策略不断扩充中)
- **我的策略**: 将回测策略及参数保存到个人空间
- **策略详情**: 查看策略详情, 并支持查看策略回测和模拟阶段绩效
SDK功能
- 支持获取国内ETF数据、股票数据(使用AKShare获取数据)
- 支持自定义策略类
## 客户端使用说明
```bash
创建虚拟环境(建议)
python -m venv venv_tgtrader
激活虚拟环境
1. windows
.\venv_tgtrader\Scripts\activate
2. mac/linux
source venv_tgtrader/bin/activate
安装tgtrader
pip install tgtrader
初始化数据
python -m tgtrader.streamlit_pages.init_data
启动客户端
1. 创建一个python文件(要与初始化数据时目录保持一致),例如:tgtrader_cli.py
2. 在文件中添加以下代码:
from tgtrader.streamlit_pages.main import run
run()
3. 运行
streamlit run tgtrader_cli.py
```
### 一、数据模块
#### 1.1 数据下载
点击“数据初始化”,进入下载页面。选择需要更新的数据以及时间段,进行更新。
**数据下载了有什么用**:
1. 可在数据查询页面用sql进行查询,进行探索性分析
2. 后续因子计算,直接用本地数据进行计算,提升效率
![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/data_init.png)
#### 1.2 数据查询
tgtrader底层使用duckdb存储数据,使用duckdb sql即可进行查询
**为什么用duckdb**:
1. sql与标准sql基本一致,使用sql进行数据分析效率更高,更加灵活
2. duckdb性能非常高,适合OLAP分析类场景
3. 在量化交易中,需要频繁的对行情数据做时间序列和截面的计算,duckdb对此有比较好的支持。基本上pandas能够做的,duckdb都可以做,而且duckdb的性能更高
![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/data_query.png)
### 二、策略模块
#### 2.1 已支持的内置策略
| 策略名称 | 策略说明 | 适用场景 |
|---------|---------|----------|
| 目标权重策略 | 根据预设的目标权重定期调仓,是最基础的资产配置策略 | 适用于有明确资产配置目标的场景,如60/40策略、风险等级配置等 |
| 风险平价策略 | 通过计算资产的风险贡献,使各资产的风险贡献相等,实现风险的平衡配置 | 适用于追求风险平衡、稳健收益的场景,特别是在市场波动较大时期 |
##### 2.1.1 目标权重策略
![目标权重策略](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/target_weight_strategy.png)
![目标权重策略](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/target_weight_strategy_result.png)
##### 2.1.2 风险平价策略
![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/risk_parity_strategy.png)
#### 2.2 我的策略
策略回测完成之后,可以保存到“我的策略”
![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/save_strategy.png)
进入“我的策略”,可以查看保存的策略列表
![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/my_strategies.png)
选中某个策略,并点击“查看”,可以查看策略的收益绩效。蓝色部分是回测收益曲线,红色部分是回测之后时间段的收益曲线。通过观察红线,可以了解策略仍然有效
![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/my_strategies_backtest.png)
## SDK使用说明
### 获取数据
```python
from tgtrader.data import DataGetter
from tgtrader.common import PriceAdjust, Period, SecurityType
symbols = [
'511260', # 十年国债ETF
'159915', # 创业板ETF
'510500', # 500ETF
'159919', # 沪深300ETF
'510880', # 红利ETF
'518880', # 黄金ETF
'513100', # 纳指ETF
]
data_getter = DataGetter()
df = data_getter.get_price(symbols,
"2010-01-01",
"2024-11-30",
period=Period.Day,
fields=["open","close","high","low","volume"],
security_type=SecurityType.ETF,
adjust=PriceAdjust.HFQ)
df
```
| 参数 | 类型 | 说明 | 示例值 |
|------|------|------|---------|
| symbols | List[str] | 证券代码列表 | ['511260', '159915'] |
| start_date | str | 开始日期,格式为YYYY-MM-DD | '2010-01-01' |
| end_date | str | 结束日期,格式为YYYY-MM-DD | '2024-11-30' |
| period | Period | 数据周期,可选值:Day(日线)、Week(周线)、Month(月线) | Period.Day |
| fields | List[str] | 需要获取的字段,可选值:open、close、high、low、volume | ['open', 'close'] |
| security_type | SecurityType | 证券类型,可选值:ETF、Stock | SecurityType.ETF |
| adjust | PriceAdjust | 价格复权方式,可选值:None(不复权)、QFQ(前复权)、HFQ(后复权) | PriceAdjust.HFQ |
![get_data](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/get_data.png)
## 微信公众号: 天工量化
**关注即可获取**:
1. tgtrader的最佳实践:如何用好tgtrader以提高投研效率
2. 研报复现:各大券商研报复现,源码公开
3. 策略分享:基于tg量化工具集,实现各类策略
4. 实盘跟踪:已上线的实盘策略持续跟进
Raw data
{
"_id": null,
"home_page": null,
"name": "tgtrader",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": "smartian <smartian@163.com>",
"keywords": "quantitative, trading, investment, analysis",
"author": null,
"author_email": "smartian <smartian@163.com>",
"download_url": "https://files.pythonhosted.org/packages/09/88/6fedaa9c69309ddde08c47655d2576c62740e8c4382cbe3d0e4e6e078aeb/tgtrader-1.0.1.tar.gz",
"platform": null,
"description": "# tgtrader\u5929\u5de5\u91cf\u5316\u6295\u7814\u5206\u6790\u5ba2\u6237\u7aef\r\n\r\n- \u63d0\u4f9b\u5f00\u7bb1\u5373\u7528\u7684\u5206\u6790\u5de5\u5177\r\n- \u5bf9\u4e8e\u5c0f\u767d\uff0c\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u53ef\u89c6\u5316\u5206\u6790\u5de5\u5177\uff0c\u96f6\u4ee3\u7801\u5f00\u542f\u91cf\u5316\u5206\u6790\r\n- \u5bf9\u4e8e\u6709\u4e00\u5b9a\u7ecf\u9a8c\u7684\u5f00\u53d1\u8005\uff0c\u7ed3\u5408\u4f7f\u7528sdk\u5f00\u53d1\uff0c\u66f4\u52a0\u7075\u6d3b\r\n\r\n## \u6e90\u7801\u5730\u5740\r\n- github: https://github.com/smartian1/tgtrader\r\n- gitee: https://gitee.com/smartian123/tgtrader \r\n\r\n\r\n## \u5b89\u88c5\r\n\r\n```bash\r\npip install tgtrader\r\n\r\n\u5982\u679c\u7f51\u7edc\u4e0d\u901a\uff0c\u53ef\u4ee5\u4f7f\u7528\u56fd\u5185\u955c\u50cf\u6e90\r\npip install tgtrader -i https://mirrors.aliyun.com/pypi/simple/\r\n```\r\n\r\n## \u66f4\u65b0\u65e5\u5fd7\r\nv1.0.1\r\n- \u589e\u52a0\u6570\u636e\u521d\u59cb\u5316\u3001\u6570\u636e\u67e5\u8be2\u9875\u9762\r\n- \u589e\u52a0\u77e5\u8bc6\u5e93\u9875\u9762\uff0c\u663e\u793ajupyter notebook\r\n \r\nv1.0.0\r\n\r\n\u53ef\u89c6\u5316\u7b56\u7565\u56de\u6d4b\r\n- \u652f\u6301\u5728**\u672c\u5730\u8fd0\u884c\u53ef\u89c6\u5316\u9875\u9762**, \u4ec5\u9700\u4e24\u884c\u4ee3\u7801\r\n- \u5df2\u652f\u6301\u7684**\u5185\u7f6e\u7b56\u7565**: \u76ee\u6807\u6743\u91cd\u7b56\u7565, \u98ce\u9669\u5e73\u4ef7\u7b56\u7565 (\u7b56\u7565\u4e0d\u65ad\u6269\u5145\u4e2d)\r\n- **\u6211\u7684\u7b56\u7565**: \u5c06\u56de\u6d4b\u7b56\u7565\u53ca\u53c2\u6570\u4fdd\u5b58\u5230\u4e2a\u4eba\u7a7a\u95f4\r\n- **\u7b56\u7565\u8be6\u60c5**: \u67e5\u770b\u7b56\u7565\u8be6\u60c5, \u5e76\u652f\u6301\u67e5\u770b\u7b56\u7565\u56de\u6d4b\u548c\u6a21\u62df\u9636\u6bb5\u7ee9\u6548\r\n\r\nSDK\u529f\u80fd\r\n- \u652f\u6301\u83b7\u53d6\u56fd\u5185ETF\u6570\u636e\u3001\u80a1\u7968\u6570\u636e\uff08\u4f7f\u7528AKShare\u83b7\u53d6\u6570\u636e\uff09\r\n- \u652f\u6301\u81ea\u5b9a\u4e49\u7b56\u7565\u7c7b\r\n\r\n## \u5ba2\u6237\u7aef\u4f7f\u7528\u8bf4\u660e\r\n```bash\r\n\u521b\u5efa\u865a\u62df\u73af\u5883(\u5efa\u8bae)\r\npython -m venv venv_tgtrader\r\n\r\n\u6fc0\u6d3b\u865a\u62df\u73af\u5883\r\n1. windows\r\n.\\venv_tgtrader\\Scripts\\activate\r\n2. mac/linux\r\nsource venv_tgtrader/bin/activate\r\n\r\n\u5b89\u88c5tgtrader\r\npip install tgtrader\r\n\r\n\u521d\u59cb\u5316\u6570\u636e\r\npython -m tgtrader.streamlit_pages.init_data\r\n\r\n\u542f\u52a8\u5ba2\u6237\u7aef\r\n1. \u521b\u5efa\u4e00\u4e2apython\u6587\u4ef6(\u8981\u4e0e\u521d\u59cb\u5316\u6570\u636e\u65f6\u76ee\u5f55\u4fdd\u6301\u4e00\u81f4)\uff0c\u4f8b\u5982\uff1atgtrader_cli.py\r\n2. \u5728\u6587\u4ef6\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u4ee3\u7801\uff1a\r\n\r\nfrom tgtrader.streamlit_pages.main import run\r\nrun()\r\n\r\n3. \u8fd0\u884c\r\n streamlit run tgtrader_cli.py\r\n```\r\n\r\n### \u4e00\u3001\u6570\u636e\u6a21\u5757\r\n#### 1.1 \u6570\u636e\u4e0b\u8f7d\r\n\u70b9\u51fb\u201c\u6570\u636e\u521d\u59cb\u5316\u201d\uff0c\u8fdb\u5165\u4e0b\u8f7d\u9875\u9762\u3002\u9009\u62e9\u9700\u8981\u66f4\u65b0\u7684\u6570\u636e\u4ee5\u53ca\u65f6\u95f4\u6bb5\uff0c\u8fdb\u884c\u66f4\u65b0\u3002\r\n\r\n**\u6570\u636e\u4e0b\u8f7d\u4e86\u6709\u4ec0\u4e48\u7528**\uff1a\r\n1. \u53ef\u5728\u6570\u636e\u67e5\u8be2\u9875\u9762\u7528sql\u8fdb\u884c\u67e5\u8be2\uff0c\u8fdb\u884c\u63a2\u7d22\u6027\u5206\u6790\r\n2. \u540e\u7eed\u56e0\u5b50\u8ba1\u7b97\uff0c\u76f4\u63a5\u7528\u672c\u5730\u6570\u636e\u8fdb\u884c\u8ba1\u7b97\uff0c\u63d0\u5347\u6548\u7387\r\n![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/data_init.png)\r\n\r\n#### 1.2 \u6570\u636e\u67e5\u8be2\r\ntgtrader\u5e95\u5c42\u4f7f\u7528duckdb\u5b58\u50a8\u6570\u636e\uff0c\u4f7f\u7528duckdb sql\u5373\u53ef\u8fdb\u884c\u67e5\u8be2\r\n\r\n**\u4e3a\u4ec0\u4e48\u7528duckdb**\uff1a\r\n1. sql\u4e0e\u6807\u51c6sql\u57fa\u672c\u4e00\u81f4\uff0c\u4f7f\u7528sql\u8fdb\u884c\u6570\u636e\u5206\u6790\u6548\u7387\u66f4\u9ad8\uff0c\u66f4\u52a0\u7075\u6d3b\r\n2. duckdb\u6027\u80fd\u975e\u5e38\u9ad8\uff0c\u9002\u5408OLAP\u5206\u6790\u7c7b\u573a\u666f\r\n3. \u5728\u91cf\u5316\u4ea4\u6613\u4e2d\uff0c\u9700\u8981\u9891\u7e41\u7684\u5bf9\u884c\u60c5\u6570\u636e\u505a\u65f6\u95f4\u5e8f\u5217\u548c\u622a\u9762\u7684\u8ba1\u7b97\uff0cduckdb\u5bf9\u6b64\u6709\u6bd4\u8f83\u597d\u7684\u652f\u6301\u3002\u57fa\u672c\u4e0apandas\u80fd\u591f\u505a\u7684\uff0cduckdb\u90fd\u53ef\u4ee5\u505a\uff0c\u800c\u4e14duckdb\u7684\u6027\u80fd\u66f4\u9ad8\r\n![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/data_query.png)\r\n\r\n### \u4e8c\u3001\u7b56\u7565\u6a21\u5757\r\n#### 2.1 \u5df2\u652f\u6301\u7684\u5185\u7f6e\u7b56\u7565\r\n| \u7b56\u7565\u540d\u79f0 | \u7b56\u7565\u8bf4\u660e | \u9002\u7528\u573a\u666f |\r\n|---------|---------|----------|\r\n| \u76ee\u6807\u6743\u91cd\u7b56\u7565 | \u6839\u636e\u9884\u8bbe\u7684\u76ee\u6807\u6743\u91cd\u5b9a\u671f\u8c03\u4ed3\uff0c\u662f\u6700\u57fa\u7840\u7684\u8d44\u4ea7\u914d\u7f6e\u7b56\u7565 | \u9002\u7528\u4e8e\u6709\u660e\u786e\u8d44\u4ea7\u914d\u7f6e\u76ee\u6807\u7684\u573a\u666f\uff0c\u598260/40\u7b56\u7565\u3001\u98ce\u9669\u7b49\u7ea7\u914d\u7f6e\u7b49 |\r\n| \u98ce\u9669\u5e73\u4ef7\u7b56\u7565 | \u901a\u8fc7\u8ba1\u7b97\u8d44\u4ea7\u7684\u98ce\u9669\u8d21\u732e\uff0c\u4f7f\u5404\u8d44\u4ea7\u7684\u98ce\u9669\u8d21\u732e\u76f8\u7b49\uff0c\u5b9e\u73b0\u98ce\u9669\u7684\u5e73\u8861\u914d\u7f6e | \u9002\u7528\u4e8e\u8ffd\u6c42\u98ce\u9669\u5e73\u8861\u3001\u7a33\u5065\u6536\u76ca\u7684\u573a\u666f\uff0c\u7279\u522b\u662f\u5728\u5e02\u573a\u6ce2\u52a8\u8f83\u5927\u65f6\u671f |\r\n\r\n##### 2.1.1 \u76ee\u6807\u6743\u91cd\u7b56\u7565\r\n![\u76ee\u6807\u6743\u91cd\u7b56\u7565](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/target_weight_strategy.png)\r\n![\u76ee\u6807\u6743\u91cd\u7b56\u7565](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/target_weight_strategy_result.png)\r\n\r\n##### 2.1.2 \u98ce\u9669\u5e73\u4ef7\u7b56\u7565\r\n![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/risk_parity_strategy.png)\r\n\r\n#### 2.2 \u6211\u7684\u7b56\u7565\r\n\u7b56\u7565\u56de\u6d4b\u5b8c\u6210\u4e4b\u540e\uff0c\u53ef\u4ee5\u4fdd\u5b58\u5230\u201c\u6211\u7684\u7b56\u7565\u201d\r\n![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/save_strategy.png)\r\n\r\n\u8fdb\u5165\u201c\u6211\u7684\u7b56\u7565\u201d\uff0c\u53ef\u4ee5\u67e5\u770b\u4fdd\u5b58\u7684\u7b56\u7565\u5217\u8868\r\n![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/my_strategies.png)\r\n\r\n\u9009\u4e2d\u67d0\u4e2a\u7b56\u7565\uff0c\u5e76\u70b9\u51fb\u201c\u67e5\u770b\u201d\uff0c\u53ef\u4ee5\u67e5\u770b\u7b56\u7565\u7684\u6536\u76ca\u7ee9\u6548\u3002\u84dd\u8272\u90e8\u5206\u662f\u56de\u6d4b\u6536\u76ca\u66f2\u7ebf\uff0c\u7ea2\u8272\u90e8\u5206\u662f\u56de\u6d4b\u4e4b\u540e\u65f6\u95f4\u6bb5\u7684\u6536\u76ca\u66f2\u7ebf\u3002\u901a\u8fc7\u89c2\u5bdf\u7ea2\u7ebf\uff0c\u53ef\u4ee5\u4e86\u89e3\u7b56\u7565\u4ecd\u7136\u6709\u6548\r\n![alt text](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/my_strategies_backtest.png)\r\n\r\n## SDK\u4f7f\u7528\u8bf4\u660e\r\n\r\n### \u83b7\u53d6\u6570\u636e\r\n\r\n```python\r\nfrom tgtrader.data import DataGetter\r\nfrom tgtrader.common import PriceAdjust, Period, SecurityType\r\n\r\nsymbols = [\r\n '511260', # \u5341\u5e74\u56fd\u503aETF\r\n '159915', # \u521b\u4e1a\u677fETF\r\n '510500', # 500ETF\r\n '159919', # \u6caa\u6df1300ETF\r\n '510880', # \u7ea2\u5229ETF\r\n '518880', # \u9ec4\u91d1ETF\r\n '513100', # \u7eb3\u6307ETF\r\n]\r\n\r\n\r\ndata_getter = DataGetter()\r\ndf = data_getter.get_price(symbols, \r\n \"2010-01-01\", \r\n \"2024-11-30\", \r\n period=Period.Day, \r\n fields=[\"open\",\"close\",\"high\",\"low\",\"volume\"], \r\n security_type=SecurityType.ETF,\r\n adjust=PriceAdjust.HFQ)\r\ndf\r\n``` \r\n\r\n| \u53c2\u6570 | \u7c7b\u578b | \u8bf4\u660e | \u793a\u4f8b\u503c |\r\n|------|------|------|---------|\r\n| symbols | List[str] | \u8bc1\u5238\u4ee3\u7801\u5217\u8868 | ['511260', '159915'] |\r\n| start_date | str | \u5f00\u59cb\u65e5\u671f\uff0c\u683c\u5f0f\u4e3aYYYY-MM-DD | '2010-01-01' |\r\n| end_date | str | \u7ed3\u675f\u65e5\u671f\uff0c\u683c\u5f0f\u4e3aYYYY-MM-DD | '2024-11-30' |\r\n| period | Period | \u6570\u636e\u5468\u671f\uff0c\u53ef\u9009\u503c\uff1aDay(\u65e5\u7ebf)\u3001Week(\u5468\u7ebf)\u3001Month(\u6708\u7ebf) | Period.Day |\r\n| fields | List[str] | \u9700\u8981\u83b7\u53d6\u7684\u5b57\u6bb5\uff0c\u53ef\u9009\u503c\uff1aopen\u3001close\u3001high\u3001low\u3001volume | ['open', 'close'] |\r\n| security_type | SecurityType | \u8bc1\u5238\u7c7b\u578b\uff0c\u53ef\u9009\u503c\uff1aETF\u3001Stock | SecurityType.ETF |\r\n| adjust | PriceAdjust | \u4ef7\u683c\u590d\u6743\u65b9\u5f0f\uff0c\u53ef\u9009\u503c\uff1aNone(\u4e0d\u590d\u6743)\u3001QFQ(\u524d\u590d\u6743)\u3001HFQ(\u540e\u590d\u6743) | PriceAdjust.HFQ |\r\n\r\n\r\n![get_data](https://raw.githubusercontent.com/smartian1/tgtrader/main/tgtrader/images/get_data.png)\r\n\r\n## \u5fae\u4fe1\u516c\u4f17\u53f7\uff1a \u5929\u5de5\u91cf\u5316\r\n**\u5173\u6ce8\u5373\u53ef\u83b7\u53d6**\uff1a\r\n1. tgtrader\u7684\u6700\u4f73\u5b9e\u8df5\uff1a\u5982\u4f55\u7528\u597dtgtrader\u4ee5\u63d0\u9ad8\u6295\u7814\u6548\u7387\r\n2. \u7814\u62a5\u590d\u73b0\uff1a\u5404\u5927\u5238\u5546\u7814\u62a5\u590d\u73b0\uff0c\u6e90\u7801\u516c\u5f00\r\n3. \u7b56\u7565\u5206\u4eab\uff1a\u57fa\u4e8etg\u91cf\u5316\u5de5\u5177\u96c6\uff0c\u5b9e\u73b0\u5404\u7c7b\u7b56\u7565\r\n4. \u5b9e\u76d8\u8ddf\u8e2a\uff1a\u5df2\u4e0a\u7ebf\u7684\u5b9e\u76d8\u7b56\u7565\u6301\u7eed\u8ddf\u8fdb\r\n",
"bugtrack_url": null,
"license": "MPL-2.0",
"summary": "TianGong Quantitative Investment Research Analysis Client",
"version": "1.0.1",
"project_urls": {
"Homepage": "https://github.com/smartian1/tgtrader"
},
"split_keywords": [
"quantitative",
" trading",
" investment",
" analysis"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "e02df1a1e51591059dad00f1b7078dadd74fa66bff1755755ecaca732854ea08",
"md5": "d8fdd7443a66300e44186725cfb237a7",
"sha256": "25f70019b2ea8136281db7d486c42529ddeae2e393a25438cea47264c20cfc27"
},
"downloads": -1,
"filename": "tgtrader-1.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "d8fdd7443a66300e44186725cfb237a7",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 1099485,
"upload_time": "2025-01-05T14:13:06",
"upload_time_iso_8601": "2025-01-05T14:13:06.434543Z",
"url": "https://files.pythonhosted.org/packages/e0/2d/f1a1e51591059dad00f1b7078dadd74fa66bff1755755ecaca732854ea08/tgtrader-1.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "09886fedaa9c69309ddde08c47655d2576c62740e8c4382cbe3d0e4e6e078aeb",
"md5": "3da4c0c5a8025dfa3a87c0f21844d2c4",
"sha256": "ffeaa6f840f72aba6d80d409fbf8680147b28bea79c1dcac1be1773b4184492e"
},
"downloads": -1,
"filename": "tgtrader-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "3da4c0c5a8025dfa3a87c0f21844d2c4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 1079669,
"upload_time": "2025-01-05T14:13:12",
"upload_time_iso_8601": "2025-01-05T14:13:12.071006Z",
"url": "https://files.pythonhosted.org/packages/09/88/6fedaa9c69309ddde08c47655d2576c62740e8c4382cbe3d0e4e6e078aeb/tgtrader-1.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-05 14:13:12",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "smartian1",
"github_project": "tgtrader",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "tgtrader"
}