def prepare_data(codes=['000300.SH', '399006.SZ'], start_time="20100101", end_time="20211231"):
df = load_data(codes, start_time, end_time)
df["rsi"] = ta.RSI(df.close, timeperiod=14)
df["to_buy"] = ""
df.loc[df["rsi"] <= 30, 'to_buy'] = True
df['to_buy'] = df['to_buy'].astype('bool')
df["to_sell"] = ""
df.loc[df["rsi"] >= 70, 'to_sell'] = True
df['to_sell'] = df['to_sell'].astype('bool')
return df
Pasul 2: Specificați o strategie
Regulile strategiei sunt foarte simple.
class SelectBySignal(object):
def init(self, signal_buy='to_buy', signal_sell='to_sell'):
super(SelectBySignal, self).init()
self.signal_buy = signal_buy
self.signal_sell = signal_sell
def __call__(self, context):
bar = context['bar'].copy()
acc = context['acc']
holding = acc.get_holding_instruments()
to_buy = list(bar[bar[self.signal_buy]].index)
to_sell = list(bar[bar[self.signal_sell]].index)
instruments = to_buy + holding
to_selected = []
for s in instruments:
if s not in to_sell:
to_selected.append(s)
context['selected'] = to_selected
n = len(to_selected)
if n > 0:
context['weights'] = {code:1/n for code in to_selected}
else:
context['weights'] = {}
return False
class Strategy:
def init(self, algo=None):
self.algo = algo
self.acc = Account()
def algo_processor(self, context):
if self.algo(context) is True: #如果algo返回True,直接不运行,本次不调仓
return None
return context['weights']
def onbar(self, index, date, df_bar):
self.acc.update_bar(date, df_bar)
weights = self.algo_processor({'index': index, 'bar':df_bar, 'date':date, 'acc':self.acc})
if weights is not None:
self.acc.adjust_weights(date, weights)
Pasul 3: Backtesting
Backtesting bazat pe datele și strategia de mai sus
class Backtest:
def init(self, df):
self.df = df
self.dates = self.df.index.unique()
self.observers = []
def onbar(self, index, date):
df_bar = self.df.loc[date]
if type(df_bar) is pd.Series:
df_bar = df_bar.to_frame().T
df_bar.index = df_bar['code']
self.strategy.onbar(index, date, df_bar)
def run(self, s):
self.strategy = s
for index, date in enumerate(self.dates):
self.onbar(index, date)
return self.get_results()
def get_results(self):
s = self.strategy
df = s.acc.get_results_df()
return df
Pasul 4: Analiza
Analizați performanța strategiei și comparați-o cu cea a indicelui CSI 300
def analysis(start, end, benchmarks=[]):
equities = []
for benchmark in benchmarks:
bench_df = load_from_file(benchmark)[start:end]
se = (bench_df['rate'] + 1).cumprod()
se.name = benchmark
equities.append(se)
path = os.path.dirname(__file__)
filename = os.path.dirname(path)+'/results/first_test.csv'
if os.path.exists(filename):
df = pd.read_csv(filename)
df['date'] = df['date'].apply(lambda x: str(x))
df.index = df['date']
se = (df['rate'] + 1).cumprod()
se.name = 'strategy'
equities.append(se)
df_equities = pd.concat(equities, axis=1)
df_equities.dropna(inplace=True)
print(df_equities)
from performance import PerformanceUtils
df_ratios, df_corr, df_years = PerformanceUtils().calc_equity(df_equity=df_equities)
return df_equities, df_ratios, df_corr, df_years
Rulați funcția principală
if name == 'main':
date_start = "20100101"
date_end = "20211231"
df = prepare_data(codes=['000300.SH', '399006.SZ'], start_time=date_start, end_time=date_end)
algo = SelectBySignal(signal_buy='to_buy', signal_sell='to_sell')
s = Strategy(algo=algo)
b = Backtest(df=df)
df = b.run(s)
path = os.path.dirname(__file__)
df.to_csv(os.path.dirname(path) + '/results/first_test.csv')
df_equities, df_ratios, df_corr, df_years = analysis(start=date_start, end=date_end, benchmarks=['000300.SH'])
display(df_ratios)
fig = plt.figure(figsize=(8, 6))
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)
df_equities.plot(ax=ax1)
if df_years is not None:
print(df_years)
df_years.T.plot(kind='bar', ax=ax2, use_index=True)
plt.show()
(2) Reducerea taxelor OKX
OKX este o platformă profesională de tranzacționare a monedelor digitale, apreciată de mulți utilizatori, iar taxele de tranzacționare pot fi reduse.
În funcție de volumul de tranzacții, OKX își împarte utilizatorii în două niveluri: normal și profesional. Utilizatorii obișnuiți sunt clasificați în funcție de pozițiile lor OKB, în timp ce utilizatorii profesioniști sunt clasificați în funcție de volumul de tranzacționare și de mărimea activelor. Diferitele niveluri determină comisioanele de tranzacționare pentru următoarea zi de tranzacționare.
La calcularea nivelurilor de taxe, dacă volumul de tranzacționare a monedelor, volumul total de tranzacționare a contractelor de livrare și perpetue (contract de livrare USDT, contract de livrare bazat pe monede, contract perpetuu USDT, contract perpetuu bazat pe monede), volumul de tranzacționare a contractelor de opțiuni și volumul de active îndeplinesc condițiile diferitelor niveluri de taxe, utilizatorii vor beneficia de reducerea de taxe de cel mai înalt nivel.
Prima metodă: OKX are o rată maximă oficială de economisire de 20%. Utilizați link-ul de mai jos pentru a vă înregistra cu OKX și pentru a economisi 20% din taxe.
https://www.ouyi.business/join/BTC1ETH
A doua metodă: Deschideți site-ul OKX și introduceți "BTC1ETH" în "Codul de invitație" de pe pagina de înregistrare pentru a vedea procentul de cashback: 20% în partea de jos.
Asigurați-vă că introduceți acest cod de invitație, altfel nu puteți obține un procent de 20% cashback.
(3) Reducerea taxelor FTX
FTX este în prezent un foarte rapid în creștere, jucătorii de contract mai mult de schimb, trebuie să vă înregistrați FTX dacă jucați contractul. dacă doriți să reduceți taxele de tranzacționare FTX, trebuie să utilizați următorul link de invitație pentru a vă înregistra.
https://ftx.com/referrals#a=121031692
3, drumul de tranzacționare este lung, împreună cu înaintarea
Doriți să aflați mai multe despre cum să reduceți comisionul?
telegramă: btcethcool
Am înființat o comunitate dedicată studiului de tranzacționare, adăugați prieteni pe telegramă pentru a vă atrage în comunitate.