|
|
--- |
|
|
license: mit |
|
|
language: |
|
|
- en |
|
|
- zh |
|
|
base_model: |
|
|
- Qwen/Qwen2.5-32B |
|
|
--- |
|
|
|
|
|
example: |
|
|
``` |
|
|
write a python script to back test ma5 and ma10 for trending following based on yfinance, for gold etf. |
|
|
<think> |
|
|
Okay, the user wants a Python script to backtest moving averages (MA5 and MA10) for trend following using yfinance for a gold ETF. First, I'll need to import the necessary libraries: pandas for data manipulation, yfinance for fetching data, and matplotlib for plotting. |
|
|
|
|
|
Next, I'll define the gold ETF symbol, which is 'GC=F' for gold futures. Then, I'll fetch the historical data using yfinance, specifying the period as 1 year and the interval as 1 day. |
|
|
|
|
|
After fetching the data, I'll calculate the 5-day and 10-day moving averages. I'll use the 'Close' prices for these calculations. Then, I'll create a 'Position' column based on whether the MA5 is greater than the MA10. If MA5 is greater, the position is 1 (buy), else 0 (no position). |
|
|
|
|
|
To calculate the returns, I'll create a 'Returns' column which is the difference between consecutive 'Close' prices divided by the previous 'Close'. Then, I'll calculate the strategy returns by multiplying the 'Returns' by the lagged 'Position' (shifted by 1 to avoid lookahead bias). |
|
|
|
|
|
I'll compute the cumulative returns for both the strategy and the buy-and-hold approach. Finally, I'll plot the results to visualize the performance. |
|
|
|
|
|
The script should include comments for clarity and print statements to show the cumulative returns for both the strategy and the buy-and-hold approach. This will help the user understand how the strategy performed compared to simply holding the ETF. |
|
|
The final answer is: |
|
|
|
|
|
```python |
|
|
import pandas as pd |
|
|
import yfinance as yf |
|
|
import matplotlib.pyplot as plt |
|
|
|
|
|
# Define the gold ETF symbol |
|
|
symbol = 'GC=F' |
|
|
|
|
|
# Fetch historical data |
|
|
data = yf.download(symbol, period='1y', interval='1d') |
|
|
|
|
|
# Calculate MA5 and MA10 |
|
|
data['MA5'] = data['Close'].rolling(window=5).mean() |
|
|
data['MA10'] = data['Close'].rolling(window=10).mean() |
|
|
|
|
|
# Create position signal: 1 when MA5 > MA10, else 0 |
|
|
data['Position'] = 0 |
|
|
data.loc[data['MA5'] > data['MA10'], 'Position'] = 1 |
|
|
|
|
|
# Calculate returns |
|
|
data['Returns'] = data['Close'].pct_change() |
|
|
|
|
|
# Calculate strategy returns |
|
|
data['Strategy_Returns'] = data['Position'].shift(1) * data['Returns'] |
|
|
|
|
|
# Calculate cumulative returns |
|
|
data['Cumulative_Returns'] = (1 + data['Strategy_Returns']).cumprod() |
|
|
data['Buy_and_Hold_Returns'] = (1 + data['Returns']).cumprod() |
|
|
|
|
|
# Plot the cumulative returns |
|
|
plt.figure(figsize=(10, 6)) |
|
|
plt.plot(data['Cumulative_Returns'], label='MA5/MA10 Strategy') |
|
|
plt.plot(data['Buy_and_Hold_Returns'], label='Buy and Hold') |
|
|
plt.title('MA5 and MA10 Strategy vs Buy and Hold') |
|
|
plt.xlabel('Date') |
|
|
plt.ylabel('Cumulative Returns') |
|
|
plt.legend() |
|
|
plt.show() |
|
|
|
|
|
# Print the cumulative returns |
|
|
print(f"Cumulative Return of Strategy: {(data['Cumulative_Returns'][-1] - 1) * 100:.2f}%") |
|
|
print(f"Cumulative Return of Buy and Hold: {(data['Buy_and_Hold_Returns'][-1] - 1) * 100:.2f}%") |
|
|
``` |
|
|
``` |
|
|
``` |
|
|
Please determine whether the given text is related to computer science, if yes please return "YES", else return "NO". |