全盛隆发货跟单系统's Archiver

admin 发表于 2025-3-17 11:14

量化代码

[color=#8c8c8c][i]"""
[/i][/color][color=#8c8c8c][i]Created on Wed Jun 23 14:11:52 2021
[/i][/color][color=#8c8c8c][i]#[/i][/color][color=#8c8c8c][i]策略为:[/i][/color][color=#8c8c8c][i]5[/i][/color][color=#8c8c8c][i]日突破[/i][/color][color=#8c8c8c][i]50[/i][/color][color=#8c8c8c][i]日做多,直到死叉卖出[/i][/color]
[color=#8c8c8c][i]"""
[/i][/color][color=#8c8c8c][i]# ID[/i][/color][color=#8c8c8c][i]:[/i][/color][color=#8c8c8c][i]451309
[/i][/color][color=#0033b3]import [/color]tushare [color=#0033b3]as [/color]ts
[color=#0033b3]import [/color]pandas [color=#0033b3]as [/color]pd
[color=#0033b3]import [/color]numpy [color=#0033b3]as [/color]np
[color=#0033b3]import [/color]matplotlib.pyplot [color=#0033b3]as [/color]plt

plt.rcParams[[color=#008080][b]'figure.dpi'[/b][/color]] = [color=#1750eb]300  [/color][color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]分辨率
[/i][/color]
mytoken = [color=#008080][b]"2be9322682f222cada16f8ae706433204203633d78c08372156a08ee"
[/b][/color]ts.set_token(mytoken)
pro = ts.pro_api()  [color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]初始化接口
[/i][/color]
data = ts.pro_bar([color=#660099]ts_code[/color]=[color=#008080][b]'000001.SZ'[/b][/color], [color=#660099]adj[/color]=[color=#008080][b]'qfq'[/b][/color], [color=#660099]start_date[/color]=[color=#008080][b]'2016-05-01'[/b][/color], [color=#660099]end_date[/color]=[color=#008080][b]'2021-05-01'[/b][/color])
[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]处理数据
[/i][/color]data = data.loc[:, [[color=#008080][b]'trade_date'[/b][/color], [color=#008080][b]'close'[/b][/color]]]
[color=#8c8c8c][i]# sort_values[/i][/color][color=#8c8c8c][i]()[/i][/color][color=#8c8c8c][i]by[/i][/color][color=#8c8c8c][i]依照某个字段中的数据进行排序,[/i][/color][color=#8c8c8c][i]inplace [/i][/color][color=#8c8c8c][i]是否用排序后的数据集替换原来的数据,默认为[/i][/color][color=#8c8c8c][i]False[/i][/color][color=#8c8c8c][i],即不替换
[/i][/color]data.sort_values([color=#660099]by[/color]=[color=#008080][b]"trade_date"[/b][/color], [color=#660099]inplace[/color]=[color=#0033b3]True[/color])

[color=#8c8c8c][i]# to_datetime()[/i][/color][color=#8c8c8c][i]将给定的数据按照指定格式转换成日期格式
[/i][/color]data[[color=#008080][b]"trade_date"[/b][/color]] = pd.to_datetime(data[[color=#008080][b]"trade_date"[/b][/color]])
[color=#8c8c8c][i]# reset_index()[/i][/color][color=#8c8c8c][i]重置数据帧的索引
[/i][/color]data.reset_index([color=#660099]inplace[/color]=[color=#0033b3]True[/color], [color=#660099]drop[/color]=[color=#0033b3]True[/color])

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]求每日收益率
[/i][/color]data[[color=#008080][b]'dayreturn'[/b][/color]] = data[[color=#008080][b]'close'[/b][/color]].pct_change()

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]用[/i][/color][color=#8c8c8c][i]0[/i][/color][color=#8c8c8c][i]填补缺失值[/i][/color][color=#8c8c8c][i]NA
[/i][/color]data[[color=#008080][b]'dayreturn'[/b][/color]].fillna([color=#1750eb]0[/color], [color=#660099]inplace[/color]=[color=#0033b3]True[/color])

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]计算累积日收益率
[/i][/color]data[[color=#008080][b]'cum_daily_return'[/b][/color]] = ([color=#1750eb]1 [/color]+ data[[color=#008080][b]'dayreturn'[/b][/color]]).cumprod() - [color=#1750eb]1
[/color]
[color=#8c8c8c][i]####################################################################
[/i][/color][color=#8c8c8c][i]### [/i][/color][color=#8c8c8c][i]沪深[/i][/color][color=#8c8c8c][i]300[/i][/color][color=#8c8c8c][i]的收益率计算,作为市场的基准收益率
[/i][/color]hs300 = pro.index_daily([color=#660099]ts_code[/color]=[color=#008080][b]'000300.SH'[/b][/color], [color=#660099]start_date[/color]=[color=#008080][b]'20160501'[/b][/color], [color=#660099]end_date[/color]=[color=#008080][b]'20210501'[/b][/color])

hs300 = hs300.loc[:, [[color=#008080][b]'trade_date'[/b][/color], [color=#008080][b]'close'[/b][/color]]]

hs300.sort_values([color=#660099]by[/color]=[color=#008080][b]"trade_date"[/b][/color], [color=#660099]inplace[/color]=[color=#0033b3]True[/color])

hs300[[color=#008080][b]"trade_date"[/b][/color]] = pd.to_datetime(hs300[[color=#008080][b]"trade_date"[/b][/color]])

[color=#8c8c8c][i]# reset_index()[/i][/color][color=#8c8c8c][i]重置数据帧的索引
[/i][/color]hs300.reset_index([color=#660099]inplace[/color]=[color=#0033b3]True[/color], [color=#660099]drop[/color]=[color=#0033b3]True[/color])

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]求每日收益率
[/i][/color]hs300[[color=#008080][b]'dayreturn'[/b][/color]] = hs300[[color=#008080][b]'close'[/b][/color]].pct_change()
[color=#8c8c8c][i]# hs300['dayreturn'] = dailyreturn #[/i][/color][color=#8c8c8c][i]添加[/i][/color][color=#8c8c8c][i]dr[/i][/color][color=#8c8c8c][i]列
[/i][/color]
[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]用[/i][/color][color=#8c8c8c][i]0[/i][/color][color=#8c8c8c][i]填补缺失值[/i][/color][color=#8c8c8c][i]NA
[/i][/color]hs300[[color=#008080][b]'dayreturn'[/b][/color]].fillna([color=#1750eb]0[/color], [color=#660099]inplace[/color]=[color=#0033b3]True[/color])

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]计算累积日收益率
[/i][/color]hs300[[color=#008080][b]'cum_daily_return'[/b][/color]] = ([color=#1750eb]1 [/color]+ hs300[[color=#008080][b]'dayreturn'[/b][/color]]).cumprod() - [color=#1750eb]1
[/color]
[color=#8c8c8c][i]# #[/i][/color][color=#8c8c8c][i]绘制累积日收益率曲线
[/i][/color][color=#8c8c8c][i]# hs300['cum_daily_return'].plot(figsize=(12,8))
[/i][/color][color=#8c8c8c][i]##############################################################
[/i][/color]
[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]使用[/i][/color][color=#8c8c8c][i] rolling() [/i][/color][color=#8c8c8c][i]函数,简化操作
[/i][/color]data[[color=#008080][b]"ma5"[/b][/color]] = data[[color=#008080][b]"close"[/b][/color]].rolling([color=#1750eb]5[/color]).mean()
data[[color=#008080][b]"ma50"[/b][/color]] = data[[color=#008080][b]"close"[/b][/color]].rolling([color=#1750eb]50[/color]).mean()

data[[[color=#008080][b]'ma5'[/b][/color], [color=#008080][b]'ma50'[/b][/color]]].plot([color=#660099]grid[/color]=[color=#0033b3]True[/color], [color=#660099]figsize[/color]=([color=#1750eb]18[/color], [color=#1750eb]15[/color]))
plt.show()

[color=#8c8c8c][i]# CASH[/i][/color][color=#8c8c8c][i]:现金[/i][/color][color=#8c8c8c][i]   STOCKHOLD [/i][/color][color=#8c8c8c][i]持有的股票
[/i][/color]CASH = [color=#1750eb]100000
[/color]STOCKHOLD = [color=#1750eb]0
[/color]
[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]提取[/i][/color][color=#8c8c8c][i]index[/i][/color][color=#8c8c8c][i]为[/i][/color][color=#8c8c8c][i]0,[/i][/color][color=#8c8c8c][i]列名为[/i][/color][color=#8c8c8c][i]'cash'[/i][/color][color=#8c8c8c][i]中的数据赋值
[/i][/color]data.loc[[color=#1750eb]0[/color], [color=#008080][b]"cash"[/b][/color]] = CASH
data.loc[[color=#1750eb]0[/color], [color=#008080][b]"stock_hold"[/b][/color]] = STOCKHOLD

data.loc[[color=#1750eb]1[/color], [color=#008080][b]"cash"[/b][/color]] = CASH
data.loc[[color=#1750eb]1[/color], [color=#008080][b]"stock_hold"[/b][/color]] = STOCKHOLD

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]第一天不操作,最后一天不买入
[/i][/color][color=#0033b3]for [/color]i [color=#0033b3]in [/color][color=#000080]range[/color]([color=#1750eb]1[/color], [color=#000080]len[/color](data) - [color=#1750eb]1[/color]):
    [color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]短期均线 向上 穿过长期均线,金叉。同时手里有现金可用
[/i][/color]
[color=#0033b3]if [/color]data.loc[i, [color=#008080][b]"ma5"[/b][/color]] > data.loc[i, [color=#008080][b]"ma50"[/b][/color]] [color=#0033b3]and [/color]data.loc[i - [color=#1750eb]1[/color], [color=#008080][b]"ma5"[/b][/color]] < data.loc[i - [color=#1750eb]1[/color], [color=#008080][b]"ma50"[/b][/color]] [color=#0033b3]and [/color]data.loc[
        i, [color=#008080][b]"cash"[/b][/color]] > [color=#1750eb]0[/color]:
        stock_temp = data.loc[i, [color=#008080][b]"cash"[/b][/color]] // ([color=#1750eb]100 [/color]* data.loc[i + [color=#1750eb]1[/color], [color=#008080][b]"close"[/b][/color]]) * [color=#1750eb]100
[/color]
data.loc[i + [color=#1750eb]1[/color], [color=#008080][b]"stock_hold"[/b][/color]] = data.loc[i, [color=#008080][b]"stock_hold"[/b][/color]] + stock_temp
        data.loc[i + [color=#1750eb]1[/color], [color=#008080][b]"cash"[/b][/color]] = data.loc[i, [color=#008080][b]"cash"[/b][/color]] - stock_temp * data.loc[i + [color=#1750eb]1[/color], [color=#008080][b]"close"[/b][/color]]
        [color=#0033b3]continue
[/color]

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]短期均线 向下 穿过长期均线,死叉。同时手里有股票可卖
[/i][/color]
[color=#0033b3]if [/color]data.loc[i, [color=#008080][b]"ma5"[/b][/color]] < data.loc[i, [color=#008080][b]"ma50"[/b][/color]] [color=#0033b3]and [/color]data.loc[i - [color=#1750eb]1[/color], [color=#008080][b]"ma5"[/b][/color]] > data.loc[i - [color=#1750eb]1[/color], [color=#008080][b]"ma50"[/b][/color]] [color=#0033b3]and [/color]data.loc[
        i, [color=#008080][b]"stock_hold"[/b][/color]] > [color=#1750eb]0[/color]:
        data.loc[i + [color=#1750eb]1[/color], [color=#008080][b]"stock_hold"[/b][/color]] = [color=#1750eb]0
[/color]
data.loc[i + [color=#1750eb]1[/color], [color=#008080][b]"cash"[/b][/color]] = data.loc[i, [color=#008080][b]"cash"[/b][/color]] + data.loc[i, [color=#008080][b]"stock_hold"[/b][/color]] * data.loc[i + [color=#1750eb]1[/color], [color=#008080][b]"close"[/b][/color]]
        [color=#0033b3]continue
[/color]

data.loc[i + [color=#1750eb]1[/color], [color=#008080][b]"stock_hold"[/b][/color]] = data.loc[i, [color=#008080][b]"stock_hold"[/b][/color]]
    data.loc[i + [color=#1750eb]1[/color], [color=#008080][b]"cash"[/b][/color]] = data.loc[i, [color=#008080][b]"cash"[/b][/color]]

[color=#8c8c8c][i]# equity [/i][/color][color=#8c8c8c][i]资产净值
[/i][/color]data[[color=#008080][b]"equity"[/b][/color]] = data[[color=#008080][b]"stock_hold"[/b][/color]] * data[[color=#008080][b]"close"[/b][/color]] + data[[color=#008080][b]"cash"[/b][/color]]

data[[color=#008080][b]"honding_income"[/b][/color]] = data[[color=#008080][b]"equity"[/b][/color]] - CASH

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]持有收益
[/i][/color]honding_income = [color=#000080]round[/color](data[[color=#008080][b]"honding_income"[/b][/color]].iloc[-[color=#1750eb]1[/color]], [color=#1750eb]2[/color])
[color=#000080]print[/color]([color=#008080][b]"[/b][/color][color=#0037a6]\n[/color][color=#008080][b]持有收益[/b][/color][color=#008080][b]  :"[/b][/color], honding_income)  [color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]保留两位小数
[/i][/color]
[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]收益率
[/i][/color][color=#000080]print[/color]([color=#008080][b]"[/b][/color][color=#008080][b]收益率[/b][/color][color=#008080][b]    :"[/b][/color], ([color=#000080]round[/color](honding_income / CASH * [color=#1750eb]100[/color], [color=#1750eb]2[/color])), [color=#008080][b]"%"[/b][/color])  [color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]保留两位小数
[/i][/color]
[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]基准收益率
[/i][/color][color=#000080]print[/color]([color=#008080][b]"[/b][/color][color=#008080][b]基准收益率[/b][/color][color=#008080][b]:"[/b][/color], ([color=#000080]round[/color](hs300[[color=#008080][b]'cum_daily_return'[/b][/color]].iloc[-[color=#1750eb]1[/color]] * [color=#1750eb]100[/color], [color=#1750eb]2[/color])), [color=#008080][b]"%"[/b][/color])

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]股票涨幅
[/i][/color][color=#8c8c8c][i]# print("[/i][/color][color=#8c8c8c][i]股票涨幅[/i][/color][color=#8c8c8c][i]:",(round(data["cum_daily_return"].iloc[-1]*100,2 ) ),"%")  #[/i][/color][color=#8c8c8c][i]保留两位小数
[/i][/color]

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]计算最大回撤率
[/i][/color][color=#8c8c8c][i]#
[/i][/color][color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]公式[/i][/color][color=#8c8c8c][i]di=max(1-[/i][/color][color=#8c8c8c][i]策略当日的价值[/i][/color][color=#8c8c8c][i] / [/i][/color][color=#8c8c8c][i]当日之前的最高价值[/i][/color][color=#8c8c8c][i])
[/i][/color][color=#8c8c8c][i]#
[/i][/color][color=#8c8c8c][i]# for i in range(1, len(data)):
[/i][/color][color=#8c8c8c][i]#     data.loc[i, "ddown_rate"]=(data["equity"].iloc[i]-data["equity"].iloc[i-1])/data["equity"].iloc[i]
[/i][/color]
[color=#8c8c8c][i]# for i in range(1, len(data)):
[/i][/color][color=#8c8c8c][i]#     data.loc[i, "ddown_rate"]=1 - data["equity"].iloc[i]/max(data["equity"].iloc[0:i])
[/i][/color]
[color=#8c8c8c][i]# #[/i][/color][color=#8c8c8c][i]第一个数据手动补上[/i][/color][color=#8c8c8c][i]0
[/i][/color][color=#8c8c8c][i]# data.loc[0, "ddown_rate"] = 0
[/i][/color][color=#8c8c8c][i]# #[/i][/color][color=#8c8c8c][i]找出最大值
[/i][/color][color=#8c8c8c][i]# Max_ddown_rate=max(data["ddown_rate"])
[/i][/color][color=#8c8c8c][i]# print("[/i][/color][color=#8c8c8c][i]最大回撤率[/i][/color][color=#8c8c8c][i]:",(round(Max_ddown_rate*100,2 )),"%")
[/i][/color]
[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]计算夏普率:反映了单位风险基金净值增长率超过无风险收益率的程度。
[/i][/color][color=#8c8c8c][i]# SharpeRatio=[ E(Rp)[/i][/color][color=#8c8c8c][i]-[/i][/color][color=#8c8c8c][i]Rf ] / [/i][/color][color=#8c8c8c][i]σ[/i][/color][color=#8c8c8c][i]p
[/i][/color][color=#8c8c8c][i]# E(Rp)[/i][/color][color=#8c8c8c][i]:变量名[/i][/color][color=#8c8c8c][i]E_Rp[/i][/color][color=#8c8c8c][i]:投资组合预期报酬率(平均回报率)
[/i][/color][color=#8c8c8c][i]# Rf[/i][/color][color=#8c8c8c][i]: 无风险利率(通常用国债利率来代替)[/i][/color][color=#8c8c8c][i]  Rf/ 252 [/i][/color][color=#8c8c8c][i]对应日无风险利益
[/i][/color][color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]σ[/i][/color][color=#8c8c8c][i]p[/i][/color][color=#8c8c8c][i]:投资的标准差
[/i][/color][color=#8c8c8c][i]##[/i][/color][color=#8c8c8c][i]默认[/i][/color][color=#8c8c8c][i]252[/i][/color][color=#8c8c8c][i]个工作日[/i][/color][color=#8c8c8c][i],[/i][/color][color=#8c8c8c][i]无风险利率[/i][/color][color=#8c8c8c][i] RF[/i][/color][color=#8c8c8c][i]为[/i][/color][color=#8c8c8c][i] 0.05
[/i][/color][color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]日夏普[/i][/color][color=#8c8c8c][i],[/i][/color][color=#8c8c8c][i]波动率要乘以[/i][/color][color=#8c8c8c][i]sqrt(252)
[/i][/color]return_sr = data[[color=#008080][b]"equity"[/b][/color]] / data[[color=#008080][b]"equity"[/b][/color]].shift([color=#1750eb]1[/color]) - [color=#1750eb]1
[/color]RF = [color=#1750eb]0.05
[/color]E_Rp = np.mean(return_sr)
σp = np.std(return_sr)
sharpe = (E_Rp - RF / [color=#1750eb]252[/color]) / σp * np.sqrt([color=#1750eb]252[/color])
[color=#000080]print[/color]([color=#008080][b]"[/b][/color][color=#008080][b]夏普率[/b][/color][color=#008080][b]    :"[/b][/color], [color=#000080]round[/color](sharpe, [color=#1750eb]2[/color]))

[color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]年化收益率[/i][/color][color=#8c8c8c][i]=[[/i][/color][color=#8c8c8c][i](投资内收益[/i][/color][color=#8c8c8c][i] / [/i][/color][color=#8c8c8c][i]本金)[/i][/color][color=#8c8c8c][i]/ [/i][/color][color=#8c8c8c][i]投资天数[/i][/color][color=#8c8c8c][i]] * 365 ×100%
[/i][/color]
Annual_rate_of_return = (honding_income / CASH) / [color=#1750eb]5 [/color]/ [color=#1750eb]252 [/color]* [color=#1750eb]365
[/color][color=#000080]print[/color]([color=#008080][b]"[/b][/color][color=#008080][b]年化收益率[/b][/color][color=#008080][b]:"[/b][/color], [color=#000080]round[/color](Annual_rate_of_return * [color=#1750eb]100[/color], [color=#1750eb]2[/color]), [color=#008080][b]'%'[/b][/color])  [color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]保留两位小数
[/i][/color]
[color=#8c8c8c][i]#####################################
[/i][/color][color=#8c8c8c][i]##########   [/i][/color][color=#8c8c8c][i]绘图[/i][/color][color=#8c8c8c][i]    ################
[/i][/color]
data[[[color=#008080][b]'close'[/b][/color]]].plot([color=#660099]grid[/color]=[color=#0033b3]True[/color], [color=#660099]figsize[/color]=([color=#1750eb]18[/color], [color=#1750eb]15[/color]))
plt.show()

x = data[[color=#008080][b]"trade_date"[/b][/color]]
y = data[[color=#008080][b]"honding_income"[/b][/color]] / CASH
plt.plot(x, y, [color=#660099]ls[/color]=[color=#008080][b]'-'[/b][/color], [color=#660099]lw[/color]=[color=#1750eb]0.5[/color], [color=#660099]label[/color]=[color=#008080][b]'cum_strategy_returns'[/b][/color], [color=#660099]color[/color]=[color=#008080][b]'r'[/b][/color])

x = data[[color=#008080][b]"trade_date"[/b][/color]]
y = hs300[[color=#008080][b]'cum_daily_return'[/b][/color]]
plt.plot(x, y, [color=#660099]ls[/color]=[color=#008080][b]'-'[/b][/color], [color=#660099]lw[/color]=[color=#1750eb]0.5[/color], [color=#660099]label[/color]=[color=#008080][b]'cum_market_returns'[/b][/color], [color=#660099]color[/color]=[color=#008080][b]'g'[/b][/color])
plt.grid()  [color=#8c8c8c][i]# [/i][/color][color=#8c8c8c][i]显示网格
[/i][/color]
plt.legend()
plt.xlabel([color=#008080][b]'Date'[/b][/color])
plt.ylabel([color=#008080][b]'Return'[/b][/color])

plt.show()

页: [1]

Powered by Discuz! X1.5 Archiver   © 2001-2010 Comsenz Inc.